调整UILabel的大小以容纳插入内容

Jos*_*arl 62 iphone ios

我正在构建一个扫描条形码的屏幕,我需要在其后面放一个半透明屏幕,UILabels以提高对浅色背景的可见度.

这是屏幕现在的样子:

在此输入图像描述

我正在设置背景颜色UILabel以获得半透明的盒子.我还创建了一个自定义UILabel子类,允许我UILabel使用这种方法在文本的边缘和文本之间设置一些填充.

正如您在上面的屏幕中看到的UILabel那样,未正确调整大小以将填充考虑在内."填充"只是将文本移动而不更改标签的宽度,导致文本截断.

这两个标签都包含任意长度的文本,我真的需要UILabel动态调整大小.

UILabel可以覆盖哪种方法来增加标签的宽度和填充因子?

Nik*_*uhe 187

这是一个正确计算大小的标签类.该贴的代码是在斯威夫特3,但你也可以下载斯威夫特2Objective-C的版本.

它是如何工作的?

通过计算正确的textRect,所有sizeToFit和自动布局的东西都按预期工作.诀窍是首先减去插入,然后计算原始标签边界,最后再添加插入.

class NRLabel : UILabel {

    var textInsets = UIEdgeInsets.zero {
        didSet { invalidateIntrinsicContentSize() }
    }

    override func textRect(forBounds bounds: CGRect, limitedToNumberOfLines numberOfLines: Int) -> CGRect {
        let insetRect = UIEdgeInsetsInsetRect(bounds, textInsets)
        let textRect = super.textRect(forBounds: insetRect, limitedToNumberOfLines: numberOfLines)
        let invertedInsets = UIEdgeInsets(top: -textInsets.top,
                                          left: -textInsets.left,
                                          bottom: -textInsets.bottom,
                                          right: -textInsets.right)
        return UIEdgeInsetsInsetRect(textRect, invertedInsets)
    }

    override func drawText(in rect: CGRect) {
        super.drawText(in: UIEdgeInsetsInsetRect(rect, textInsets))
    }
}
Run Code Online (Sandbox Code Playgroud)

可选:Interface Builder支持

如果要在故事板中设置文本插入,可以使用以下扩展来启用Interface Builder支持:

@IBDesignable
extension NRLabel {

    // currently UIEdgeInsets is no supported IBDesignable type,
    // so we have to fan it out here:
    @IBInspectable
    var leftTextInset: CGFloat {
        set { textInsets.left = newValue }
        get { return textInsets.left }
    }

    // Same for the right, top and bottom edges.
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以在IB中方便地设置插图,然后只需按⌘=调整标签的大小即可.

免责声明:

所有代码都在公共领域.随你做.

  • 我建议添加`if text == nil {return super.textRectForBounds(bounds,limitedToNumberOfLines:numberOfLines)}`以在没有文本时"隐藏"标签.( (2认同)

Kla*_*aas 14

这是一个UILabel子类的Swift版本(与@ Nikolai的答案相同),它在UILabel的文本周围创建了一个额外的填充:

class EdgeInsetLabel : UILabel {
    var edgeInsets:UIEdgeInsets = UIEdgeInsetsZero

    override func textRectForBounds(bounds: CGRect, limitedToNumberOfLines numberOfLines: Int) -> CGRect {
        var rect = super.textRectForBounds(UIEdgeInsetsInsetRect(bounds, edgeInsets), limitedToNumberOfLines: numberOfLines)

        rect.origin.x -= edgeInsets.left
        rect.origin.y -= edgeInsets.top
        rect.size.width  += (edgeInsets.left + edgeInsets.right);
        rect.size.height += (edgeInsets.top + edgeInsets.bottom);

        return rect
    }

    override func drawTextInRect(rect: CGRect) {
        super.drawTextInRect(UIEdgeInsetsInsetRect(rect, edgeInsets))
    }
}
Run Code Online (Sandbox Code Playgroud)