首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新setText中的子类setText帧:因为UILabel在重新加载单元之前不会在UITableViewCell中调整大小

更新setText中的子类setText帧:因为UILabel在重新加载单元之前不会在UITableViewCell中调整大小
EN

Stack Overflow用户
提问于 2012-12-19 19:52:55
回答 2查看 599关注 0票数 0

我已经子类了一个UILabel,我打算在许多不同的UITableViewCell中使用它。

setText:中,我使用sizeWithFont来获得UILabel的动态高度。

这一切都很好,但是,在重新绘制单元格之前,子类UILabel的框架不会改变。我该如何克服这一切?

注意:在下面的代码中,由于使用if语句,重绘时大小不会改变。我把它拿出来做测试,在被重新绘制后发现它起了作用。

我认为它需要使用setNeedsDisplay或类似的工具,但它们也不起作用。

下面是我使用的代码:

代码语言:javascript
复制
- (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”):

代码语言:javascript
复制
2012-12-19 19:51:23.576 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:23.578 myApp[1099:c07] Old frame: {{138, 46}, {172, 49}}
2012-12-19 19:51:23.578 myApp[1099:c07] New frame: {{138, 46}, {170, 75}}

单元在这里重新加载

UILabel调整大小,并在第一个单元格重新加载后显示。

代码语言:javascript
复制
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}}

单元在这里重新加载

代码语言:javascript
复制
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加载的UITableViewCell在cellForRowAtIndexPath:中的大小

EN

回答 2

Stack Overflow用户

发布于 2012-12-21 22:29:09

而不是‘在这里重新加载’,只需尝试

代码语言:javascript
复制
[tableView beginUpdates];
[tableView endUpdates];

触发重新计算。没有真正重新加载它们的单元格高度,这是不必要的,因为您只更改了标签的文本。

票数 0
EN

Stack Overflow用户

发布于 2012-12-28 00:37:06

结果,我所需要做的就是将框架更改代码添加到layoutSubviews (以及超级方法[super layoutSubviews] )中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13960112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档