首页 > 解决方案 > 如何将 UILabel 的文本保留在 safeArea 内?

问题描述

我创建了一个自定义 UILabel 以便能够更改其安全区域,因此文本可以有一些填充并且看起来更好,但是在我更改我的 safeArea 之后,文本仍然从一个边缘一直到另一个边缘并且没有添加填充这里的我的代码

class customLabel: UILabel {

    override init(frame: CGRect) {
        super.init(frame: frame)
        setUp()

    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }



    override var safeAreaInsets: UIEdgeInsets {
        return UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
    }


    func setUp(){
        lineBreakMode = NSLineBreakMode.byWordWrapping
        numberOfLines = 0
        textColor = UIColor.white
        textAlignment = .center
        layer.cornerRadius = 8
        clipsToBounds = true
        backgroundColor = UIColor.black.withAlphaComponent(0.7)
        font = UIFont.boldSystemFont(ofSize: 20)
        translatesAutoresizingMaskIntoConstraints = false

    }

}

如何将文本保留在新的 safeAreaInset 中?

谢谢你!

标签: swiftxcodeuilabeluiedgeinsets

解决方案


safeAreaInsets不应用于文本填充。添加了安全区域以防止UIView导航栏、标签栏、工具栏等覆盖 的内容。因此,您可以在子类中覆盖此变量,以便在向的安全区域UIView添加约束时使其子视图可见。UIView但是由于 text inUILabel对 Safe Area 没有约束,因此覆盖此变量没有任何意义。

相反,您需要覆盖textRect(forBounds:limitedToNumberOfLines:)的方法UILabel

override func textRect(forBounds bounds: CGRect, limitedToNumberOfLines numberOfLines: Int) -> CGRect {
    return bounds.insetBy(dx: 10, dy: 10)
}

insetBy(dx:dy:)方法返回具有左右插图 fromdx和顶部和底部插图 from的矩形dy


推荐阅读