带有多个按钮和字体的多行 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 个单独的 UILabels。问题在于我不确定如何处理多行中过长的名称。

意思是,例如帖子不是 X,而是“XXXXXXXXXXXXXXXXX 评论了 Y 的帖子”,那么“评论了Y的帖子”需要换行。

现在我只是将 3 个UILabels 与约束联系起来,使它们彼此相邻,但是当它们太长时就不起作用了。

如果您对我如何解决此问题有任何想法,如果您能告诉我,我们将不胜感激。

提前致谢。

【问题讨论】:

您到底想要什么?你想要多行标签吗? 我想要一个标签,如果文本太长,它可能会变成多行。同时,标签由具有 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】:

设置标签行数为zerolike,

 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的主要内容,如果未能解决你的问题,请参考以下文章

单击带有字体真棒图标的按钮时,表单不提交

在对齐线下带有多行文本的按钮,如何解决?

带有多行文本的 ASP.NET 按钮的 Chrome 呈现

带有adjustsFontSizeToFitWidth的多行UILabel

带有自定义后退按钮字体的错误大标题动画

uitableviewcell 具有动态高度或减小字体大小以将多行放入一个单元格