小编典典

自动布局 - UIButton 的固有大小不包括标题插图

all

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

如果我将图像设置为button.image,则内在尺寸似乎再次说明了这一点。

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

如何确保按钮的固有宽度占插图?

在此处输入图像描述

编辑:

我正在使用以下内容:

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

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


阅读 122

收藏
2022-06-09

共1个答案

小编典典

您无需重写任何方法或设置任意宽度约束即可解决此问题。您可以在 Interface Builder 中完成所有操作,如下所示。

  • 固有按钮宽度来自标题宽度加上图标宽度加上左右 内容 边缘插图。

  • 如果按钮同时具有图像和文本,它们将作为一个组居中,中间没有填充。

  • 如果您添加左侧内容插图,它是相对于文本计算的,而不是文本 + 图标。

  • 如果您设置负左图像插入,图像被拉到左侧,但整体按钮宽度不受影响。

  • 如果您设置负左图像插图,则实际布局使用该值的一半。因此,要获得 -20 点左插图,您必须在 Interface Builder 中使用 -40 点左插图值。

因此,您提供了一个足够大的左侧内容插图,以便为所需的左侧插图
图标和文本之间的内部填充创建空间,然后通过将您想要的图标和文本之间的填充量加倍来将图标向左移动。结果是一个具有相同左右内容插入的按钮,以及作为一组居中的文本和图标对,它们之间具有特定数量的填充。

一些示例值:

// Produces a button with the layout:
// |-20-icon-10-text-20-|
// AutoLayout intrinsic width works as you'd desire.
button.contentEdgeInsets = UIEdgeInsetsMake(10, 30, 10, 20)
button.imageEdgeInsets = UIEdgeInsetsMake(0, -20, 0, 0)
2022-06-09