MarqueeLabel 4.5.0

MarqueeLabel 4.5.0

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布最后发布2024年2月
SPM支持 SPM

Charles Powell 维护。



  • Charles Powell

概览

MarqueeLabel 是一个 UILabel 子类,当标签的文字超出可用宽度时,会添加滚动字幕效果。还可以指定标签的滚动方向和速度/速率。MarqueeLabel 包含了所有标准的 UILabel 属性(当适用时),目的是让 MarqueeLabel 的行为尽可能像 UILabel。

版本 4.0 开始,MarqueeLabel 将仅使用 Swift 维护!

MarqueeLabel 与 iOS 和 tvOS 兼容,目前支持 Swift 5.0 和 iOS 12.2 SDK!(但如果您需要以前版本的 Swift 兼容性,您可以在 这里查看旧版发布

看看吧!

GIF of MarqueeLabelDemo in action

如何开始

  1. 从 GitHub 克隆 MarqueeLabel,并查看示例项目。
  2. 阅读嵌入在 MarqueeLabel.swift 源文件中的文档。
  3. 查看 特殊说明 部分,了解可能的问题。
  4. 将 MarqueeLabel 置换为你长久使用的 UILabel!
  5. 帮助修复错误和新功能的开发。

安装

CocoaPods

要在项目中使用 MarqueeLabel,请在项目的 Podfile 中添加以下内容

pod 'MarqueeLabel'

Carthage

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

github "cbpowell/MarqueeLabel"

手动安装

  1. 将 MarqueeLabel.swift 添加到您的项目中。
  2. QuartzCore.framework 添加到您的项目框架中。
  3. 导入 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允许可设置adjustsFontSizeToWidthtrue。当以这种方式配置时,MarqueeLabel将检查当调整到指定的最小缩放因子时,文本字符串(非属性文本或属性文本)是否能够适应框架,并且

  • 如果文本可以在调整缩放时不需截断而适应,标签将不滚动。相反,将允许标签文本调整到该尺寸并保持静态。
  • 如果文本无法适应,标签将滚动并保留未缩放的字体大小(即,类似于4.1版本之前的所有发布)

以前,MarqueeLabel会覆盖将adjustsFontSizeToWidthminimumScaleFactor设置为UILabel默认设置(分别为false0.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

Buy Me A Coffee

如果你在项目中使用它,请向我提出建议!