【问题标题】:Why is UIView drawRect causing first pass of UIScrollview to be choppy/jerky/slow?为什么 UIView drawRect 导致 UIScrollview 的第一次通过不稳定/生涩/缓慢?
【发布时间】:2013-08-18 12:49:27
【问题描述】:

编辑:看起来问题代码在我在 UIView 中绘制的程序背景中,然后我将其作为子视图添加到 UIScrollView。程序代码如下。它绘制盒子形状,看起来有点像天际线。任何想法为什么这会减慢我的 UIScrollView 的第一遍?有时它可能高达一千像素宽或更多。看图...

- (void)drawRect:(CGRect)rect
{
UIBezierPath *vertLine = [[UIBezierPath alloc] init];

[vertLine moveToPoint:CGPointMake(0,self.frame.size.height)];

int detail = 10;
int ranNum = 0;
int count = self.bounds.size.width/detail;
CGFloat heightIncrement = 0.0;

CGFloat minHeight = self.frame.size.height;

CGFloat xPos = 0;
CGFloat yPos = self.frame.size.height-20;

for (int i =0; i<count; i++)
{
    ranNum += (arc4random() % 9)-5;

    yPos -= (arc4random() % 30);
    [vertLine addLineToPoint:CGPointMake(xPos,yPos)];

    xPos += (arc4random() % 20)+10;
    [vertLine addLineToPoint:CGPointMake(xPos,yPos)];

    yPos += (arc4random() % 30);
    [vertLine addLineToPoint:CGPointMake(xPos,yPos)];

    xPos += (arc4random() % 30);
    [vertLine addLineToPoint:CGPointMake(xPos,yPos)];

    if (yPos>self.frame.size.height-10) {
        yPos = self.frame.size.height-10;
    }

    if (yPos<self.frame.size.height-50) {
        yPos = self.frame.size.height-50;
    }

}

[vertLine addLineToPoint:CGPointMake(count*20,(self.frame.size.height))];

[[UIColor colorWithRed:0.0/255.0 green:38.0/255.0 blue:51.0/255 alpha:1] setFill];

[vertLine fill];

}

我有一个生涩的滚动视图,但仅限于第一遍。在滚动视图中查看完所有视图后,非常流畅。

第一遍:在第一遍中,当每个 UIImageView 进入视野时(从右到左),当它进入可见区域时,都会出现右晃动。因此,如果您参考附加的图像,您会看到 UIImageView 5 从右到左进入。当这种情况发生时,会有一个小的停顿,就好像滚动视图正在告诉图像视图加载/准备上台一样。我试图对此进行分析,但我的代码中没有发现任何问题,而且我不确定如何分析我没有覆盖的方法等。所以一个子问题是......当 UIScrollView 的子视图进入可见区域时,它会调用哪些方法?

正如我提到的,我尝试使用异步和其他并发方法,但似乎无论图像如何加载,第一遍总是生涩,然后就像 UIScrollView 缓存子视图一样。是否可以预先进行缓存/加载... [滚动视图缓存子视图];我宁愿启动速度较慢,也不愿在第一次滚动时笨拙。

感谢您对此的任何想法或有关 UIScrollView 如何与其子视图一起工作的信息。我已经看到了许多关于以 UIImageViews 作为子视图的生涩 UIScrollViews 的问题和一些解决方案。我已经尝试了很多,但滚动视图仍然很慢。 奥斯汀

【问题讨论】:

  • 你能把代码放上来吗?
  • 好吧,让我构建一个示例...但它只是 UIScrollView 中的 UIImageViews...
  • 这肯定是因为您正在下载图像并同步显示在uiimageviews中。我认为您是从服务器下载图像。你应该在后台下载图像,然后使用主线程你应该 UI(即在 tableview 中显示图像)。我从网上得到的样本之一:raywenderlich.com/4295/…
  • 谢谢 - nikhita dkslfslg 你帮我找到了问题,这是我的程序背景。所以它根本不是图像,而是我使用 drawRect 绘制的 UIView 的一个子类。任何人都知道为什么这在 UIScrollView 中如此缓慢,但只是在第一遍?

标签: iphone ios caching uiscrollview uiimageview


【解决方案1】:

imageWithContentsOfFile是一个同步的过程,需要大量的瓦片。使用一些异步的方式加载图片,可以达到平滑度

【讨论】:

    猜你喜欢
    • 2011-01-04
    • 1970-01-01
    • 2013-07-14
    • 2018-07-26
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多