如何为通过 SwiftUI 中的自定义结构传递的 @State 值设置动画

Posted

技术标签:

【中文标题】如何为通过 SwiftUI 中的自定义结构传递的 @State 值设置动画【英文标题】:How to animate @State value that is passed through a custom struct in SwiftUI 【发布时间】:2021-06-08 06:39:41 【问题描述】:

我目前正在为我的应用制作身份验证视图,我想添加一些动作。我决定使用动画来更改视图的自定义角半径就可以了。

我在下面附上了一个链接,说明它目前的样子。

https://i.stack.imgur.com/qQ4OO.png

这是专门处理角半径的代码(使用自定义结构仅影响该角):

Color("lapiz").ignoresSafeArea()
                        .customCornerRadius(CGSize(width: 125, height: 125), corners: .bottomRight)

当然,还有更多的代码,但这就是制作圆角半径的内容。这是.customCornerRadius扩展代码和结构:

public extension View 
    
    func customCornerRadius(_ radius: CGSize, corners: UIRectCorner) -> some View 
        clipShape( CustomRoundedCorner(size: radius, corners: corners) )
    

struct CustomRoundedCorner: Shape 
    
    var size: CGSize
    var corners: UIRectCorner
    
    func path(in rect: CGRect) -> Path 
        let path = UIBezierPath(roundedRect: rect, byRoundingCorners: corners, cornerRadii: size)
        return Path(path.cgPath)
    

传递给.customCornerRadiusCGSize 宽度和高度当前设置为125。假设我将它附加到@State 变量。

如何为视图设置动画以在例如 100 的 CGSize 之间切换?我可以无限期地来回重复这个吗?

提前致谢。

【问题讨论】:

这个设计很漂亮。 【参考方案1】:

由于Shape 继承且CGSize 符合Animatable 协议,您只需将var animatableData 权限添加到CustomRoundedCorner 形状即可。

struct CustomRoundedCorner: Shape 
    
    var size: CGSize
    var corners: UIRectCorner

    var animatableData: CGSize 
        get  return size 
        set  size = newValue 
    
    
    func path(in rect: CGRect) -> Path 
        let path = UIBezierPath(roundedRect: rect, byRoundingCorners: corners, cornerRadii: size)
        return Path(path.cgPath)
    

之后,使用您未来的@State 变量,CGSize 应该在大小更改时进行动画处理。

【讨论】:

谢谢!像魅力一样工作

以上是关于如何为通过 SwiftUI 中的自定义结构传递的 @State 值设置动画的主要内容,如果未能解决你的问题,请参考以下文章

样式视图传递给 SwiftUI 中的自定义视图

将图像名称传递给 SwiftUI 中的自定义图像子类

在 SwiftUI 中,如何为条形图创建动态矩形?

如何为android中的所有视图使用相同的自定义字体?

如何为数组中的每个创建一个具有唯一图像和选择器的自定义 UIButton?

如何为 tableViewController 中的自定义单元格按钮创建手势识别器,以便能够识别它所在的单元格?