为啥在 Interface Builder 中更改字体大小会阻止 UILabel 调整大小以适应内容?
Posted
技术标签:
【中文标题】为啥在 Interface Builder 中更改字体大小会阻止 UILabel 调整大小以适应内容?【英文标题】:Why does changing font size in Interface Builder prevent UILabel resizing to fit content?为什么在 Interface Builder 中更改字体大小会阻止 UILabel 调整大小以适应内容? 【发布时间】:2012-10-10 14:26:14 【问题描述】:我有一个使用 Xcode 4.5 构建并在 ios6 模拟器上运行的简单测试应用程序
它只是一个带有 UIScrollView 的 UIViewController,在 UIScrollView 中只有一个 UILabel。
我在界面构建器中将 UILabel 中的 NumberOfLines 设置为 0,并将其设置为 ScrollView 中的全宽 - 但高度只有大约 30 个点。我还将 UIScrollView 设置为仅垂直滚动。我为两个 UI 组件设置了几个 IBOutlets,并将文件的所有者设置为 UIScrollView 的委托(并放在 UIViewController 标头上。)
在 viewDidLoad 中,我只是将标签的文本设置为一个不错的长字符串。
- (void)viewDidLoad
[super viewDidLoad];
self.txtLabel2.text = @"`Twas brillig, and the slithy toves - Did gyre and gimble in the wabe: - All mimsy were the borogoves, - And the mome raths outgrabe. ";
然后在 ViewDidAppear 中我将滚动视图的内容大小设置为 UILabel 的大小:
-(void)viewDidAppear:(BOOL)animated
self.scrollView.contentSize = self.txtLabel2.bounds.size;
这似乎运作良好 - UILabel 会自动调整其高度,并将滚动视图设置为正确的高度并在文本中很好地滚动。太好了。
但是,我显然在这里做了一些严重的错误 - 因为如果我进入界面构建器并将 UILabel 的字体大小从默认值 (17.0) 更改为任何其他值 - 它就会停止工作。标签不再调整大小并在第一行被截断。
我已尝试手动调整 UILabel 的大小 - 例如使用此处建议的解决方案:
Sizing a UILabel to fit?
并在我设置内容时使用扩展:
self.txtLabel2.text = @"`Twas brillig, and the slithy toves - Did gyre and gimble in the wabe: - All mimsy were the borogoves, - And the mome raths outgrabe. ";
//use the current width - resize the height
[self.txtLabel2 sizeToFitFixedWidth:self.txtLabel2.bounds.size.width];
但这似乎没有任何效果。
我不明白为什么更改字体大小会改变 UILabel 自动调整大小的行为,我不知道为什么手动设置 UILabel 的大小没有效果。这里发生了什么? (还有——我应该做些什么不同的事情,以免我一开始就陷入这种混乱!)
【问题讨论】:
这是一个非常简单的小应用程序——我可以从头开始并获得相同的结果。有人能重现这种效果吗? 【参考方案1】:我不知道为什么您的代码不起作用,因为有多种可能性 但是跟随代码是您代码的不错选择
int scrollViews_fixed_width = self.scrollView.bounds.size.width;
self.txtLabel2.lineBreakMode = UILineBreakModeWordWrap;
self.txtLabel2.numberOfLines = 0;
UIFont *font = [UIFont fontWithName:@"Helvetica" size:14.0];//Choose Your Font this is default font
CGSize constraintSize = CGSizeMake(scrollViews_fixed_width, 555);// Choose big value max possible height of textLabel or leave it 555 this will be enough
float calculatedHeight = [@"Your Long String" sizeWithFont:font constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap].height;
self.txtLabel2.frame = CGRectMake(0,0,scrollViews_fixed_width,calculatedHeight);
self.scrollView.contentSize = CGSizeMake(scrollViews_fixed_width, calculatedHeight);
您可能需要在高度上添加一些偏移量,因为上面的代码计算没有考虑 如果您对上述内容感到满意,则空格投注线不要使用 foll 实现 为此使用小字符串计算单行的高度,然后使用 no_of_lines = computedHeight/ single_line_height_calculated_using_small_string 然后根据 no 对高度添加一些额外的偏移量。行数
【讨论】:
这是另一种设置 UILabel 大小和 UIScrollView 内容大小的技术 - 但是它与原始问题中的方法具有完全相同的行为(即它似乎只适用于 17.0 的字体大小)以上是关于为啥在 Interface Builder 中更改字体大小会阻止 UILabel 调整大小以适应内容?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的自定义类没有出现在 Interface Builder 的下拉列表中?
为啥新类不会出现在 Interface Builder 的 Identity Inspector/Custom Class 中?
在 Interface Builder 中更改 UILabel 上的字符间距
在 Interface Builder 中使用大小类更改字体大小