UILabel上带有“+”文本无法垂直居中

3

enter image description here

self.iconLabel.frame = self.contentView.frame;

self.iconLabel.font = [UIFont systemFontOfSize:100.0];
self.iconLabel.text = @"+";
self.iconLabel.textColor = [UIColor blackColor];
self.iconLabel.textAlignment = NSTextAlignmentCenter;

所以UILabel的框架大小与其容器视图self.contentView相同。

我需要"+"符号垂直居中,我想要它在中心位置。

如何实现这一点?

我唯一的想法是将iconLabel.frame上移。

编辑:从self.iconImageView更改为UIView类型的self.contentViewUILabel位于UIImageView类型的self.iconImageView之上。

编辑2:尝试实现kshitij godara的代码,结果如下:

enter image description here

我稍微修改了代码:

CGSize constraint = CGSizeMake(self.contentView.frame.size.width, self.contentView.frame.size.height);

NSString *str = @"+";

UIFont *myFont = [UIFont systemFontOfSize:100.0];

CGSize stringSize = [str sizeWithFont:myFont constrainedToSize:constraint lineBreakMode:NSLineBreakByWordWrapping];

self.iconLabel.frame = CGRectMake(0, 0, stringSize.width, stringSize.height);
self.iconLabel.font = myFont;
self.iconLabel.lineBreakMode = NSLineBreakByWordWrapping;
self.iconLabel.numberOfLines = 0;
[self.iconLabel sizeToFit];
self.iconLabel.text = str;

编辑3:

这个框架相当大:

输入图像描述


iconLabel是否作为iconImageView的子视图添加?如果是,请使用iconImageView.bounds而不是frame。 - Eugene
我有一个contentView,它是一个UIView。iconImageView是一个UIImageView。iconImageView和iconLabel都在contentView中。我尝试将其从frame更改为bounds,但结果没有改变。 - Padin215
2个回答

4
这可能是字体本身的问题。每种字体都定义了它的形状、行为、排版等。该字体似乎将字符“+”定位于视觉垂直中心。您可以在包含字母“+”的任何其他字符串上进行测试,例如“dog+Cat”。加号字母可能会像您的图像上一样靠近底部绘制。
从我的角度来看,您有两个选择:
  • 使用图标图像替代“+”符号。这将是最简单和最有效的解决方案
  • 使用自定义字体进行编辑,以视觉上完全符合您的需求(字母“+”在其排版中完全居中)。这可能是非常痛苦和耗时的选项
编辑:关于第二个选项:我已经按照this tutorial修复了一些未对齐的字体。但它仍然只是固定整个字体,而不是单个字符的基础。

是的,如果我把加号"+"替换成"D",它就可以按预期工作了。我认为第三个选项,将“UILabel”上移,直到看起来像是居中对齐,将是最简单的解决方案。谢谢。 - Padin215
1
使用图像确实是最简单的解决方案。 - Sulthan

0
你可以做到这一点 - 尝试应用它。
CGSize constraint = CGSizeMake(iconImageFrame.size.width,1000.0f);

//Now Calculate size of string 

NSString *str = @"+";

//Always give the same font to calculate size which you giving for label 

UIFont *myFont = [UIFont systemFontOfSize:100.0];

CGSize stringSize = [str sizeWithFont:myFont 
                           constrainedToSize:constraint
                               lineBreakMode:UILineBreakModeWordWrap];
//now set same font for uilabel and also make it to fit to size 
//like this

UILabel *myLabel = [[UILabel alloc]initWithFrame:CGRectMake(myIconLabelFrame.x,myIconLabelFrame.y,stringSize.width,stringSize.height)];

myLabel.font = myFont;
myLabel.lineBreakMode = UILineBreakModeWordWrap;
myLabel.numberOfLines = 0;
[myLabelsizeToFit];
myLabel.text = str;

现在标签将完全适合大小,因此它将始终位于中心。该代码还可用于动态增加标签的高度。 希望它能解决您的问题。谢谢!


我实现了代码,但文本出现在它应该出现的位置下方。 :-? - Padin215
通过给uilabel设置背景颜色来检查它所占用的大小,看看它是否真正适合。 - kshitij godara
好的,已更改颜色,标签框架高度非常高。 - Padin215
请尝试将字体大小设置为小号,然后逐步增加以进行检查。 - kshitij godara
是的,我将字体缩小了,标签的框架变窄了,高度也缩小了,但仍然不是正确的形状。 - Padin215
显示剩余3条评论

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