TTTAttributedLabel 2.0.0

TTTAttributedLabel 2.0.0

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布上次发布2016年5月

MatttJonathan HershSamuel Giddins维护。



  • 作者:
  • Mattt Thompson

Circle CI codecov.io

一个用于替换UILabel的组件,支持属性、数据检测、链接等

TTTAttributedLabel是一个替换UILabel的组件,可以简单高效地渲染属性字符串。作为一个附加功能,它还支持链接嵌入,无论是通过NSTextCheckingTypes自动完成,还是手动指定URL、地址、电话号码、事件或交通信息的范围。

已在项目中使用此库?请在此问题中评论,让我们知道您的应用支持哪些iOS版本的版本。

尽管UILabel在iOS 6中获得了对NSAttributedString的支持,但TTTAttributedLabel具有几个独特特性

  • 兼容iOS >= 4.3
  • 自动数据检测
  • 手动链接嵌入
  • 属性字符串的标签样式继承
  • 在标签内为链接自定义样式
  • 除了点击手势外,还有长按手势用于链接

还包括高级段落样式属性

  • attributedTruncationToken
  • firstLineIndent
  • highlightedShadowRadius
  • highlightedShadowOffset
  • highlightedShadowColor
  • lineHeightMultiple
  • lineSpacing
  • minimumLineHeight
  • maximumLineHeight
  • shadowRadius
  • textInsets
  • verticalAlignment

无障碍访问

从版本1.10.0开始,TTTAttributedLabel通过UIAccessibilityElement协议支持语音覆盖。每个链接都可以单独选中,其accessibilityLabel等于其字符串值,对于URL、电话号码和日期链接,还有相应的accessibilityValue。希望更改此行为或提供自定义值的开发者应创建子类并覆盖accessibilityElements

交流

  • 如果您需要帮助,请使用Stack Overflow。(标签tttattributedlabel
  • 如果您想提出一般性问题,请使用Stack Overflow
  • 如果您找到了一个错误,请提交一个问题。
  • 如果您有一个功能请求,请提交一个问题。
  • 如果您想贡献,请提交一个pull request。

安装

CocoaPods 是推荐用于安装 TTTAttributedLabel 的方法。只需将以下行添加到您的 Podfile 中:

# Podfile

pod 'TTTAttributedLabel'

使用方法

TTTAttributedLabel 可以显示普通文本和属性文本:只需将 NSStringNSAttributedString 传递给 setText: 设置器。不要设置 attributedText 属性。

// NSAttributedString

TTTAttributedLabel *attributedLabel = [[TTTAttributedLabel alloc] initWithFrame:CGRectZero];

NSAttributedString *attString = [[NSAttributedString alloc] initWithString:@"Tom Bombadil"
                                                                attributes:@{
        (id)kCTForegroundColorAttributeName : (id)[UIColor redColor].CGColor,
        NSFontAttributeName : [UIFont boldSystemFontOfSize:16],
        NSKernAttributeName : [NSNull null],
        (id)kTTTBackgroundFillColorAttributeName : (id)[UIColor greenColor].CGColor
}];

// The attributed string is directly set, without inheriting any other text
// properties of the label.
attributedLabel.text = attString;
// NSString

TTTAttributedLabel *label = [[TTTAttributedLabel alloc] initWithFrame:CGRectZero];
label.font = [UIFont systemFontOfSize:14];
label.textColor = [UIColor darkGrayColor];
label.lineBreakMode = NSLineBreakByWordWrapping;
label.numberOfLines = 0;

// If you're using a simple `NSString` for your text, 
// assign to the `text` property last so it can inherit other label properties.
NSString *text = @"Lorem ipsum dolor sit amet";
[label setText:text afterInheritingLabelAttributesAndConfiguringWithBlock:^ NSMutableAttributedString *(NSMutableAttributedString *mutableAttributedString) {
  NSRange boldRange = [[mutableAttributedString string] rangeOfString:@"ipsum dolor" options:NSCaseInsensitiveSearch];
  NSRange strikeRange = [[mutableAttributedString string] rangeOfString:@"sit amet" options:NSCaseInsensitiveSearch];

  // Core Text APIs use C functions without a direct bridge to UIFont. See Apple's "Core Text Programming Guide" to learn how to configure string attributes.
  UIFont *boldSystemFont = [UIFont boldSystemFontOfSize:14];
  CTFontRef font = CTFontCreateWithName((__bridge CFStringRef)boldSystemFont.fontName, boldSystemFont.pointSize, NULL);
  if (font) {
    [mutableAttributedString addAttribute:(NSString *)kCTFontAttributeName value:(__bridge id)font range:boldRange];
    [mutableAttributedString addAttribute:kTTTStrikeOutAttributeName value:@YES range:strikeRange];
    CFRelease(font);
  }

  return mutableAttributedString;
}];

首先,我们创建和配置标签,这与实例化 UILabel 的方式相同。当使用 -setText:afterInheritingLabelAttributesAndConfiguringWithBlock: 方法时,标签上设置的任何文本属性都将继承为基础属性。在这个例子中,子串 "ipsum dolar",将以粗体显示,使标签看起来像 "Lorem ipsum dolar sit amet",大小为 14 的 Helvetica,颜色为深灰色。

IBDesignable

TTTAttributedLabel 包含 IBInspectableIB_DESIGNABLE 标注,以支持在 Interface Builder 中配置标签。但是,如果您在构建时看到以下警告...

IB Designables: Failed to update auto layout status: Failed to load designables from path (null)
IB Designables: Failed to render instance of TTTAttributedLabel: Failed to load designables from path (null)

...那么您很可能是将 TTTAttributedLabel 作为静态库使用,这不支持 IB 标注。一些解决方案包括

  • 使用带有 use_frameworks! 的 CocoaPods 将 TTTAttributedLabel 安装为动态框架,或者使用 Carthage
  • 通过将源文件拖放到项目中来安装 TTTAttributedLabel

链接和数据检测

除了支持富文本外,TTTAttributedLabel 还可以自动检测日期、地址、URL、电话号码、交通信息等链接,并允许您嵌入自己的链接。

label.enabledTextCheckingTypes = NSTextCheckingTypeLink; // Automatically detect links when the label text is subsequently changed
label.delegate = self; // Delegate methods are called when the user taps on a link (see `TTTAttributedLabelDelegate` protocol)

label.text = @"Fork me on GitHub! (http://github.com/mattt/TTTAttributedLabel/)"; // Repository URL will be automatically detected and linked

NSRange range = [label.text rangeOfString:@"me"];
[label addLinkToURL:[NSURL URLWithString:@"http://github.com/mattt/"] withRange:range]; // Embedding a custom link in a substring

演示

pod try TTTAttributedLabel

...或者克隆这个仓库,并在 Xcode 中构建/运行/测试 Espressos 项目,以查看 TTTAttributedLabel 的实际效果。如果您未安装 CocoaPods,请使用 [sudo] gem install cocoapods 进行安装。

cd Example
pod install
open Espressos.xcworkspace

要求

  • iOS 4.3+ (iOS 6+ Base SDK)
  • Xcode 6

许可

TTTAttributedLabel 在 MIT 许可下可用。请参阅 LICENSE 文件以获取更多信息。