如果我有一个UIButton安排使用自动布局,它的大小调整很好地适合它的内容。

如果我设置一个图像为按钮。图像,内在的大小似乎也解释了这一点。

然而,如果我调整按钮的titleEdgeInsets,布局不会考虑这一点,而是截断按钮标题。

我如何确保按钮的内在宽度占了嵌入?

编辑:

我正在使用以下:

[self.backButton setTitleEdgeInsets:UIEdgeInsetsMake(0, 5, 0, 0)];

目标是在图像和文本之间添加一些分隔。


当前回答

我使用的解决方案是在按钮上添加宽度限制。然后在初始化的某个地方,在你的文本设置好之后,像这样更新宽度约束:

self.buttonWidthConstraint.constant = self.shareButton.intrinsicContentSize.width + 8;

8是你的插入数。

其他回答

我使用的解决方案是在按钮上添加宽度限制。然后在初始化的某个地方,在你的文本设置好之后,像这样更新宽度约束:

self.buttonWidthConstraint.constant = self.shareButton.intrinsicContentSize.width + 8;

8是你的插入数。

这个线程有点老了,但我自己也遇到了这个问题,并且能够通过使用负插入来解决它。例如,在这里替换你想要的填充值:

UIButton* myButton = [[UIButton alloc] init];
// setup some autolayout constraints here
myButton.titleEdgeInsets = UIEdgeInsetsMake(-desiredBottomPadding,
                                            -desiredRightPadding,
                                            -desiredTopPadding,
                                            -desiredLeftPadding);

结合正确的自动布局约束,您最终会得到一个自动调整大小的按钮,其中包含图像和文本!如下所示,将desiredleftpa添加为10。

您可以看到按钮的实际帧并没有包含标签(因为标签向右移动了10个点,超出了边界),但是我们在文本和图片之间实现了10个点的填充。

Swift 3基于pegpeg的答案:

extension UIButton {

    override open var intrinsicContentSize: CGSize {

        let intrinsicContentSize = super.intrinsicContentSize

        let adjustedWidth = intrinsicContentSize.width + titleEdgeInsets.left + titleEdgeInsets.right
        let adjustedHeight = intrinsicContentSize.height + titleEdgeInsets.top + titleEdgeInsets.bottom

        return CGSize(width: adjustedWidth, height: adjustedHeight)

    }

}

你可以在Interface Builder中(不需要编写任何代码),通过使用消极和积极的标题和内容插入的组合来让它工作。

更新:Xcode 7有一个错误,你不能在右插入字段中输入负值,但你可以使用它旁边的步进控件来减小值。(感谢Stuart)

这样做将在图像和标题之间增加8pt的间距,并将增加相同数量的按钮的固有宽度。是这样的:

为什么不重写UIView上的intrinsicContentSize方法?例如:

- (CGSize) intrinsicContentSize
{
    CGSize s = [super intrinsicContentSize];

    return CGSizeMake(s.width + self.titleEdgeInsets.left + self.titleEdgeInsets.right,
                      s.height + self.titleEdgeInsets.top + self.titleEdgeInsets.bottom);
}

这应该告诉自动布局系统,它应该增加按钮的大小,以允许插入和显示全文。我不在我自己的电脑前,所以我还没有测试这个。