菜鸟教程小白 发表于 2022-12-13 05:00:22

ios - UIPageViewController 滑动延迟


                                            <p><p>我的 iOS 应用正在使用大约 18 页的 UIPageViewcontroller。每个页面都有一个 UITableView 和 4 个动态单元格。每个单元格有大约 10 张不同的图像。</p>

<p>问题是每次我滑动 UIPageViewcontroller 以转到下一个/上一个页面时,都会有半秒的延迟,这让用户体验非常糟糕。</p>

<p>滑动后显示的下一页的 UITableView 似乎正在加载其所有重数据单元格,这导致了此延迟。</p>

<p>我已阅读可以使此加载异步,但我不知道如何执行此操作。</p>

<p><strong>你们中有人知道如何避免这种延迟,以便顺利过渡到页面吗?</strong></p>

<p>这是 UITableView 的一些代码:</p>

<pre><code>#pragma mark - Table view data source

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return 4;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ( integerValue] == CLOSED_CELL)
      return ;
    else
      return ;
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if ( &amp;&amp;
      ])
    {
      ;
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier;
    GrintScoreTrackPlayerDynamicCell *cell, *cellOwner;

    // Cell ID
    CellIdentifier = @&#34;GrintScoreTrackPlayerDynamicCell-ID&#34;;

    // Creating the cell
    cell = (GrintScoreTrackPlayerDynamicCell*);

    // Creating the cell owner
    cellOwner = [ initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    // Getting cell from Nib, if possible.
    if (cell == nil)
    {
      NSArray *nib = [ loadNibNamed:@&#34;GrintScoreTrackPlayerDynamicCell&#34; owner:cellOwner options:nil];
      cell = ;
    }

    // Filling cell with the corresponding user info
    ;

    // Changing appearance based on the new status
    integerValue]];

    // Setting action for cell&#39;s &#34;collapseButton&#34; button
    ;

    // Setting action for cell&#39;s &#34;editScoresButton&#34; button
    ;

    // Setting action for cell&#39;s &#34;pickerEnterButton&#34; button
    ;

    // Setting cell selection style
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    cell.layoutMargins = UIEdgeInsetsZero;

    // Setting picker view delegate and data source.
    ;
    ;

    return cell;
}
</code></pre>

<p>还有一些来自 <strong>GrintScoreTrackPlayerDynamicCell</strong> 单元格的代码:</p>

<pre><code>- (void) fillCellWithContent
{
    // Doing some processing fixes
    ;
}

- (void) postProcessCellContent
{
    CGSize textSize;
    CGFloat scoreLabelTextWidth, newHazzardLabelXValue, newPuttsLabelXValue, offset;

    // Setting an offset for the hazzard and putts label. This offset represents the distance between the score label text and the hazzard and putts labels.
    offset = 1;

    // Getting the width of the text that&#39;s inside the Score Label.
    textSize = [ sizeWithAttributes:@{NSFontAttributeName:}];
    scoreLabelTextWidth = textSize.width;

    // Getting new x position value for the Hazzards Label.
    newHazzardLabelXValue = self.scoreLabel.frame.origin.x +
                            (self.scoreLabel.frame.size.width - scoreLabelTextWidth) * 0.5 -
                            self.hazardsLabel.frame.size.width - offset;

    // Setting the new x position value for the Hazzards label
    ;

    // Getting new x position value for the Putts Label.
    newPuttsLabelXValue = self.scoreLabel.frame.origin.x +
                         (self.scoreLabel.frame.size.width - scoreLabelTextWidth) * 0.5 +
                        scoreLabelTextWidth + offset;

    // Setting the new x position value for the Putts label
    ;
}
</code></pre>

<p>这是一些关于我的 UIPageViewController 的代码,其中页面预加载在 <strong>pageContent</strong> 数组中:</p>

<pre><code>#pragma mark - UIPageViewController Data Course

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
    // Getting the previous of the next controller
    int index;
    index = currentPageBeingDisplayed - 1;
    if (index &lt; 0)
      index = - 1;

    return pageContent;
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
    // Getting the index of the next controller
    int index;
    index = currentPageBeingDisplayed + 1;
    index = index % ;

    return pageContent;
}
</code></pre>

<p>Instruments Tool <strong>Counter</strong> 的屏幕截图专注于延迟:</p>

<p> <img src="/image/MBegE.jpg" alt="enter image description here"/> </p>

<p>单元格的最后 2 张图片(它有 2 个状态):</p>

<p> <img src="/image/I8TLS.jpg" alt="enter image description here"/> </p>

<p> <img src="/image/VWTP2.jpg" alt="enter image description here"/> </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>这将是一个疯狂的猜测 - 我还没有尝试过。但是根据您如此出色的推断以及您在评论中所说的内容,我认为这就是图像进入单元格的方式:它们位于定义单元格的 <em>.xib</em >.</p>

<p>因此,对于表格的每一行,都加载了 <em>.xib</em>,并且所有图像都必须从 <em>.xib</em> 中重新加载。这就是我们认为会拖慢您速度的原因。</p>

<p>所以这里有一个建议:不要那样做。相反,只需在单元格中有空的 ImageView ,并用 <code>cellForRowAtIndexPath:</code> 中的图像填充它们。</p>

<p>为什么会有帮助?因为如果您通过调用 <code>imageNamed:</code> 来获取图像,则图像会<em>被系统缓存</em>。因此,每张图片都会被提取一次,之后会被永久缓存。</p>

<p>还有一个建议 - 确保图像<em>小</em>,即与它们将显示的大小相同。从大图像开始并在小 ImageView 中显示它是非常浪费时间的,因为每次都必须<em>计算</em>要显示的图像版本。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - UIPageViewController 滑动延迟,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/28121004/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/28121004/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - UIPageViewController 滑动延迟