StackOverflow 上经常被问到的问题之一是“如何旋转我的 UILabel / UIButton / UISlider 等”。因此,继 Blurable 之后,我的 Swift 协议扩展用于将高斯模糊应用到 UIViews ,我想我会创建另一个 快速扩展来使任何 UIView 可旋转 。
默认情况下, UIView 没有简单的 旋转 属性。要旋转它们,您必须创建一个 CGAffineTransform 并将其传递给视图的 transform 属性。如果您的用户界面需要大量旋转,Rotatable 会将所有这些捆绑到一个单独的扩展中,让您忘记实现细节。
可旋转协议
协议本身非常基础,包含一个属性,类型为 CGAffineTransform 的变换, UIViews 已经拥有,两个用于实际旋转的新方法:
mutating func rotate(degrees degrees: CGFloat, animated: Bool)
mutating func rotate(radians radians: CGFloat, animated: Bool)
…和一个只读属性,它返回 UIView 的当前旋转的弧度和度数的元组:
mutating func rotate(degrees degrees: CGFloat, animated: Bool)
mutating func rotate(radians radians: CGFloat, animated: Bool)
旋转力学
协议扩展包含旋转组件的机制。这是非常基本的东西,只需创建一个 CGAffineTransformMakeRotation 并将其应用于变换属性,如果调用 rotate() 方法并将动画设置为 true,它会将设置包装在 UIView.animateWithDuration 中:
mutating func rotate(degrees degrees: CGFloat, animated: Bool)
mutating func rotate(radians radians: CGFloat, animated: Bool)
为了返回当前旋转,我从 CGAffineTransform 中提取角度:
mutating func rotate(degrees degrees: CGFloat, animated: Bool)
mutating func rotate(radians radians: CGFloat, animated: Bool)
执行
Rotatable 的所有代码都在一个文件 Rotatable.swift 中。 要旋转一个对象,比方说一个日期选择器,您所要做的就是调用 therotate() 方法:
mutating func rotate(degrees degrees: CGFloat, animated: Bool)
mutating func rotate(radians radians: CGFloat, animated: Bool)
如果您正在重置旋转,您可能希望为其设置动画,在这种情况下,语法为:
mutating func rotate(degrees degrees: CGFloat, animated: Bool)
mutating func rotate(radians radians: CGFloat, animated: Bool)
默认情况下,动画属性设置为 false。
一个小警告 - Rotatable 在 UIStackView 中工作得不太好,我的演示中的所有示例都是绝对定位的。
结论
希望这个项目是另一个很好的演示,说明 Swift 的协议扩展如何允许开发人员以最少的努力向 Swift 中的所有对象(包括可视组件)追溯添加几乎任何类型的行为。
这个项目的所有代码都可以在 我的 GitHub 存储库 中找到。