TTTAttributedLabel 链接正在设置样式但不可点击
TTTAttributedLabel links are being styled but not clickable
我一直在研究使可点击链接正常工作的解决方案。我可以在使用 UITextView + NSAttributedString 时让它工作,但是当它是 UITableViewCell 时它不能正确地自动布局。
现在我已经将 TTTAttributedLabel 添加到我的项目中,它完美地设置了视图的样式。链接也会变成蓝色并带有下划线。
但是点击它们没有任何反应。我确实在我的控制器上实现了 TTTAttributedLabelDelegate,使故事板中的标签实现了 MyLabel(它只是扩展了 TTTAttributedLabel 并具有委托选项,因为我希望它们在同一个函数中触发)。现在我已经将控制器设置为委托,我认为它可能无法指向自身。
但是 none 这些函数被触发了,我得到了断点并在其中记录。
我实现了 didSelectLinkWithUrl 和 didLongPressLinkWithUrl。
func attributedLabel(label: TTTAttributedLabel!, didSelectLinkWithURL url: NSURL!) {
Debug.log("link clicked")
}
func attributedLabel(label: TTTAttributedLabel!, didLongPressLinkWithURL url: NSURL!, atPoint point: CGPoint) {
Debug.log("link long clicked")
}
出口
@IBOutlet weak var content: MyLabel!
我的标签
导入 UIKit
导入 TTTAttributedLabel
class MyLabel : TTTAttributedLabel, TTTAttributedLabelDelegate {
override func didMoveToSuperview() {
if (self.delegate == nil) {
self.delegate = self
}
self.enabledTextCheckingTypes = NSTextCheckingType.Link.rawValue
self.userInteractionEnabled = true
}
func attributedLabel(label: TTTAttributedLabel!, didSelectLinkWithURL url: NSURL!) {
Debug.log("link clicked")
}
func attributedLabel(label: TTTAttributedLabel!, didLongPressLinkWithURL url: NSURL!, atPoint point: CGPoint) {
Debug.log("link long clicked")
}
有人知道我可能遗漏了什么吗?
更新
我发现只需粘贴 url f/e http://example.com 即可激活并且实际上可点击并且 didSelectLinkWithUrl 可点击,尽管我需要一个属性字符串并且它基于一个 HTML 字符串。
The implementation of setAttributedText:
doesn't update the linkModels
array, while the implementation of setText:
确实如此。我相信这就是导致您出现问题的原因。
要解决,请设置标签的 text
属性 而不是 attributedText
属性.
The docs 还包括此警告:
TTTAttributedLabel
can display both plain and attributed text: just pass an NSString
or NSAttributedString
to the setText:
setter. Never assign to the attributedText
property.
文档还显示了这个示例用法:
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;
Aaron Brager 是正确的!
我曾经遇到过同样的问题,但我通过替换以下行在 Swift 中修复了它:
label.attributedText = attributedString
行:
label.setText(attributedString)
这会被编译器接受,因为 setText 方法接受 AnyObject。
我还增加了 link 的属性字符串的字体,因此它可以捕获我的点击并且现在可以使用了!
我用它来截断 link,这是整个部分:
label.lineBreakMode = .ByTruncatingHead
label.attributedTruncationToken = NSMutableAttributedString(string: "... Show more", attributes: [NSForegroundColorAttributeName: UIColor.cueCyan(), NSLinkAttributeName: readMoreLink, NSFontAttributeName: UIFont.formFont(.Light, size: fontSize+24)!])
label.userInteractionEnabled = true
label.delegate = self
我一直在研究使可点击链接正常工作的解决方案。我可以在使用 UITextView + NSAttributedString 时让它工作,但是当它是 UITableViewCell 时它不能正确地自动布局。
现在我已经将 TTTAttributedLabel 添加到我的项目中,它完美地设置了视图的样式。链接也会变成蓝色并带有下划线。
但是点击它们没有任何反应。我确实在我的控制器上实现了 TTTAttributedLabelDelegate,使故事板中的标签实现了 MyLabel(它只是扩展了 TTTAttributedLabel 并具有委托选项,因为我希望它们在同一个函数中触发)。现在我已经将控制器设置为委托,我认为它可能无法指向自身。
但是 none 这些函数被触发了,我得到了断点并在其中记录。
我实现了 didSelectLinkWithUrl 和 didLongPressLinkWithUrl。
func attributedLabel(label: TTTAttributedLabel!, didSelectLinkWithURL url: NSURL!) {
Debug.log("link clicked")
}
func attributedLabel(label: TTTAttributedLabel!, didLongPressLinkWithURL url: NSURL!, atPoint point: CGPoint) {
Debug.log("link long clicked")
}
出口
@IBOutlet weak var content: MyLabel!
我的标签
导入 UIKit 导入 TTTAttributedLabel
class MyLabel : TTTAttributedLabel, TTTAttributedLabelDelegate {
override func didMoveToSuperview() {
if (self.delegate == nil) {
self.delegate = self
}
self.enabledTextCheckingTypes = NSTextCheckingType.Link.rawValue
self.userInteractionEnabled = true
}
func attributedLabel(label: TTTAttributedLabel!, didSelectLinkWithURL url: NSURL!) {
Debug.log("link clicked")
}
func attributedLabel(label: TTTAttributedLabel!, didLongPressLinkWithURL url: NSURL!, atPoint point: CGPoint) {
Debug.log("link long clicked")
}
有人知道我可能遗漏了什么吗?
更新
我发现只需粘贴 url f/e http://example.com 即可激活并且实际上可点击并且 didSelectLinkWithUrl 可点击,尽管我需要一个属性字符串并且它基于一个 HTML 字符串。
The implementation of setAttributedText:
doesn't update the linkModels
array, while the implementation of setText:
确实如此。我相信这就是导致您出现问题的原因。
要解决,请设置标签的 text
属性 而不是 attributedText
属性.
The docs 还包括此警告:
TTTAttributedLabel
can display both plain and attributed text: just pass anNSString
orNSAttributedString
to thesetText:
setter. Never assign to theattributedText
property.
文档还显示了这个示例用法:
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;
Aaron Brager 是正确的! 我曾经遇到过同样的问题,但我通过替换以下行在 Swift 中修复了它:
label.attributedText = attributedString
行:
label.setText(attributedString)
这会被编译器接受,因为 setText 方法接受 AnyObject。 我还增加了 link 的属性字符串的字体,因此它可以捕获我的点击并且现在可以使用了! 我用它来截断 link,这是整个部分:
label.lineBreakMode = .ByTruncatingHead
label.attributedTruncationToken = NSMutableAttributedString(string: "... Show more", attributes: [NSForegroundColorAttributeName: UIColor.cueCyan(), NSLinkAttributeName: readMoreLink, NSFontAttributeName: UIFont.formFont(.Light, size: fontSize+24)!])
label.userInteractionEnabled = true
label.delegate = self