Rotatable:一个用于旋转任何 UIView 的 Swift 协议扩展

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 63w+ 字,讲解图 2808+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2200+ 小伙伴加入学习 ,欢迎点击围观

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 存储库 中找到。


相关文章