【问题标题】:UILabel text wrapping issueUILabel 文本换行问题
【发布时间】:2016-07-19 13:27:47
【问题描述】:

我有一个多行UILabel,上面写着“我想在印度洋骑船”。在 iPhone 5 中,UILabel 由于宽度大小而在第二行显示文本“ocean”。

我想要的是如果UILabel 中的文本出现在两行中,那么文本“indian ocean”应该显示在第二行,或者如果有足够的宽度可用,所有文本都应该出现在一行。

任何想法如何实现这一点。

【问题讨论】:

  • 缩小标签宽度?或强制换行? "I would like to ride a boat in\nindian ocean"
  • @Wezly,如果我减小宽度或强制换行,可能会导致 iPhone 6 和 iPad 设备出现问题。我不希望它发生。
  • @Wezly 我也想过这样做。据我所知,我认为这是实现这一目标的唯一方法。
  • @SuryaSubenthiran 你在使用自动布局约束吗?还是您以编程方式创建 UILabel?

标签: ios objective-c swift uilabel


【解决方案1】:

无需使用设备检测...使用一个技巧可以解决此问题“如果标签显示两行文本,则文本“印度洋”将显示第二行或将显示在第一行。

要遵循的步骤:

  1. 在属性检查器中将 UILabel 的文本类型从纯文本类型更改为属性。
  2. 将任何字符放在“印度洋”之间,例如“印度洋”。
  3. 选择该字符(在我的例子中,我使用了下划线“_”)并更改文本颜色并将不透明度设置为 0%(无需更改颜色,仅不透明度足以使透明,以便用户看不到字符) .

就是这样。

或跟随 gif 图片。

【讨论】:

    【解决方案2】:
    1. 您应该计算 iPhone 的宽度。
    2. 计算标签中的文本宽度。
    3. 如果文本宽度 > iPhone 宽度,则在新行中设置“印度洋”

    请检查以下代码:

    let screenRect = UIScreen.mainScreen().bounds;
    let screenWidth = screenRect.size.width;
    
    let text:String = self.label.text!
    let attr:NSDictionary = [NSFontAttributeName: self.label.font];
    let textSize = (text as NSString).sizeWithAttributes(attr as? [String : AnyObject])
    let textWidth = textSize.width
    
    if textWidth > screenWidth{
        self.label.text = "I would like to ride a boat in\nindian ocean"
    }
    

    【讨论】:

      【解决方案3】:

      这是一种解决方法。但这符合您的要求,无需确定运行应用程序的设备。通常UILabel 将单词包裹在whitespaces 周围。因此,您可能应该将indian ocean 设为一个单词,但仍应将其显示为两个单独的单词。

      let string = "<font size = 5 face = Avenir Next>I would like to ride a boat in<font color = white>_</font>indian ocean</font>"
      let attributedString = try? NSAttributedString(data: string.dataUsingEncoding(NSUTF8StringEncoding)!, options:[NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: NSUTF8StringEncoding], documentAttributes: nil)
      label.attributedText = attributedString
      

      您可以指定所需的字体大小、系列并将_的颜色设置为UILabelbackgroundColor

      【讨论】:

        【解决方案4】:
        label.numberOfLines = 0;
        label.text = @"I would like to ride a boat in indian ocean"; 
        [label sizeToFit];
        

        【讨论】:

          【解决方案5】:

          这是一个 UILabel 扩展,用于在同一行中显示连续的文本组件。 https://github.com/Umair-Bhatti/ConsecutiveComponents
          只需添加文件和以下代码行

          label.addConsectiveComponents(["indian ocean"])

          它将始终在一行中显示“印度洋”,即如果当前行中有空格,它将在下一行中显示。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-08-07
            • 1970-01-01
            • 2010-11-10
            • 1970-01-01
            • 1970-01-01
            • 2016-02-23
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多