菜鸟教程小白 发表于 2022-12-13 10:15:16

ios - UICollectionView 初始滚动滞后?


                                            <p><p>我已经使用 <code>UICollectionView</code> 类设置了一个 <code>3x18</code>“ GridView ”。每个单元格都包含一个从 <code>NSDictionary</code> 加载的 <code>UIImageView</code>。共有 18 张图片,总计约“20 MB”。</p>

<p>我遇到的问题是,当我最初在 View 中时,我从顶部滚动到底部,它很慢。之后,滚动就像照片应用一样流畅。</p>

<p>为什么会这样?是因为我的图片太大了吗?</p>

<p>这是我的代码:</p>

<pre><code>- (void)viewDidLoad

{
    ;

    dictionary = @{@&#34;01&#34;    : @[@&#34;Image 1&#34;],
                   @&#34;02&#34;    : @[@&#34;Image 2&#34;],
                   // etc etc
                  };

    numOfImages = [ sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

    // Allows appropriate methods to be used
    self.pageantCollectionView.delegate = self;
    self.pageantCollectionView.dataSource = self;
}

// Populate each cell with specified data

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

{
    CustomCell *cell = ;

    NSString *number = ;

    NSArray *imageByNumber = ;

    NSString *name= ;

    cell.nameLabel.text = name;

    cell.imageView.image = ];

    // Set rounded corners
    CALayer * l = ;

    ;

    ;

    return cell;
}

- (void)collectionView:(UICollectionView *)colView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath {

    UICollectionViewCell* cell = ;

    CALayer * l = ;

    ;

    ;

    cell.contentView.backgroundColor = ;

}

- (void)collectionView:(UICollectionView *)colView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewCell* cell = ;
    cell.contentView.backgroundColor = nil;   
}
</code></pre>

<p>这与我在 <code>cellForItemAtIndexPath</code> 中动态设置“imageView”的角半径以及 <code>didHighlightItemAtIndexPath 中单元格本身的角半径这一事实有什么关系吗</code>?</p>

<p>如果是这样,我该如何静态地为“imageView”和“cell”本身创建圆角半径?</p>

<p>谢谢</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>延迟更可能是使用 <code></code> 加载图像 第一次,这些是从磁盘加载的(慢)。随后它们将从内存缓存中加载,这将是快速的。你会得到更糟糕的结果,你的图像越大。 </p>

<p>需要考虑的事情</p>

<ul>
<li><p>与其 View 大小相比,您的图像有多大(以像素为单位)?如果它们大得多,您应该考虑提供显示尺寸的缩略图版本。 </p></li>
<li><p>预加载。应用程序中是否有更好的地方来招致这种延迟?例如在启动期间(在显示 collectionView 之前?如果是这样,请尝试将它们全部加载(使用 imageNamed:) 到 <code>NSDictionary</code> 或 <code>NSCache</code> (这就像一个被刷新的字典在内存不足的情况下)</p></li>
<li><p>异步加载。考虑改用 <code>UIImage imageFromContentsOfFile:</code>,您可以将其放入后台线程(然后将图像加载到主线程的 imageView 中)。与 <code>imageNamed</code> 不同,此方法不缓存,但您可以通过将结果添加到 <code>NSCache</code> 来手动执行此操作。您将需要编写一些代码,以便在图像可用时从缓存中获取图像,而不是从磁盘重新获取图像。<br/>
您<em>可能</em>可以使用 <code>imageNamed</code> 执行此操作 - 但它不是线程安全的,因此您不应该真正尝试它(请参阅 <a href="https://stackoverflow.com/a/26562349/1375695" rel="noreferrer noopener nofollow">this answer</a> 旁边的评论)。 </p></li>
<li><p><em>可能</em> 在主线程上显示图像之前强制在后台线程上进行初始屏幕外绘制。这会强制图像在后台解压缩。您需要将此技术与之前的技术结合起来进行试验,看看它是否真的对您有所帮助。</p></li>
<li><p>单元初始化。任何只需要对一个单元格发生一次的事情,都不应该在 <code>cellForItem...</code> 中完成。正如 Daniel Shaffer 所建议的,您可以将这些东西(例如您的单元格层角半径)移动到单元格 <code>init</code> 方法中。无论如何你都应该这样做,虽然我不认为这将是你当前滚动问题的主要原因。</p></li>
</ul></p>
                                   
                                                <p style="font-size: 20px;">关于ios - UICollectionView 初始滚动滞后?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/28201019/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/28201019/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - UICollectionView 初始滚动滞后?