MarqueeLabel 是 UILabel 的子类,当标签的文本超出可用宽度时,它会添加一个滚动的跑马灯效果。标签的滚动方向和速度/速率也可以指定。所有标准的 UILabel 属性(在有意义的地方)都可以在 MarqueeLabel 中使用,MarqueeLabel 的意图就是表现得像一个 UILabel。
从4.0 版本开始,MarqueeLabel 将仅以 Swift 维护!
MarqueeLabel 兼容 iOS 和 tvOS,目前适用于 Swift 5.0 和 iOS 12.2 SDK!(但如果您正在寻找先前版本的 Swift 兼容性,您可以查看旧版本)
MarqueeLabel.swift
源代码中的文档。要在项目中使用 MarqueeLabel,请将以下内容添加到项目的 Podfile 中
pod 'MarqueeLabel'
将以下内容添加到项目的 Cartfile 中
github "cbpowell/MarqueeLabel"
请参阅下面的特殊说明,了解如何在 Swift framework 中同时支持 Cocoapods 和 Carthage!
当标签的文本长度超过给定标签框架的可用空间时,MarqueeLabel 会自动滚动其文本,可以是按定义的速率(每秒点数)或在持续时间(秒)内滚动。
Marquee 类型有几个选项,默认值为 Continuous
(看起来就像 Apple 通常使用的那样)。 可以定义此滚动的动画曲线,默认值为 UIViewAnimationOptionCurveLinear
。
还有几个可选功能可以帮助您集成 MarqueeLabel 的滚动特性
请参阅随附的演示项目,了解几个用例示例!
以下代码创建了一个 MarqueeLabel,它将在 8.0 秒内滚动其内容,并在左右边界添加 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 实例,然后在 Utilities 面板(右侧面板)的 Identity Inspector 选项卡的“Custom Class”字段中手动将视图的类更改为 MarqueeLabel
。 注意:如果您忘记将 Custom Class 字段更改为 MarqueeLabel
,然后尝试在代码中访问/设置 MarqueeLabel 特定的属性,您将会崩溃!
然后,您可以通过 Utility 面板的 Attributes 选项卡配置普通的 UILabel 属性,以及大多数 MarqueeLabel 配置属性!
查看 MarqueeLabel 文档,了解有关所有功能的更多信息,包括
另请查看Extras 文件夹,其中包含 MarqueeLabel 的子类、扩展和修改的集合,用于实现已请求或建议但未合并到 MarqueeLabel 代码中的各种功能。
从 4.1 版本开始,MarqueeLabel 允许将 adjustsFontSizeToWidth
设置为 true
。 以这种方式配置时,MarqueeLabel 将检查文本字符串(非属性或属性)在调整到指定的最小缩放因子时是否适合框架,并且
以前 MarqueeLabel 会覆盖任何将 adjustsFontSizetoWidth
和 minimumScaleFactor
设置为 UILabel 使用的默认设置(分别为 false
和 0.0
)的尝试。 因此,默认行为保持不变:标签不会调整其字体大小以“避免”滚动。
MarqueeLabel 包括对 IBInspectable 和 IBDesignable 的支持,以允许在 Interface Builder/Storyboards 中配置标签。 但是,如果您在构建时看到以下警告
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。 一些解决方法包括
MarqueeLabel 会尽力在适当的时候自动开始滚动,但有时您的视图/视图控制器出现在屏幕上的方式可能会造成一些麻烦。
为了解决这个问题,您可以尝试
restartLabel
实例方法手动开始在 MarqueeLabel 上滚动如上所述,当在 UITableViews 和 UICollectionViews 中使用时,MarqueeLabel 有时可能难以检测到何时应启动滚动动画 - 尽管最近的评论有所改进。
通常,您会在 tableView:cellForRowAtIndexPath:
(或类似的 UICollectionView)中构建单元格时配置 MarqueeLabel 实例,但此时单元格不在屏幕上,因此 MarqueeLabel 不会开始滚动动画。 即使当用户滚动时最终将单元格放置在屏幕上,由于计时,动画也可能不会触发。
为了确保滚动动画 确实 随着单元格在屏幕上滚动而开始,您可以在 tableView:willDisplayCell:forRowAtIndexPath:
委托方法(或类似的 UICollectionView)中使用 MarqueeLabels 上的 restartLabel
方法。
也就是说 - UITableView/UICollectionView 的最佳实践是尽量减少单元格中过多的动画、子视图和自定义绘图,以获得如丝般流畅的滚动效果。 一般来说,我不建议在用户滚动 UITableView/UICollectionView 时允许您的标签自动设置动画。 我建议保持滚动或标记化标签,而用户滚动。 请参阅演示中的表格视图示例!
MarqueeLabel 基于 Core Animation,当视图出现和消失并且重复动画被 iOS 停止并且不会自动重新启动时,这确实会导致一些问题。
为了解决这个问题,MarqueeLabel 提供了一些类方法,可以轻松地“重新启动”与 UIViewController 关联的所有 MarqueeLabel。 具体来说,当您的视图控制器显示或即将显示时,应由您的视图控制器调用类方法 restartLabelsOfController:
(该方法将 self
传递给 controller
参数)。 请记住,呈现模态视图控制器可能会暂停被覆盖的控制器中的重复 UIView 动画!
controllerLabelsLabelize:
和 controllerLabelsAnimate:
为了方便起见,允许标记化和重新动画 UIViewController 的所有标签。 标记化对于性能很有用,例如在 UITableView/UIScrollView 开始滚动时标记化所有 MarqueeLabel。
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
MarqueeLabel.controllerViewDidAppear(self)
}
Charles Powell
如果您在您的项目中使用此功能,请告诉我!