在iOS 7中包装时“UILabel”文本布局“错误”

时间:2013-10-02 20:25:01

标签: uilabel ios7

以下屏幕截图位于iOS 7中。label1(黄色,顶部)绘制时,文本原点位于其框架的左上方,并在底部剪裁。在iOS 5/6中,文本原点位于标签框的左上角。 <{1}}和label2按预期渲染和布局。

enter image description here

以下是生成此视图的代码:

label3

问题:为什么这在iOS 7中有所不同,我需要更改哪些标签属性才能让- (void)loadView { UIView *view = [[UIView alloc] initWithFrame:UIScreen.mainScreen.applicationFrame]; view.backgroundColor = UIColor.blueColor; self.view = view; UILabel *label1 = [UILabel new]; label1.backgroundColor = UIColor.yellowColor; label1.font = [UIFont systemFontOfSize:16.0f]; label1.numberOfLines = 0; label1.lineBreakMode = NSLineBreakByWordWrapping; label1.frame = CGRectMake(50, 100, 200, 18); label1.text = @"This text is too long to fit on one line."; [self.view addSubview:label1]; UILabel *label2 = [UILabel new]; label2.backgroundColor = UIColor.greenColor; label2.font = [UIFont systemFontOfSize:16.0f]; label2.numberOfLines = 0; label2.lineBreakMode = NSLineBreakByWordWrapping; label2.frame = CGRectMake(50, 150, 200, 36); label2.text = @"This text is too long to fit on one line."; [self.view addSubview:label2]; UILabel *label3 = [UILabel new]; label3.backgroundColor = UIColor.orangeColor; label3.font = [UIFont systemFontOfSize:16.0f]; label3.numberOfLines = 0; label3.lineBreakMode = NSLineBreakByWordWrapping; label3.frame = CGRectMake(50, 200, 200, 18); label3.text = @"This text is short."; [self.view addSubview:label3]; } 中的文字从其框架的左上角开始渲染。

1 个答案:

答案 0 :(得分:8)

我明白了。而不是删除我的问题,我会在这里回答它,所以如果有其他人遇到这个,他们知道该怎么做。

标签框架硬编码为特定尺寸。在label1的情况下,高度为18.此界限不足以渲染具有16点系统字体的文本行。 iOS 5/6显然顶部对齐文本rect,而在iOS 7中这会导致不可预测的行为。此修复是为了确保标签边界足够高,以显示至少一行文本。

问题中的示例代码是为了重现此问题。我的实际应用程序代码根据所需的行数计算标签高度,并在标签周围放置各种其他视图,以便在运行时动态更改框架。我通过确保最小标签高度可以适合单行文本来解决我的应用中的问题。