带有多个按钮和字体的多行 UILabel
Posted
技术标签:
【中文标题】带有多个按钮和字体的多行 UILabel【英文标题】:Multiple lines UILabel with multiple buttons and fonts 【发布时间】:2016-04-30 09:42:00 【问题描述】:我正在为一些活动提要对象创建一个UITableViewCell
,让您知道它们将像 Facebook 帖子一样,您在一个帖子中有多个链接。
在我的情况下,每个帖子将有两个指向其他 UIViewController
的链接和一个简单的 UILabel
连接两者并解释连接(例如“X 评论了 Y 的帖子”),您可以在其中同时点击 X 和 Y 以执行某些操作。
就目前而言,我刚刚制作了 3 个单独的 UILabel
s。问题在于我不确定如何处理多行中过长的名称。
意思是,例如帖子不是 X,而是“XXXXXXXXXXXXXXXXX 评论了 Y 的帖子”,那么“评论了Y的帖子”需要换行。
现在我只是将 3 个UILabel
s 与约束联系起来,使它们彼此相邻,但是当它们太长时就不起作用了。
如果您对我如何解决此问题有任何想法,如果您能告诉我,我们将不胜感激。
提前致谢。
【问题讨论】:
您到底想要什么?你想要多行标签吗? 我想要一个标签,如果文本太长,它可能会变成多行。同时,标签由具有 2 种不同字体的 3 个对象组成。其中两个对象(2 个单词)也需要链接到不同的操作,而第三个对象只是一个纯字符串。 如果有帮助,请查看我的答案:) 【参考方案1】:标签太多了,我觉得你可以用这个扩展:
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
更新:(在您的 cmets 之后)
如果你需要拦截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()
【讨论】:
感谢您的回答。对于链接,我只是指链接到诸如showFirstObject()
之类的操作或方法。很抱歉造成混乱。你认为我还能使用你的实现吗?我可以在 UILabel
的部分文本上添加点击操作吗?
感恩米勒!但是,正如我在另一个答案中所说的那样,我实际上根本没有与 URL 进行交互。我只需要一个标签,例如“A something B”,我可以在其中点击 A 并显示 A 的详细 ViewController,点击 B 并显示 B 对象的另一个 ViewController。所以基本上我只需要在部分 UILabel 文本中添加两个不同的点击动作。我还需要用粗体显示“可点击”字样,以表明您可以点击它们。这有意义吗?
请记住,您可以使用 UITapGestureRecognizer 使标签可点击,如果您不知道该标签的确切内容,这不是一个好态度。如果你想让你的内容只有“可点击”的一部分,你只需要只在属性字符串中可用的超链接。选择你的命运,我认为在这种情况下更好的解决方案是 UITextView。 “Figurati non c'e' di che”
现在这实际上是我正在使用的:UITapGestureRecognizer
,但我必须制作 3 个不同的标签才能对不同标签上的不同点击执行不同的操作。我不确定我是否知道使用属性字符串中可用的超链接是什么意思,但我肯定会调查一下。再次感谢。
不知道怎么开启聊天功能给你解释一下,你知道怎么开启聊天线吗?【参考方案2】:
设置标签行数为zero
like,
label.numberOfLines = 0 // it will increase line when needed
并使用属性字符串来获得不同的字体和大小或链接等。
然后将该字符串设置为标签,
label.attributedText = attributedString
更新:
如果您想在特定文本上执行一些操作事件,那么您应该使用UITextview
而不是标签。实现 shouldInteractWithURL
的委托会更容易。
另一个好的解决方案是使用第三方库,如TTTAttributedLabel。这正是你想要的,我想。看一次。
更新 2:
请参考 this link 或 this link 以获得所需的输出
希望这会有所帮助:)
【讨论】:
感谢您的回答!我认为我错误地使用了“链接”一词。我的意思是将 ViewController 链接到另一个 ViewController!在我在我的问题中所做的示例中,会有一个字符串,例如“A something B”——A 和 B 将是例如粗体字体,点击 A 将为对象 A 呈现一个 ViewController,点击 B 为对象 B 。 那有意义吗?我应该仍然使用 TextView 还是对 URL 更好? 大家远离 TTTAttributedLabel,它在社交网络中崩溃,比如使用特殊字符的项目,有 60 多个未解决的问题.. @GiulioColleluori,检查我在回答中的更新,我分享了两个链接。希望它会有所帮助:) @AlessandroOrnano,好信息人。如果是这样的话,这是有帮助的。 +1以上是关于带有多个按钮和字体的多行 UILabel的主要内容,如果未能解决你的问题,请参考以下文章