菜鸟教程小白 发表于 2022-12-12 18:47:55

ios - UICollectionViewCell 中的 UILabel 布局怪异


                                            <p><p>我很奇怪在 UICollectionViewCell 子类中布置两个标签。原型(prototype)单元是在 InterfaceBuilder 中构建的,并且没有分配布局约束。当 Controller 为单元格分配标题和日期时,我会触发布局传递,其中我会根据报告的高度覆盖标签的位置。</p>

<p>奇怪的是,当单元格最初显示时,标签位置是不正确的。但是当单元格被滚动到屏幕外然后<em>重新显示</em>在屏幕上滚动时,布局是正确的!</p>

<p> <a href="https://dl.dropboxusercontent.com/u/363720/CollectionViewLabelsLayout.mp4" rel="noreferrer noopener nofollow">Here&#39;s a link to a screen recording</a> </p>

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

<pre><code>- (void)setTitle:(NSString *)title
{
    _title = ;
    self.titleLabel.text = _title;
    self.titleLabel.lineBreakMode = NSLineBreakByTruncatingTail;
    self.titleLabel.numberOfLines = 2;
    ;
    ;
}

- (void)setDate:(NSDate *)date
{
    _date = ;
    self.dateLabel.text = ;
    self.dateLabel.lineBreakMode = NSLineBreakByWordWrapping;
    self.dateLabel.numberOfLines = 1;
    ;
    ;
}

- (void)layoutSubviews
{
    ;

    #warning MMBFiguresCollectionViewCell doesn&#39;t lay out its labels on first display - only works on second
    self.titleLabel.backgroundColor = [ colorWithAlphaComponent:0.0875];
    self.dateLabel.backgroundColor = [ 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(@&#34;self.titleLabel.frame: %@ dateLabel.frame: %@&#34;, NSStringFromCGRect(self.titleLabel.frame), NSStringFromCGRect(self.dateLabel.frame));
}
</code></pre>

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

<p>那么,我必须假设 CALayer 位图缓存(或类似的东西)正在缓存 View 的预布局渲染? </p>

<p>注意:出于效率原因,我选择在 -layoutSubviews 中放置标签并使用 setNeedsLayout。我还尝试(刚刚)将标签定位分解为一个单独的方法,并在标题和日期标签更改时直接调用它 - 但效果相同。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>所以,我放弃了使用“聪明”的手动布局,只使用了 IB 精心挑选的布局约束——瞧,它奏效了。</p>

<p>老实说,我不认为我能够在这种情况下成功地使用自动布局,但它确实奏效了。谁知道?</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - UICollectionViewCell 中的 UILabel 布局怪异,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/21740072/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/21740072/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - UICollectionViewCell 中的 UILabel 布局怪异