概述

MarqueeLabel 是 UILabel 的子类,当标签的文本超出可用宽度时,它会添加一个滚动的跑马灯效果。标签的滚动方向和速度/速率也可以指定。所有标准的 UILabel 属性(在有意义的地方)都可以在 MarqueeLabel 中使用,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 作为冗长 UILabels 的替代品放入您的项目中!
  5. 帮助修复错误和开发新功能。

安装

CocoaPods

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

pod 'MarqueeLabel'

Carthage

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

github "cbpowell/MarqueeLabel"

手动安装

  1. 将 MarqueeLabel.swift 添加到您的项目中。
  2. QuartzCore.framework 添加到您的项目框架中。
  3. 导入 MarqueeLabel 并根据需要将您的 UILabels 替换为 MarqueeLabels。

在您自己的 Swift Framework 中使用 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 会覆盖任何将 adjustsFontSizetoWidthminimumScaleFactor 设置为 UILabel 使用的默认设置(分别为 false0.0)的尝试。 因此,默认行为保持不变:标签不会调整其字体大小以“避免”滚动。

IBDesignables

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 会尽力在适当的时候自动开始滚动,但有时您的视图/视图控制器出现在屏幕上的方式可能会造成一些麻烦。

为了解决这个问题,您可以尝试

在 UITableView 和 UICollectionView 中使用

如上所述,当在 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

Buy Me A Coffee

如果您在您的项目中使用此功能,请告诉我!