Ios 更新setText中的子类UILabel框架:因为在重新加载单元格之前,UILabel不会在UITableViewCell中调整大小

Ios 更新setText中的子类UILabel框架:因为在重新加载单元格之前,UILabel不会在UITableViewCell中调整大小,ios,uilabel,frame,sizewithfont,Ios,Uilabel,Frame,Sizewithfont,我已经对一个UILabel进行了子分类,我打算在许多不同的UITableViewCells中使用它 在setText:中,我使用了sizeWithFont来获取ui标签的动态高度 这一切都很好,但是,子类UILabel的框架在单元格重新绘制之前不会改变。我如何克服这个问题 注意:在下面的代码中,由于if语句,重新绘制时大小不会改变。我把它拿出来进行测试,重新绘制后发现它能工作 我认为它需要使用setNeedsDisplay或类似工具,但它们也不起作用 以下是我正在使用的代码: - (void)s

我已经对一个UILabel进行了子分类,我打算在许多不同的
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];