UILabel的边框和填充

13

我想在标签内部添加填充,以便它与其边框之间有空隙。为此,我创建了一个继承自UILabel的类。

UILabelPadding.swift:

import UIKit

class UILabelPadding: UILabel {

    let padding = UIEdgeInsets(top: 30, left: 30, bottom: 30, right: 30)
    override func drawText(in rect: CGRect) {
        super.drawText(in: UIEdgeInsetsInsetRect(rect, padding))
    }

   override var intrinsicContentSize : CGSize {
        let superContentSize = super.intrinsicContentSize
        let width = superContentSize.width + padding.left + padding.right
        let heigth = superContentSize.height + padding.top + padding.bottom
        return CGSize(width: width, height: heigth)
    }

    override func sizeThatFits(_ size: CGSize) -> CGSize {
        let superSizeThatFits = super.sizeThatFits(size)
        let width = superSizeThatFits.width + padding.left + padding.right
        let heigth = superSizeThatFits.height + padding.top + padding.bottom
        return CGSize(width: width, height: heigth)
    }


}

我将myLabel的类型从UILabel更改为UILabelPadding。在我的UIViewController中,我设置了myLabel的文本,调用了sizeToFit()方法后,添加了边框和背景颜色到myLabel上:

   myLabel.text = "label test"
   myLabel.sizeToFit()
    //background + border
    myLabel.layer.borderColor  = UIColor(red: 27/255, green: 100/255, blue: 90/255,  alpha: 1.0).cgColor
    myLabel.layer.backgroundColor = UIColor(red: 27/255, green: 100/255, blue: 90/255,  alpha: 1.0).cgColor
    myLabel.layer.cornerRadius = 9
    myLabel.layer.masksToBounds = true
    myLabel.layer.borderWidth = 1

边框和背景颜色已添加,但填充无效。调试时,sizeThatFits()从未被调用。

请帮忙解决问题,谢谢!


尝试这种方式:myLabel.sizeThatFits(CGSizeMake(LABEL_WIDTH, CGFLOAT_MAX)) - Nazmul Hasan
我需要尝试使用UILabel类型吗?高度呢? - Ne AS
我测试了一下,但是因为我使用的是最新版本的Xcode(即8.0版),所以在Swift中无法使用cgsizemake,出现了这个错误。 - Ne AS
这是Swift3的代码:myLabel.sizeThatFits(CGSize(width: LABEL_WIDTH, height: CGFLOAT_MAX)) - Nazmul Hasan
我得到了这个错误信息:“uilabel的类型没有cgsize成员”。 - Ne AS
3个回答

35

我解决了这个问题!

对于那些面临相同问题的人:

1- 创建一个继承自UILabel的类:

UILabelPadding.swift:

class UILabelPadding: UILabel {

    let padding = UIEdgeInsets(top: 2, left: 8, bottom: 2, right: 8)
    override func drawText(in rect: CGRect) {
        super.drawText(in: rect.inset(by: padding))
    }

    override var intrinsicContentSize : CGSize {
        let superContentSize = super.intrinsicContentSize
        let width = superContentSize.width + padding.left + padding.right
        let heigth = superContentSize.height + padding.top + padding.bottom
        return CGSize(width: width, height: heigth)
    }



}

2- 将您的标签类型设置为UILabelPadding,并确保在Storyboard中也设置了该类型。


但是当我使用你的代码时,我的标签高度没有根据文本设置,标签文本会按填充截断。 - Nidhi Patel
@NidhiPatel 你将高度属性设置为固定值,移除它,这样你的标签高度就会自适应。 - Naveed Ahmad
1
哦,你救了我!描述得非常好!非常感谢! - Lukáš Unzeitig
很棒的东西。谢谢。顺便提一下,如果您将填充设置为变量,则可以从视图内部设置它。 - Darren
超级棒! :) - ibyte

5
我使用了一个标签子类,它和你描述的很相似。代码如下所示:

class MyBoundedLabel: UILabel {
    override func drawText(in rect: CGRect) {
        let context = UIGraphicsGetCurrentContext()!
        context.stroke(self.bounds.insetBy(dx: 1.0, dy: 1.0))
        super.drawText(in: rect.insetBy(dx: 5.0, dy: 5.0))
    }
}

你可以尝试这样做,然后调整数字和其他细节,使其看起来符合你的要求。

请问dx和dy是什么? - Ne AS
没有什么需要解释的。这是一段可以直接运行的代码。这些都是内置方法。 - matt
“不起作用”是什么意思?我向您保证它是有效的。我必须建议,也许您的标签不是MyBoundedLabel。代码来自这里:https://github.com/mattneub/Programming-iOS-Book-Examples/tree/master/bk1ch10p418subclassing 这是一个可下载的项目,您可以在自己的机器上下载和运行,您将亲眼看到它确实有效。 - matt

0

我在我的应用程序中使用了这个解决方案。请查看下面的代码。

class CustomLabel: UILabel {
        
        var textInsets = UIEdgeInsets.zero {
            didSet { invalidateIntrinsicContentSize() }
        }
        
        override func textRect(forBounds bounds: CGRect, limitedToNumberOfLines numberOfLines: Int) -> CGRect {
            let textRect = super.textRect(forBounds: bounds, limitedToNumberOfLines: numberOfLines)
            let invertedInsets = UIEdgeInsets(top: -textInsets.top,
                                              left: -textInsets.left,
                                              bottom: -textInsets.bottom,
                                              right: -textInsets.right)
            return textRect.inset(by: invertedInsets)
        }
        
        override func drawText(in rect: CGRect) {
            super.drawText(in: rect.inset(by: textInsets))
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接