首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于方向变化的形状调整动画

基于方向变化的形状调整动画
EN

Stack Overflow用户
提问于 2022-07-11 06:10:58
回答 2查看 54关注 0票数 0

我有一个问题,阴影形状没有动画在同一时间的光盘。

这是相应的代码。您可以通过更改方向在iPad上测试这一点。这是ContentView的直接后果。删除GeometryReader并使用固定的框架修复它。

代码语言:javascript
运行
复制
import SwiftUI

struct ContentView: View {
    var body: some View {
        GeometryReader { geometry in
            ZStack {
                PlanetView()
                    .frame(width: geometry.size.width * 0.25, height: geometry.size.width * 0.25)
            }
            .frame(maxWidth: .infinity, maxHeight: .infinity)
        }
    }
}

struct PlanetView: View {
    var body: some View {
        GeometryReader { geometry in
            ZStack {
                Circle()
                    .fill(.blue)

                Circle()
                    .foregroundColor(.green)
                    .overlay(PlanetShadowView())
                    .frame(width: geometry.size.width * 0.8, height: geometry.size.width * 0.8)
            }
        }
    }
}

struct PlanetShadowView: View {
    var offsetRatio: CGFloat = 15/100.0
    
    func control1(_ size: CGSize) -> CGPoint {
        let xOffset = offsetRatio * size.width
        let yOffset = offsetRatio * size.height
        return .init(x: xOffset, y: size.height - yOffset)
    }

    func control2(_ size: CGSize) -> CGPoint {
        let xOffset = offsetRatio * size.width
        let yOffset = offsetRatio * size.height
        return .init(x: size.width - xOffset, y: size.height - yOffset)
    }
    
    var body: some View {
        GeometryReader { geometry in
            Path { path in
                path.move(to: CGPoint(x: 0, y: geometry.size.height / 2))
                path.addCurve(to: CGPoint(x: geometry.size.width, y: geometry.size.height / 2),
                              control1: control1(geometry.size),
                              control2: control2(geometry.size))
                path.addArc(center: CGPoint(x: geometry.size.width / 2, y: geometry.size.height / 2),
                            radius: geometry.size.width / 2,
                            startAngle: Angle(degrees: 0),
                            endAngle: Angle(degrees: 180),
                            clockwise: false)
                path.closeSubpath()
            }
            .fill(Color.black.opacity(0.25))
            .rotationEffect(.degrees(-30))
        }
    }
}

struct PlanetView_Previews: PreviewProvider {
    static var previews: some View {
        PlanetView()
    }
}
EN

回答 2

Stack Overflow用户

发布于 2022-07-11 06:50:09

解决这一问题的方法是将行星阴影作为形状,因此它将在与其他任何事物相同的GeometryReader转换上下文中呈现。

用Xcode 13.4 / iOS 15.5测试

代码语言:javascript
运行
复制
                Circle()
                    .foregroundColor(.green)
                    .overlay(
                        PlanetShadow()           // << here !!
                            .fill(Color.black.opacity(0.25))
                            .rotationEffect(.degrees(-30)))
                    .frame(width: geometry.size.width * 0.8, height: geometry.size.width * 0.8)
            }
        }
    }
}

struct PlanetShadow: Shape {             // << here !!
    var offsetRatio: CGFloat = 15/100.0

    func path(in rect: CGRect) -> Path {
       // calc here ...

基于GitHub的测试模块

票数 1
EN

Stack Overflow用户

发布于 2022-07-11 18:47:04

添加.drawingGroup()。这应该使构图在显示之前呈现为一个整体。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72934352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档