您无需覆盖任何方法或设置任意宽度约束即可解决此问题.您可以在Interface Builder中完成所有操作,如下所示.
固有按钮宽度是从标题宽度加上图标宽度加上左和右content个边缘插入物得出的.
如果按钮同时具有图像和文本,则它们作为一个组居中,中间没有填充.
如果添加左边的内容插页,它是相对于文本计算的,而不是相对于文本+图标计算的.
如果将左侧图像设置为负插页,则图像将向左拉出,但整体按钮宽度不受影响.
如果设置为负的左侧图像插图,则实际布局将使用该值的一半.因此,要获得-20磅的左插入值,必须在Interface Builder中使用-40磅的左插入值.
因此,您提供了足够大的左侧内容插页,以便为所需的左侧插页and(图标和文本之间的内部填充)创建空间,然后通过将图标和文本之间的填充量加倍来向左移动图标.结果是一个左右内容插页相等的按钮,以及一个文本和图标对,它们作为一个组居中,它们之间有特定的填充量.
一些示例值:
// 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)