概览
MarqueeLabel 是一个 UILabel 子类,当标签的文字超出可用宽度时,会添加滚动字幕效果。还可以指定标签的滚动方向和速度/速率。MarqueeLabel 包含了所有标准的 UILabel 属性(当适用时),目的是让 MarqueeLabel 的行为尽可能像 UILabel。
从 版本 4.0 开始,MarqueeLabel 将仅使用 Swift 维护!
MarqueeLabel 与 iOS 和 tvOS 兼容,目前支持 Swift 5.0 和 iOS 12.2 SDK!(但如果您需要以前版本的 Swift 兼容性,您可以在 这里查看旧版发布)
看看吧!
如何开始
- 从 GitHub 克隆 MarqueeLabel,并查看示例项目。
- 阅读嵌入在
MarqueeLabel.swift
源文件中的文档。 - 查看 特殊说明 部分,了解可能的问题。
- 将 MarqueeLabel 置换为你长久使用的 UILabel!
- 帮助修复错误和新功能的开发。
安装
CocoaPods
要在项目中使用 MarqueeLabel,请在项目的 Podfile 中添加以下内容
pod 'MarqueeLabel'
Carthage
请将以下内容添加到项目的 Cartfile 中
github "cbpowell/MarqueeLabel"
手动安装
- 将 MarqueeLabel.swift 添加到您的项目中。
- 将 QuartzCore.framework 添加到您的项目框架中。
- 导入 MarqueeLabel,按需将其替换为 UILabels。
在您的Swift框架中使用MarqueeLabel?
请参阅下面的特别说明,了解如何同时在Swift框架中支持CocoaPods和Carthage!
用法
MarqueeLabel在其文本长度超出框架提供空间时,会自动以定义的速率(每秒点数)或持续时间(秒)滚动文本。
Marquee类型有多种选择,默认为Continuous
(看起来就像苹果通常使用的那样)。可以定义此滚动的动画曲线,默认为UIViewAnimationOptionCurveLinear
。
还有几个可选特性,可以帮助您集成MarqueeLabel的滚动特性
- 可选的边缘淡入,以使标签文本淡入背景,而不是简单地被剪切掉
- 前导和尾随缓冲区以偏移标签文本在其框架内的位置,提供更好的对齐控制
- “标签化”以使您的MarqueeLabel与UILabel完全相同。
- 滚动动画的“保持”和暂停
请参阅包含的演示项目,以了解几个用例示例!
代码
这些代码行创建了一个将在8.0秒内滚动其内容的MarqueeLabel,并在左右边界添加了10.0点长的淡入效果。
替换
var lengthyLabel = UILabel.init(frame:aFrame)
为
var lengthyLabel = MarqueeLabel.init(frame: aFrame, duration: 8.0, fadeLength: 10.0)
故事板
如果您正在使用 Storyboards/Interface Builder,可以通过将一个普通的 UILabel 视图添加到您的 Storyboard 中,然后在“组件”面板的“标识符检查器”选项卡的“自定义类”字段中手动将视图的类改为 MarqueeLabel
来创建 MarqueeLabel 实例。注意:如果您忘记将“自定义类”字段改为 MarqueeLabel
,然后尝试在代码中访问/设置 MarqueeLabel 特定的属性,您的应用程序将会崩溃!
您可以通过“组件”面板的“属性”选项卡配置普通的 UILabel 属性,以及大多数 MarqueeLabel 配置属性!
更多功能
查看 MarqueeLabel 文档 了解更多功能,包括
- 批量操作类方法以方便地重新启动、暂停和恢复所有标签的运行
- 滚动方向:左向右、右向左,以及双向循环(左右均可)
额外扩展
还要查看 扩展文件夹,其中包含用于 MarqueeLabel 的子类、扩展和修改集合,以实现各种已请求或建议但未合并到 MarqueeLabel 代码中的功能。
特别说明
自动字体大小调整
从4.1版本开始,MarqueeLabel允许可设置adjustsFontSizeToWidth
为true
。当以这种方式配置时,MarqueeLabel将检查当调整到指定的最小缩放因子时,文本字符串(非属性文本或属性文本)是否能够适应框架,并且
- 如果文本可以在调整缩放时不需截断而适应,标签将不滚动。相反,将允许标签文本调整到该尺寸并保持静态。
- 如果文本无法适应,标签将滚动并保留未缩放的字体大小(即,类似于4.1版本之前的所有发布)
以前,MarqueeLabel会覆盖将adjustsFontSizeToWidth
和minimumScaleFactor
设置为UILabel默认设置(分别为false
和0.0
)的任何尝试。因此,默认行为保持不变:标签将不会调整其字体大小以避免滚动。
IBDesignables
MarqueeLabel支持IBInspectable和IBDesignable,允许在Interface Builder/Storyboard内部配置标签。但是,如果您在构建时看到以下警告
IB Designables: Failed to update auto layout status: Failed to load designables from path (null)
IB Designables: Failed to render instance of MarqueeLabel: Failed to load designables from path (null)
...则您很可能正在将MarqueeLabel用作静态库,它不支持IBInspectable/IBDesignable。一些解决方案包括
- 使用CocoaPods将MarqueeLabel作为动态框架安装,在Podfile中使用use_frameworks!
- 使用Carthage安装MarqueeLabel
- 手动将源文件导入到项目中(如果针对iOS 7.0,可能仅是选项)
自动滚动
MarqueeLabel会尽力在适当的时候自动开始滚动,但有时您的视图/视图控制器在屏幕上的显示方式可能会使其陷入困境。
为了解决这个问题,您可以尝试
- 使用
restartLabel
实例方法手动使MarqueeLabel开始滚动 - 尝试使用大量操作类方法——但请注意,这些方法目前与UIViewController containment不太兼容。您需要将它们传递给您层次结构中的最低级UIViewController。
在UITableView和UICollectionView中使用
如上所述,MarqueeLabel在UITableView和UICollectionView中使用时有时难以检测何时开始滚动动画,尽管最近的版本有所改进。
通常您会在构建单元格时配置MarqueeLabel实例,即在tableView:cellForRowAtIndexPath:
(或类似 UICollectionView)中,但此时单元格不在屏幕上,因此MarqueeLabel不会开始滚动动画。即使单元格最终随用户的滚动放置在屏幕上,由于时机问题,动画也可能不会触发。
要确保滚动动画在单元格滚动到屏幕上时开始,您可以在tableView:willDisplayCell:forRowAtIndexPath:
(或类似 UICollectionView)代理方法中使用MarqueeLabel的restartLabel
方法。
话虽如此,UITableView/UICollectionView的最佳实践是尽量减少在单元格中过度动画、子视图和自定义绘制,以实现玻璃般平滑的滚动。通常,我建议不要允许您的标签在用户滚动UITableView/UICollectionView时自动动画。建议在用户滚动时暂停滚动或标签化标签。请参阅演示中的表视图示例!
重要动画注意事项
MarqueeLabel基于Core Animation,当视图出现和消失以及iOS停止重复动画时,这会导致一些问题,并且不会自动重启。
为了解决这个问题,MarqueeLabel提供了一些类方法,这些方法可以轻松“重启”与UIViewController相关联的所有MarqueeLabel。具体来说,当视图控制器被揭示或将要被揭示时,应由您的视图控制器(对于controller
参数,传入self
)调用类方法restartLabelsOfController:
。请注意,呈现模态视图控制器可能会暂停被覆盖的控制器中的重复UIView动画!
controllerLabelsLabelize:
和controllerLabelsAnimate:
是为了方便而提供的,允许标签化并重新动画化所有ViewContrller中的标签。标签化有助于性能,例如在UITableView/UIScrollView开始滚动时标签化所有MarqueeLabel。
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
MarqueeLabel.controllerViewDidAppear(self)
}
待办事项
- 想法?
关于
Charles Powell
如果你在项目中使用它,请向我提出建议!