如何向UILabel(iOS Swift)添加插图?

如何向UILabel(iOS Swift)添加插图?,ios,swift,Ios,Swift,我是一名学习iOS的Android开发者。如何在iOS Swift中向UILabel添加填充(插入)?我还没有成功地找到一个简单的教程。多谢各位 另外,如何在Swift中向UI元素添加边距?当我尝试下面的方法时,没有任何内容得到更新(点击“添加约束”) 最好的办法可能是将UILabel子类化,并覆盖drawTextInRect:,如下所示: class InsetLabel: UILabel { override func drawTextInRect(rect: CGRect) {

我是一名学习iOS的Android开发者。如何在iOS Swift中向UILabel添加填充(插入)?我还没有成功地找到一个简单的教程。多谢各位

另外,如何在Swift中向UI元素添加边距?当我尝试下面的方法时,没有任何内容得到更新(点击“添加约束”)


最好的办法可能是将
UILabel
子类化,并覆盖
drawTextInRect:
,如下所示:

class InsetLabel: UILabel {
    override func drawTextInRect(rect: CGRect) {
        super.drawTextInRect(UIEdgeInsetsInsetRect(rect, UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)))
    }
}
SWIFT 4+

class InsetLabel: UILabel {
    override func drawText(in rect: CGRect) {
        super.drawText(in: rect.inset(by: UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)))
    }
}
需要添加以下内容:

class InsetLabel: UILabel {
let topInset = CGFloat(12.0), bottomInset = CGFloat(12.0), leftInset = CGFloat(12.0), rightInset = CGFloat(12.0)

override func drawTextInRect(rect: CGRect) {
    let insets: UIEdgeInsets = UIEdgeInsets(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset)
    super.drawTextInRect(UIEdgeInsetsInsetRect(rect, insets))
}

override func intrinsicContentSize() -> CGSize {
    var intrinsicSuperViewContentSize = super.intrinsicContentSize()
    intrinsicSuperViewContentSize.height += topInset + bottomInset
    intrinsicSuperViewContentSize.width += leftInset + rightInset
    return intrinsicSuperViewContentSize
}
}

这是您需要在Swift 3中添加的代码:

class InsetLabel: UILabel {
    let topInset = CGFloat(0)
    let bottomInset = CGFloat(0)
    let leftInset = CGFloat(20)
    let rightInset = CGFloat(20)

    override func drawText(in rect: CGRect) {
        let insets: UIEdgeInsets = UIEdgeInsets(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset)
        super.drawText(in: UIEdgeInsetsInsetRect(rect, insets))
    }

    override public var intrinsicContentSize: CGSize {
        var intrinsicSuperViewContentSize = super.intrinsicContentSize
        intrinsicSuperViewContentSize.height += topInset + bottomInset
        intrinsicSuperViewContentSize.width += leftInset + rightInset
        return intrinsicSuperViewContentSize
    }
}

有一个简单地使用故事板的解决方案。在情节提要中,创建一个UIView对象,其目的是围绕标签,以便为其提供填充。然后,也从情节提要中,将UILabel放在该视图中。现在选择UILabel对象,并通过单击“Pin”图标打开添加新约束弹出窗口。如果要在UILabel周围填充5,请单击“添加新约束”弹出窗口中的4个红色工字梁,然后在工字梁相邻的4个框中分别键入5。如果先键入5,然后单击工字梁,则XCode将恢复为键入5之前框中的任何值。最后单击添加约束按钮

在“添加约束”弹出窗口中,XCode忽略未单击相应红色工字梁的顶部、左侧、右侧或底部约束值。这可能回答了你问题的第二部分


还请记住设置您添加的UIView的约束。如果您没有定义它在情节提要中的位置(例如,固定在视图控制器主视图的顶部和左侧),它将不会被分配默认位置,并且在您运行应用程序时可能根本不会显示它。

另一种方法是覆盖textRect:forBounds:LimitedToNumberOfflines:

返回标签文本的图形矩形。覆盖这个 需要更改标签边界的子类中的方法 在系统执行其他文本布局之前出现的矩形 计算。使用numberOfLines参数中的值来限制 返回矩形到指定行数的高度 文本的格式。如果存在以前的错误,系统可能会调用此方法 调用sizeToFit()或sizeThatFits(:)方法。请注意,标签 在UITableViewCell中,单元对象的大小基于单元尺寸,而不是单元尺寸 按要求的尺寸


我已经在Swift 4.2上试用过了,希望它对你有用

@IBDesignable class PaddingLabel: UILabel {

    @IBInspectable var topInset: CGFloat = 5.0
    @IBInspectable var bottomInset: CGFloat = 5.0
    @IBInspectable var leftInset: CGFloat = 7.0
    @IBInspectable var rightInset: CGFloat = 7.0

    override func drawText(in rect: CGRect) {
        let insets = UIEdgeInsets.init(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset)
        super.drawText(in: rect.inset(by: insets))
    }

    override var intrinsicContentSize: CGSize {
        let size = super.intrinsicContentSize
        return CGSize(width: size.width + leftInset + rightInset,
                      height: size.height + topInset + bottomInset)
    }    
}

你可以在这里用椰子荚


pod“PaddingLabel”、“1.1”

我是Swift的新手。我该如何使用它?我对斯威夫特和iOS都是新手@Sebyddd@andy7586-我更新了答案。将类“UILabel”的标签改为类“InsetLabel”,而不是将其改为类“UILabel”。在.swift文件的某个地方添加这个类实现。还有一个问题,我如何向任何UI元素添加边距?当我尝试手动设置时(请参阅更新的问题),没有任何内容得到更新。此外,我不明白您如何使用该类。你能提供一个你如何使用它的一步一步吗?现在文本被删掉了。它会被截断@sebydd发布您尝试的代码段。那你就可以很快把它整理出来了!除非标签上有sizeToFit(),否则farThis的最佳解决方案是有效的。然后,标签和视图相互依赖,什么也不做。将此子类添加到UIStackView时,有时会在控制台中导致以下警告:“此NSLayoutConstraint配置的常量超过了内部限制。将替换较小的值,但应修复此问题。在BOOL _NSLAYOUTSCONSTRAINTNUMBEREXCEEDSLIMIT(void)上中断以进行调试。这将只记录一次。这可能会在将来中断。“所以请小心使用。我希望有一种方法可以做到这一点,而无需子类化。我目前正在从事一个项目,该项目能够使用一些预定义的样式设置应用程序中的所有UILabel样式,但它不支持子类UILabel。也许这就是我问题的解决方案。。。
@IBDesignable class PaddingLabel: UILabel {

    @IBInspectable var topInset: CGFloat = 5.0
    @IBInspectable var bottomInset: CGFloat = 5.0
    @IBInspectable var leftInset: CGFloat = 7.0
    @IBInspectable var rightInset: CGFloat = 7.0

    override func drawText(in rect: CGRect) {
        let insets = UIEdgeInsets.init(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset)
        super.drawText(in: rect.inset(by: insets))
    }

    override var intrinsicContentSize: CGSize {
        let size = super.intrinsicContentSize
        return CGSize(width: size.width + leftInset + rightInset,
                      height: size.height + topInset + bottomInset)
    }    
}