具有多个按钮和字体的多行 UILabel
Multiple lines UILabel with multiple buttons and fonts
我正在为一些 activity 提要对象制作一个 UITableViewCell
,让你知道它们会像 Facebook post 那样有多个 links合一post。
在我的例子中,每个 post 将有两个 link 到其他 UIViewController
和一个连接两者并解释连接的普通 UILabel
(例如“X 评论了 Y 的 post”)可以点击 X 和 Y 来执行某些操作。
就像现在一样,我刚刚制作了 3 个单独的 UILabel
。问题是我不确定如何处理多行中太长的名称。
意思是如果例如 post 不是 X,而是“XXXXXXXXXXXXXXXXX 评论了 Y的post”,然后“评论了Y的post”将需要换一条线。
就像现在一样,我只是 link 3 UILabel
具有约束,因此它们彼此相邻,但当它们太长时就不起作用了。
如果您对我如何处理这个问题有任何想法,请告诉我,我们将不胜感激。
提前致谢。
标签太多,我想你可以使用这个扩展:
extension NSMutableAttributedString {
public func setAsLink(textToFind:String, linkURL:String) -> Bool {
let foundRange = self.mutableString.rangeOfString(textToFind)
if foundRange.location != NSNotFound {
self.addAttribute(NSLinkAttributeName, value: linkURL, range: foundRange)
return true
}
return false
}
}
那么你可以这样做:
let labelFont = UIFont(name: "HelveticaNeue-Bold", size: 18)
let attributes :[String:AnyObject] = [NSFontAttributeName : labelFont!]
let attrString = NSAttributedString(string:"foo www.google.com", attributes: attributes)
let urlPath: String = "http://www.google.com"
let url: NSURL = NSURL(string: urlPath)!
attrString.setAsLink("www.google.com", linkURL:url)
myLabel.attributedText = attrString
更新:(在您发表评论后)
如果您需要拦截 urllink,您可以将标签转换为 textView (UITextView),将其设置为委托并处理 shouldInteractWithURL 方法:
class ViewController: UIViewController, UITextViewDelegate {
... // on your code do:
myTextView.delegate = self
...
func textView(textView: UITextView!, shouldInteractWithURL URL: NSURL!, inRange characterRange: NSRange) -> Bool {
if URL.scheme == "http://www.google.com" {
//do whatever you want
launchMyMethodForThisUrl()
}
}
设置标签行数为zero
like,
label.numberOfLines = 0 // it will increase line when needed
并将属性字符串用于不同的字体和大小或链接等
然后将该字符串设置为标签,
label.attributedText = attributedString
更新:
如果你想在特定文本上发生一些动作事件,那么你应该使用 UITextview
而不是标签。通过实现它的 shouldInteractWithURL
委托会更容易。
另一个好的解决方案是使用像 TTTAttributedLabel 这样的第三方库。我想这正是你想要的。看一次。
更新 2:
参考this link or this link以获得您想要的输出
希望这会有所帮助:)
我正在为一些 activity 提要对象制作一个 UITableViewCell
,让你知道它们会像 Facebook post 那样有多个 links合一post。
在我的例子中,每个 post 将有两个 link 到其他 UIViewController
和一个连接两者并解释连接的普通 UILabel
(例如“X 评论了 Y 的 post”)可以点击 X 和 Y 来执行某些操作。
就像现在一样,我刚刚制作了 3 个单独的 UILabel
。问题是我不确定如何处理多行中太长的名称。
意思是如果例如 post 不是 X,而是“XXXXXXXXXXXXXXXXX 评论了 Y的post”,然后“评论了Y的post”将需要换一条线。
就像现在一样,我只是 link 3 UILabel
具有约束,因此它们彼此相邻,但当它们太长时就不起作用了。
如果您对我如何处理这个问题有任何想法,请告诉我,我们将不胜感激。
提前致谢。
标签太多,我想你可以使用这个扩展:
extension NSMutableAttributedString {
public func setAsLink(textToFind:String, linkURL:String) -> Bool {
let foundRange = self.mutableString.rangeOfString(textToFind)
if foundRange.location != NSNotFound {
self.addAttribute(NSLinkAttributeName, value: linkURL, range: foundRange)
return true
}
return false
}
}
那么你可以这样做:
let labelFont = UIFont(name: "HelveticaNeue-Bold", size: 18)
let attributes :[String:AnyObject] = [NSFontAttributeName : labelFont!]
let attrString = NSAttributedString(string:"foo www.google.com", attributes: attributes)
let urlPath: String = "http://www.google.com"
let url: NSURL = NSURL(string: urlPath)!
attrString.setAsLink("www.google.com", linkURL:url)
myLabel.attributedText = attrString
更新:(在您发表评论后)
如果您需要拦截 urllink,您可以将标签转换为 textView (UITextView),将其设置为委托并处理 shouldInteractWithURL 方法:
class ViewController: UIViewController, UITextViewDelegate {
... // on your code do:
myTextView.delegate = self
...
func textView(textView: UITextView!, shouldInteractWithURL URL: NSURL!, inRange characterRange: NSRange) -> Bool {
if URL.scheme == "http://www.google.com" {
//do whatever you want
launchMyMethodForThisUrl()
}
}
设置标签行数为zero
like,
label.numberOfLines = 0 // it will increase line when needed
并将属性字符串用于不同的字体和大小或链接等
然后将该字符串设置为标签,
label.attributedText = attributedString
更新:
如果你想在特定文本上发生一些动作事件,那么你应该使用 UITextview
而不是标签。通过实现它的 shouldInteractWithURL
委托会更容易。
另一个好的解决方案是使用像 TTTAttributedLabel 这样的第三方库。我想这正是你想要的。看一次。
更新 2:
参考this link or this link以获得您想要的输出
希望这会有所帮助:)