UIButton图像位置取决于titleLabel的框架

3

我的问题非常简单,但是我找不到解决方案。我有一个带有标题和图像的UIButton。我希望图像位置无论发生什么都保持不变,因此我这样设置:

[button setImageEdgeInsets:UIEdgeInsetsMake(0.f, 0.f, 0.f, IS_IPHONE ? 20.f : 60.f)];

我没有为按钮的titleLabel设置任何位置。
接下来发生的是我为按钮设置新标题,标题标签会根据新文本缩小或扩大,并且令人惊讶的是它会使图像移动,因此尽管应用了图像边缘插图,但图像位置取决于标签的框架。 我看到有两个解决方案可供使用:
1)使图像独立于标签的框架
2)为标签设置固定大小
但我不知道如何实现这两种方法。 请给我一些建议,如何解决这个问题?

1
жӮЁеҸҜд»ҘиҺ·еҸ–UIButtonж Үйўҳж Үзӯҫж–Үжң¬зҡ„CGSizeпјҢ然еҗҺеўһеҠ UIButtonзҡ„е®ҪеәҰгҖӮ - Kampai
2
你可能想要查看这个链接:https://dev59.com/VG455IYBdhLWcg3wD_wB - Nirav Bhatt
1
正如@NiravBhatt所建议的那样,尝试设置标题的插图。 - The dude
3个回答

6
你可以继承UIButton并管理图像和标题的矩形。 重写以下方法,并根据您的要求返回适当的图像和标题矩形。
-(CGRect)imageRectForContentRect:(CGRect)contentRect;

-(CGRect)titleRectForContentRect:(CGRect)contentRect;

5
要在Interface Builder中解决此问题,请按照以下步骤操作。
首先,设置按钮的图像和文本。然后,您需要在图像和按钮之间创建一些空间。这需要两个步骤: 1)将左侧内容插入设置为10个点 2)然后将图像插入设置为负10个点
步骤1: 将内容插入左侧属性设置为10个点 步骤2: 将图像插入左侧属性设置为负10个点 然后,为了强制使按钮向右扩展文本,只需添加一个左侧约束: 添加顶部和左侧约束 您不能仅使用标题左插入的原因是,这样您的标题将被截断: 输入图像描述 这是因为仅使用内容插入来计算内在按钮大小,而不考虑标题和图像插入。

1
这是因为设置UIButton的图像插入和标题插入。 您可以尝试上述@mehul patel,@Nirav BHatt和@The dude提供的建议。 或者您可以尝试以下方法:在此假设您的图像位于按钮中的第一位,然后是titleLabel。
 //-------- Create button ---------
UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(50, 100, 100, 40)];
btn.backgroundColor = [UIColor cyanColor];

//----- Create imageview --------
UIImageView *imgView = [[UIImageView alloc]initWithFrame:CGRectMake(10, 10, 20, 20)];
imgView.image = [UIImage imageNamed:@"your_image_name.png"];

//----- Create Name label -----------
UILabel *nameLabel = [[UILabel alloc]initWithFrame:CGRectMake(imgView.frame.origin.x+imgView.frame.size.width+10, 0, 80, btn.frame.size.height)];
nameLabel.backgroundColor = [UIColor blueColor];
nameLabel.textAlignment = NSTextAlignmentLeft;
nameLabel.textColor = [UIColor whiteColor];
nameLabel.font = [UIFont fontWithName:@"HelveticaNeue-Bold" size:14];
nameLabel.text = @"your title label";
nameLabel.adjustsFontSizeToFitWidth = YES;
[nameLabel sizeToFit];

//-------- Resize button frame ----------
btn.frame = CGRectMake(btn.frame.origin.x, btn.frame.origin.y, nameLabel.frame.origin.x+nameLabel.frame.size.width+10, btn.frame.size.height);
[btn addSubview:nameLabel];
[btn addSubview:imgView];

您可以添加图像和标签,反之亦然(首先是标签,然后是图像),然后根据其更新按钮的框架。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接