我已经通过故事板在我的滚动视图底部添加了一个UILabel
,其中包含固定的初始高度。
通过UIViewContoller
,我为UILabel
提供了白色背景和圆角,并动态地将文字加载到标签中。
我想要做的是根据文字调整标签高度。 我已经阅读了关于如何执行此操作的大量有关stackoverflow的帖子并尝试了所有这些帖子,但它们似乎都没有。
为了解决这个问题,我使用以下代码:
descriptionLabel.numberOfLines = 0;
descriptionLabel.text = @"Nam nisi arcu, sodales vitae scelerisque sit amet. Nam nisi arcu, sodales vitae scelerisque sit amet. Nam nisi arcu, sodales vitae scelerisque sit amet.";
[descriptionLabel sizeToFit];
这样做的结果就是标签会像这样剪切文字:
我想到的是sizeToFit使用UILabel的初始高度来确定最大高度,因此在故事板中我将其更改为250。 结果非常奇怪,文本垂直对齐在标签中,如下所示:
(我无法显示标签的整个高度,因为scrollView会将其剪掉)
如果我NSLog
UILabel
sizeToFit
之后的UILabel
的高度,我会正确地看到标签的高度是105像素,但标签绝对没有显示高度
我非常感谢一些帮助,因为这个问题让我忙了一个星期。
更新:根据要求提供一些其他信息。
通过RESTkit从服务器接收一些JSON后调用调整viewDidLoad
大小的代码。 dispatch_async()
执行通过UILabel
加载数据的函数。
标签的属性是:
换行符:自动换行
自动收缩:最小字体大小(10)
收紧字母间距已关闭,自动调整次级视图已开启。
包含UIScrollView
的容器是sizeToFit
。我在调用{{1}}之后自动调整了scrollview 的高度。
滚动视图的查看模式设置为缩放至填充,并且自动调整子视图已启用。
答案 0 :(得分:5)
这里可能存在一些问题。
在调用sizeToFit后,我自动调整了scrollview的高度。该 scrollview的视图模式设置为Scall to Fill和Autoresize 子视图已打开。
这可能是个问题。致电sizeToFit
正在尝试调整标签大小。但是,如果您稍后调整滚动视图的大小,和您的滚动视图设置为自动调整子视图,则可能会再次调整标签大小。 sizeToFit
应该是您在标签上调整的 last 。
另外,当你说“自动调整滚动视图的高度”时,我不是100%肯定你的意思。我认为您应该做的是在获得JSON响应后,确定所有标签的大小,然后设置滚动视图的内容大小。滚动视图的frame
大小(高度)不应更改。
如果您阅读the UILabel documentation,则会说:
<强> adjustsFontSizeToFitWidth 强>
重要:如果此属性设置为YES,则将lineBreakMode属性设置为导致文本的值的程序员错误 换行到另一行。
因此,如果标签也设置为自动换行,您可能不应该设置该属性(自动收缩)。
无论如何,我知道你正在使用故事板,但希望下面的代码示例可以告诉你这应该如何工作:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
self.scrollView.autoresizesSubviews = YES;
self.scrollView.contentMode = UIViewContentModeScaleToFill;
// simulate a network delay of 4 seconds to fetch JSON
double delayInSeconds = 4.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
// we have the "JSON" data
int dfltLabelHeight = 250; // will be resized!
int yPadding = 10;
int y = yPadding;
int numLabels = 8;
for (int i = 0; i < numLabels; i++) {
UILabel* label = [[UILabel alloc] initWithFrame: CGRectMake(0, y,
self.scrollView.frame.size.width, dfltLabelHeight)];
label.lineBreakMode = NSLineBreakByWordWrapping;
label.minimumFontSize = 10;
label.autoresizesSubviews = YES; // doesn't matter here
//label.adjustsFontSizeToFitWidth = YES;
//label.adjustsLetterSpacingToFitWidth = NO; // this crashes on iOS 6.1
label.numberOfLines = 0;
label.text = @"Nam nisi arcu, sodales vitae scelerisque sit amet. Nam nisi arcu, sodales vitae scelerisque sit amet. Nam nisi arcu, sodales vitae scelerisque sit amet.";
[self.scrollView addSubview: label];
[label sizeToFit];
// re-center the label horizontally
CGRect frame = label.frame;
frame.origin.x = (self.scrollView.frame.size.width - frame.size.width) / 2;
label.frame = frame;
y += yPadding + label.frame.size.height;
}
// adjust scroll view's virtual (content) size to fit the labels
self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width, y);
});
}
答案 1 :(得分:0)
UIFont *myFont = [UIFont systemFontOfSize:12];
NSString *myText= @"Nam nisi arcu, sodales vitae scelerisque sit amet. Nam nisi arcu, sodales vitae scelerisque sit amet. Nam nisi arcu, sodales vitae scelerisque sit amet.";
CGSize textSize = [myText sizeWithFont: myFont constrainedToSize:CGSizeMake(280, CGFLOAT_MAX) lineBreakMode:UILineBreakModeWordWrap];
descriptionLabel.frame = CGRectMake(20, 200, 280, textSize.height);
descriptionLabel.text = myText;