已弃用
MarqueeLabel-ObjC是MarqueeLabel的Objective-C版本,其中已删除Objective-C代码库。
保留此版本是为了让Objective-C代码仍然可以通过Cocoapod/Carthage包供希望使用它的人使用。
Cocoapods
使用MarqueeLabel-ObjC pod。将pod 'MarqueeLabel'
替换为pod 'MarqueeLabel-ObjC'
。
Carthage
将github "cbpowell/MarqueeLabel"
替换为github "cbpowell/MarqueeLabel-ObjC"
。
未来更新
此仓库将在3.2.x主要版本分支上接收到针对已识别问题的PATCH更新(即0.0.x)。所有未来的开发将在MarqueeLabel仓库中以Swift语言进行。
概述
MarqueeLabel 是一个 UILabel 子类,当标签文本长度超出可用宽度时,会添加滚动字幕效果。可指定标签滚动方向和速度/速率。在 MarqueeLabel 中还提供了所有标准 UILabel 属性(在适用的情况下),目的是让 MarqueeLabel 的行为和 UILabel 完全一致。
查看它!
如何开始
- 从 GitHub 克隆 MarqueeLabel,并查看示例项目。
- 阅读 MarqueeLabel CocoaDocs 文档。
- 查阅特别注意事项部分,注意任何潜在问题。
- 将 MarqueeLabel 作为替换你的长条形 UILabel 的组件!
- 帮助修复缺陷和添加新功能。
安装
CocoaPods
在 Objective-C 项目中使用 MarqueeLabel,将以下内容添加到项目的 Podfile 中
pod 'MarqueeLabel-ObjC'
Carthage
请将以下内容添加到您的项目的Cartfile中
github "cbpowell/MarqueeLabel"
手动安装
- 将MarqueeLabel.h和MarqueeLabel.m添加到您的项目中。
- 将QuartzCore.framework添加到您的项目框架中。
- 导入MarqueeLabel,并在需要的情况下将您的UILabel替换为MarqueeLabel。
在您自己的Swift框架中使用MarqueeLabel?
请参阅以下特殊说明,了解如何同时支持Swift框架中的CocoaPods和Carthage!
使用说明
当标签文本的长度超过标签框架提供的空间时,MarqueeLabel会自动以定义的速率(每秒点数)或在指定的时间内滚动其文本。
有几种Marquee类型可供选择,默认为Continuous
(类似于Apple常用的效果)。可以定义此滚动的动画曲线,默认为UIViewAnimationOptionCurveLinear
。
还有一些可选功能可以帮助您整合MarqueeLabel的滚动特性
- 可选的边缘渐变,以便在视图的左右边缘将标签文本淡入背景,而不是仅仅被裁剪掉
- 首尾缓冲区以偏移标签文本在框架内部的位置,从而更好地控制对齐方式
- “Labelization”以使MarqueeLabel与UILabel完全相同。
- 滚动动画的“持有”和暂停
查看提供的示例项目以了解一些使用案例!
代码
这些代码行创建了一个MarqueeLabel,它将在8.0秒内滚动其内容,并在左右边界添加10.0点长的渐变。
Objective-C
替换
UILabel *lengthyLabel = [[UILabel alloc] initWithFrame:aFrame];
使用
MarqueeLabel *lengthyLabel = [[MarqueeLabel alloc] initWithFrame:aFrame duration:8.0 andFadeLength:10.0f];
Storyboards
如果你使用 Storyboards/Interface Builder,可以通过在你的 Storyboard 中添加一个普通的 UILabel 视图来创建 MarqueeLabel 的实例,然后在实用工具面板(右侧面板)的“标识符检查器”选项卡的“自定义类”字段中手动将视图的类更改为 MarqueeLabel
。 注意: 如果你忘记将自定义类字段更改为 MarqueeLabel
并尝试在你的代码中访问/设置 MarqueeLabel 特定的属性,应用程序将崩溃!
您可以通过实用工具面板的“属性”选项卡配置普通的 UILabel 属性以及大多数 MarqueeLabel 配置属性!
更多
查看 MarqueeLabel 文档 了解有关所有功能的更多信息,包括:
- 批量操作类方法,方便地重启、暂停和恢复视图控制器中所有标签
- 滚动方向:左至右、右至左和连续循环(左右两边)
特别注意
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
- 通过手动将源文件导入到项目中来安装MarqueeLabel(如果您针对iOS 7.0,这可能是唯一的选择)
自动滚动
MarqueeLabel会尽可能在适当的时候自动开始滚动,但有时您的视图或视图控制器在屏幕上的显示方式可能会使其失败。
为了解决这个问题,您可以尝试以下方法
- 使用
restartLabel
实例方法手动在MarqueeLabel上开始滚动 - 尝试使用批量操作的类方法 - 但请注意,这些方法目前与UIViewController包装不起作用。您需要将它们的最低层UIViewController传递给他们。
在UITableView和UICollectionView中使用
如上所述,当在UITableViews和UICollectionViews中使用时,MarqueeLabel有时难以检测何时应该开始滚动动画 - 尽管最近的评审已有改进。
通常您会在构建cell时配置MarqueeLabel实例,在tableView:cellForRowAtIndexPath:
(或类似项用于UICollectionView),但在此点cell不在屏幕上,因此MarqueeLabel不会开始滚动动画。即使cell最终在用户滚动时被放置在屏幕上,由于时间的原因,动画可能不会触发。
为了确保当cell在屏幕上滚动时滚动动画确实开始,您可以使用在tableView:willDisplayCell:forRowAtIndexPath:
委托方法(或类似项用于UICollectionView)中的您的MarqueeLabel上的restartLabel
方法。
话虽如此 - 在UITableView/UICollectionView中的最佳实践是尽量减少在cells中的过度动画、子视图和自定义绘图,以获得流畅的滚动效果。总的来说,我建议在用户滚动UITableView/UICollectionView时不允许您的标签自动动画。我建议在用户滚动时暂停滚动或标记化标签。请查看演示中的表格视图示例!
重要的动画提示
MarqueeLabel基于Core Animation,这导致在视图出现和消失以及iOS停止重复动画而不会自动重新启动时出现一些问题。
为解决这个问题,MarqueeLabel提供了一些类方法,允许轻松“重启”与UIViewController关联的所有MarqueeLabel。具体来说,应该在视图控制器被揭示或即将被揭示时,调用类方法restartLabelsOfController:
(你的视图控制器应该传入self
作为controller
参数)。请注意,呈现模态视图控制器可能会暂停被覆盖的控制器中重复的UIView动画!
controllerLabelsShouldLabelize:
和controllerLabelsShouldAnimate:
是为了方便,允许标签化并重新动画化UIViewController中的所有标签。标签化对于性能有帮助,例如,当UITableView/UIScrollView开始滚动时,可以标签化所有MarqueeLabel。
待办事项
- 想法?
关于
Charles Powell
如果您在项目中使用此功能,请联系我!