MarqueeLabel-ObjC 3.3.0

MarqueeLabel-ObjC 3.3.0

Charles Powell维护。



  • 作者
  • Charles Powell

已弃用

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 完全一致。

查看它!

GIF of MarqueeLabelDemo in action

如何开始

  1. 从 GitHub 克隆 MarqueeLabel,并查看示例项目。
  2. 阅读 MarqueeLabel CocoaDocs 文档
  3. 查阅特别注意事项部分,注意任何潜在问题。
  4. 将 MarqueeLabel 作为替换你的长条形 UILabel 的组件!
  5. 帮助修复缺陷和添加新功能。

安装

CocoaPods

在 Objective-C 项目中使用 MarqueeLabel,将以下内容添加到项目的 Podfile 中

pod 'MarqueeLabel-ObjC'

Carthage

请将以下内容添加到您的项目的Cartfile中

github "cbpowell/MarqueeLabel"

手动安装

  1. 将MarqueeLabel.h和MarqueeLabel.m添加到您的项目中。
  2. QuartzCore.framework添加到您的项目框架中。
  3. 导入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

如果您在项目中使用此功能,请联系我!