首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >动态设置UILabel与.left和.justified之间的文本对齐

动态设置UILabel与.left和.justified之间的文本对齐
EN

Stack Overflow用户
提问于 2016-11-04 17:24:21
回答 1查看 304关注 0票数 0

在我的应用程序中,我有一个预置两行的UILabel。我可以将文本对齐设置为.left.justified

如果我将其设置为.left,如果在一行的最后一个单词与标签的最大x位置之间有足够的空间,就没有布局问题。然而,当没有太多的空间,以至于最后一个词非常接近最大x位置时,它看起来有点奇怪,因为它不是完全对齐的(就像对.justified那样)。

如果我把它设置为.justified,它总是对齐得很好,但是有时单个字符之间的距离看起来很奇怪。

我要寻找的是一种动态调整文本对齐的方法,这取决于第一行中最后一个单词到标签的最大x位置之间的距离。比方说,如果最后一个单词的最后一个字符的位置小于50,我想要文本对齐.left,否则我想要.justified。有什么办法可以做到这一点吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-06 12:35:59

我采取了一种相当麻烦的方法,这需要一些处理能力,但它似乎是可行的。

首先,我使用以下扩展名获取标签第一行中的字符串:

代码语言:javascript
运行
复制
import CoreText

extension UILabel {

   /// Returns the String displayed in the first line of the UILabel or "" if text or font is missing
   var firstLineString: String {

    guard let text = self.text else { return "" }
    guard let font = self.font else { return "" }
    let rect = self.frame

    let attStr = NSMutableAttributedString(string: text)
    attStr.addAttribute(String(kCTFontAttributeName), value: CTFontCreateWithName(font.fontName as CFString, font.pointSize, nil), range: NSMakeRange(0, attStr.length))

    let frameSetter = CTFramesetterCreateWithAttributedString(attStr as CFAttributedString)
    let path = CGMutablePath()
    path.addRect(CGRect(x: 0, y: 0, width: rect.size.width + 7, height: 100))
    let frame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, 0), path, nil)

    guard let line = (CTFrameGetLines(frame) as! [CTLine]).first else { return "" }
    let lineString = text[text.startIndex...text.index(text.startIndex, offsetBy: CTLineGetStringRange(line).length-2)]

    return lineString
  }
}

在计算宽度之后,使用以下扩展名的字符串需要有一行1和固定高度的标签:

代码语言:javascript
运行
复制
extension UILabel {

   /// Get required width for a UILabel depending on its text content and font configuration
   class func calculateWidth(text: String, height: CGFloat, font: UIFont) -> CGFloat {

       let label = UILabel(frame: CGRect(x: 0, y: 0, width: CGFloat.greatestFiniteMagnitude, height: height))
       label.numberOfLines = 1
       label.font = font
       label.text = text
       label.sizeToFit()

       return label.frame.size.width
   }
}

基于此,我可以计算向右的距离,并决定是选择文本对齐.left还是.justified,所以主要代码如下所示:

代码语言:javascript
运行
复制
// Set text
myLabel.text = someString

// Change text alignment depending on distance to right
let firstLineString = myLabel.firstLineString
let distanceToRight = myLabel.frame.size.width - UILabel.calculateWidth(text: firstLineString, height: myLabel.frame.size.height, font: myLabel.font)
myLabel.textAlignment = distanceToRight < 20 ? .justified : .left
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40428504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档