Ios 更新setText中的子类UILabel框架:因为在重新加载单元格之前,UILabel不会在UITableViewCell中调整大小
我已经对一个UILabel进行了子分类,我打算在许多不同的Ios 更新setText中的子类UILabel框架:因为在重新加载单元格之前,UILabel不会在UITableViewCell中调整大小,ios,uilabel,frame,sizewithfont,Ios,Uilabel,Frame,Sizewithfont,我已经对一个UILabel进行了子分类,我打算在许多不同的UITableViewCells中使用它 在setText:中,我使用了sizeWithFont来获取ui标签的动态高度 这一切都很好,但是,子类UILabel的框架在单元格重新绘制之前不会改变。我如何克服这个问题 注意:在下面的代码中,由于if语句,重新绘制时大小不会改变。我把它拿出来进行测试,重新绘制后发现它能工作 我认为它需要使用setNeedsDisplay或类似工具,但它们也不起作用 以下是我正在使用的代码: - (void)s
UITableViewCell
s中使用它
在setText:
中,我使用了sizeWithFont
来获取ui标签的动态高度
这一切都很好,但是,子类UILabel
的框架在单元格重新绘制之前不会改变。我如何克服这个问题
注意:在下面的代码中,由于if
语句,重新绘制时大小不会改变。我把它拿出来进行测试,重新绘制后发现它能工作
我认为它需要使用setNeedsDisplay
或类似工具,但它们也不起作用
以下是我正在使用的代码:
- (void)setText:(NSString *)text
{
if (text != _text) {
// Adjust size to fit contents
//
CGSize maximumSize = CGSizeMake(CGRectGetWidth(self.frame), CGFLOAT_MAX);
CGSize predictedSize = [text sizeWithFont:self.font constrainedToSize:maximumSize lineBreakMode:self.lineBreakMode];
NSLog(@"Predicted size for \"%@\" (width: %f) is %@", text, self.frame.size.width, NSStringFromCGSize(predictedSize));
CGRect headlineDescriptionLabelFrame = self.frame;
headlineDescriptionLabelFrame.size = predictedSize;
NSLog(@"Old frame: %@", NSStringFromCGRect(self.frame));
[self setFrame:headlineDescriptionLabelFrame];
NSLog(@"New frame: %@", NSStringFromCGRect(self.frame));
_text = text;
}
}
我的输出如下所示(在关闭上述“if”的情况下):
在此重新加载单元格
UILabel在第一次重新加载单元格后调整大小并显示
2012-12-19 19:51:30.018 myApp[1099:c07] Predicted size for "Facebook's photo-sharing service Instagram denies that it has changed its privacy policy to allow it to sell users' photos to advertisers." (width: 172.000000) is {170, 75}
2012-12-19 19:51:30.018 myApp[1099:c07] Old frame: {{138, 46}, {172, 49}}
2012-12-19 19:51:30.019 myApp[1099:c07] New frame: {{138, 46}, {170, 75}}
在此重新加载单元格
2012-12-19 19:51:32.014 myApp[1099:c07] Predicted size for "Facebook's photo-sharing service Instagram denies that it has changed its privacy policy to allow it to sell users' photos to advertisers." (width: 170.000000) is {170, 75}
2012-12-19 19:51:32.014 myApp[1099:c07] Old frame: {{138, 46}, {170, 75}}
2012-12-19 19:51:32.015 myApp[1099:c07] New frame: {{138, 46}, {170, 75}}
编辑
经过4天的努力,我仍然有问题,有人知道这是否是苹果方面的一个错误吗?其他人如何调整从UITableViewCell nib加载的UILabel的大小,位于cellForRowAtIndexPath:
?而不是“在此处重新加载单元格”,请尝试
[tableView beginUpdates];
[tableView endUpdates];
触发recalc。没有真正重新加载单元格的高度,这是不必要的,因为您只更改了标签的文本。事实证明,我所需要做的就是将帧更改代码添加到布局子视图(以及super方法[super layoutSubviews]
您是否尝试过使用setNeedsLayout
?是的,仍然存在相同的问题尽管“碰撞”了这个问题,但我找不到如何解决这个问题。因此,我在Interface Builder中构建了UITableViewCell。初始高度是IB中使用的高度,然后,当单元格重新绘制到屏幕上时,正确的高度是I如图所示,即使它的框架显示它已初始设置为正确的高度,您的tableView:heightForRowAtIndexPath:
看起来是什么样子?感谢您的回复,当我滚动tableView而不是使用代码时,我的单元格正在“重新加载”。如果我要实现您的代码,哪里是放置它的最佳位置?如我所说,而不是cell在粘贴的代码中此处重新加载
。您是指在setText:
方法中吗?这不起作用。注意:我在上面粘贴的代码中使用单元格重新加载
从日志中输出
[tableView beginUpdates];
[tableView endUpdates];