UILabel布局在UICollectionViewCell中的怪异

时间:2014-02-12 21:29:29

标签: ios objective-c uicollectionviewcell

我很奇怪在UICollectionViewCell子类中布置两个标签。原型单元格是在InterfaceBuilder中构建的,没有分配布局约束。当控制器为单元格指定标题和日期时,我触发布局通道,在该通道中,我根据报告的高度覆盖标签的位置。

奇怪的是,当最初显示单元格时,标签位置是复活的。但是当单元格在屏幕外滚动然后重新显示在屏幕上滚动时,布局是正确的!

Here's a link to a screen recording

我在标题标签上设置了半透明的红色,在日期标签上设置了半透明的蓝色。应该对标题标签进行捕捉以适合文本(最多两行),日期标签应具有相同的宽度,并且位于右下方。在视频中,您可以看到,在滚动屏幕外,标题标签的高度不正确,日期标签与其重叠。

- (void)setTitle:(NSString *)title
{
    _title = [title copy];
    self.titleLabel.text = _title;
    self.titleLabel.lineBreakMode = NSLineBreakByTruncatingTail;
    self.titleLabel.numberOfLines = 2;
    [self.titleLabel sizeToFit];
    [self setNeedsLayout];
}

- (void)setDate:(NSDate *)date
{
    _date = [date copy];
    self.dateLabel.text = [self.class.sharedShortDateFormatter stringFromDate:_date];
    self.dateLabel.lineBreakMode = NSLineBreakByWordWrapping;
    self.dateLabel.numberOfLines = 1;
    [self.dateLabel sizeToFit];
    [self setNeedsLayout];
}

- (void)layoutSubviews
{
    [super layoutSubviews];

    #warning MMBFiguresCollectionViewCell doesn't lay out its labels on first display - only works on second
    self.titleLabel.backgroundColor = [[UIColor redColor] colorWithAlphaComponent:0.0875];
    self.dateLabel.backgroundColor = [[UIColor blueColor] colorWithAlphaComponent:0.0875];

    const CGRect LabelFrame = self.titleLabel.frame;
    const CGRect StarFrame = self.favoriteButton.frame;

    self.titleLabel.frame = CGRectMake(CGRectGetMinX(LabelFrame), CGRectGetMinY(LabelFrame), CGRectGetMinX(StarFrame) - CGRectGetMinX(LabelFrame), CGRectGetHeight(LabelFrame));
    self.dateLabel.frame = CGRectMake(CGRectGetMinX(self.titleLabel.frame), CGRectGetMaxY(self.titleLabel.frame), CGRectGetWidth(self.titleLabel.frame), CGRectGetHeight(self.dateLabel.frame));

    NSLog(@"self.titleLabel.frame: %@ dateLabel.frame: %@", NSStringFromCGRect(self.titleLabel.frame), NSStringFromCGRect(self.dateLabel.frame));
}

当我观察NSLog语句中报告的帧时,我看到看起来正确的帧值。在屏幕外滚动并重新打开时,帧值是相同的 - 所以我知道帧正在被正确计算。

然后,我必须假设CALayer位图缓存(或某些此类事情)正在缓存视图的预布局渲染?

注意:我选择在-layoutSubviews中定位标签,并​​出于效率原因使用setNeedsLayout。我还尝试(刚才)将标签定位分解为一个单独的方法,并在标题和日期标签发生变化时直接调用它 - 但它具有相同的效果。

1 个答案:

答案 0 :(得分:1)

所以,我放弃了使用“聪明”的手动布局,只是使用了IB精心挑选的布局约束 - 而且,它有效。

老实说,我不认为我能够在这种情况下成功使用自动布局,但它确实有效。谁知道?