我想在两行文本的左边放置一个图标,这样在图像和文本开头之间就有2-3个像素的空间.控件本身水平居中对齐(通过Interface Builder设置)

该按钮类似如下所示:

|                  |
|[Image] Add To    |
|        Favorites |

我正在try 使用contentEdgeInset、imageEdgeInsets和titleEdgeInsets配置它,但无济于事.我知道负值会扩大边缘,而正值会缩小边缘以使其更接近中心.

我试过:

[button setTitleEdgeInsets:UIEdgeInsetsMake(0, -image.size.width, 0, 0)];
[button setImageEdgeInsets:UIEdgeInsetsMake(0, button.titleLabel.bounds.size.width, 0, 0)];

但是这不能正确显示它.我一直在调整这些值,但是假设从左边的-5到-10,插入值似乎没有以预期的方式移动.-10会将文本一直移到左侧,所以我预计会从左侧移到一半,但事实并非如此.

插图背后的逻辑是什么?我不熟悉图像放置和相关术语.

我用这个SO问题作为参考,但我的价值观有些地方不正确. UIButton: how to center an image and a text using imageEdgeInsets and titleEdgeInsets?

推荐答案

我同意imageEdgeInsetstitleEdgeInsets上的文档应该更好,但我知道如何在不诉诸try 和错误的情况下获得正确的定位.

这里的大意是this question,但这是在您希望文本和图像都居中的情况下.我们不希望图像和文本单独居中,我们希望图像和文本作为一个实体集中在一起.事实上,UIButton已经在这么做了,所以我们只需要调整间距即可.

CGFloat spacing = 10; // the amount of spacing to appear between image and title
tabBtn.imageEdgeInsets = UIEdgeInsetsMake(0, 0, 0, spacing);
tabBtn.titleEdgeInsets = UIEdgeInsetsMake(0, spacing, 0, 0);

我还把它变成了UIButton的一个类别,这样就很容易使用了:

UIButton+Position.h

@interface UIButton(ImageTitleCentering)

-(void) centerButtonAndImageWithSpacing:(CGFloat)spacing;

@end

UIButton+Position.m

@implementation UIButton(ImageTitleCentering)

-(void) centerButtonAndImageWithSpacing:(CGFloat)spacing {
    self.imageEdgeInsets = UIEdgeInsetsMake(0, 0, 0, spacing);
    self.titleEdgeInsets = UIEdgeInsetsMake(0, spacing, 0, 0);
}

@end

所以现在我要做的就是:

[button centerButtonAndImageWithSpacing:10];

每次我都能得到我想要的.无需再手动处理边缘插图.

EDIT: Swapping Image and Text

在 comments 中回复@Javal

使用同样的机制,我们可以交换图像和文本.要完成交换,只需使用负间距,但也要包括文本和图像的宽度.这将要求帧是已知的,并且已经执行了布局.

[self.view layoutIfNeeded];
CGFloat flippedSpacing = -(desiredSpacing + button.currentImage.size.width + button.titleLabel.frame.size.width);
[button centerButtonAndImageWithSpacing:flippedSpacing];

当然,您可能想为此创建一个很好的方法,可能会添加第二个类别方法,这将留给读者作为练习.

Ios相关问答推荐

在SwiftData中从@ Query创建可排序、有序和分组的数据

使用CGAffineTransform旋转视图只起作用一次吗?

在Swift5中,将某些属性值从一个类复制到另一个类实例

如何将Safari调试器附加到Turbo-iOS原生应用中的模拟器

使用标头UICollectionViewFlowLayout时的简单SwiftUI视图错误

CIKernel的Metal Shader裁剪问题

如何链式设置 AttributeContainer 的 UIKit 属性?

NavigationLink 只能在文本部分点击

更新 flutter 和 xcode 后 Xcode 14.3 中缺少文件 (libarclite_iphoneos.a)

为什么这个 SwiftUI 状态在作为非绑定参数传递时没有更新?

如何在 SwiftUI 中对表格行使用 Transferable

'DismissAction'类型的值没有成员'wrappedValue'在SwiftUI的Xcode中

如何快速设置条形按钮的图像?

本月使用 iOS 的天数?

iPhone 6 和 6 Plus 媒体查询

在 iOS 编程中使用 Storyboard 代替 xib 文件有什么好处?

为什么 Safari 在使用 iOS 6 设备进行远程调试时显示No Inspectable Applications?

如何在 iPhone 中为透明的 PNG 图像着色?

用户拒绝使用后如何提示用户打开位置服务

以编程方式创建按钮并设置背景图像