Rotatable:一个用于旋转任何 UIView 的 Swift 协议扩展
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
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 存储库 中找到。