以编程方式创建的 UILabel 未在旋转时调整大小
Posted
技术标签:
【中文标题】以编程方式创建的 UILabel 未在旋转时调整大小【英文标题】:Programmatically created UILabel not resizing on rotate 【发布时间】:2012-07-15 13:33:17 【问题描述】:以编程方式创建多行 UILabel、将其添加到 UIView 并将 UIView 添加到视图控制器以便在方向更改时正确调整大小的最佳方法是什么?
我看到类似的问题以前被问过很多次,但我没有找到针对我的特殊情况的任何解决方案。我有一个视图,我正在尝试添加一个多行 UILabel。我想出的代码添加了标签,但它始终是横向模式下视图的宽度。旋转 iPad 会导致整个应用程序按预期旋转,除了 UILabel 太宽。我确信答案在于.autoresizingMask
或.sizeToFit
或.autoresizesSubviews
属性的某种组合,但到目前为止我还没有得到它。到目前为止,这是我的代码
UIViewController *vc = [[UIViewController alloc] init];
vc.title = @"Welcome";
// tbc is an instance of the tab bar controller that this view will go into
UILabel *copy = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, tbc.view.frame.size.width, MAXFLOAT)];
NSString *copyText = @"Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.";
UIFont *copyFont = [UIFont fontWithName:@"HoeflerText-Regular" size:20.0f];
[copy setContentMode:UIViewContentModeScaleAspectFit];
[copy setText:copyText];
[copy setFont:copyFont];
[copy setNumberOfLines:0];
[copy setLineBreakMode:UILineBreakModeWordWrap];
[copy setAutoresizingMask:UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleBottomMargin|UIViewAutoresizingFlexibleRightMargin];
CGRect frame = copy.frame;
frame.origin.x = 50;
frame.origin.y = 100;
frame.size.width = tbc.view.frame.size.width;
frame.size.height = tbc.view.frame.size.height - 100;
[copy setFrame:frame];
[copy sizeToFit];
UIView *content = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tbc.view.frame.size.width, vc.view.frame.size.height)];
[content setAutoresizesSubviews:YES];
[content addSubview:copy];
[content sizeToFit];
[vc.view setAutoresizesSubviews:YES];
[vc.view setContentMode:UIViewContentModeScaleAspectFit];
[vc.view addSubview:content];
正如我所说,我确定我在 .autoresizeMask
上遗漏了一些东西,但我已经为此苦苦挣扎了几天,所以我觉得我已经尝试了所有方法。任何建议将不胜感激。
【问题讨论】:
天哪,你真的只是在一个框架中使用了MAXFLOAT
吗?
不,绝对太小了。显然,ios 设备的长度为 ((float)3.40282346638528860e+38) 像素。
【参考方案1】:
只需添加:
[content setAutoresizingMask:UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleBottomMargin|UIViewAutoresizingFlexibleRightMargin];
当你说:
setContentMode:
,您只是在告诉视图如何在边界发生变化时调整子视图的大小,但是,边界并没有改变! (因为缺少自动调整大小的掩码标志)
如果 vc 是从 NIB 加载的 viewController,请仔细检查 NIB 文件中视图的自动调整大小选项,否则,也要为其添加自动调整大小掩码标志。
【讨论】:
也将行数设置为零。 这就是我所缺少的。我实际上不得不删除UIViewAutoresizingFlexibleBottomMargin|UIViewAutoresizingFlexibleRightMargin
标志,但在父视图上设置autoresizingMask
是主要问题。谢谢!以上是关于以编程方式创建的 UILabel 未在旋转时调整大小的主要内容,如果未能解决你的问题,请参考以下文章