【问题标题】:Why does a custom child view of a UIScrollView get redrawn entirely and not only partially and how to change this?为什么 UIScrollView 的自定义子视图会完全重绘,而不仅仅是部分重绘,以及如何更改它?
【发布时间】:2013-05-27 16:08:36
【问题描述】:

我有一个 UIScrollView 及其子视图,一个自定义视图,它的宽度比 UIScrollView 大。在某些时候,我放大了自定义视图(仅宽度),我只想重绘放大它的部分。这就是整个问题。其余的只是我如何尝试实现这一目标的细节。

经过一番搜索,我找到了UIView.contentMode的属性,应该正是为了这个目的。我玩过它(例如将其设置为UIViewContentModeLeft),但我无法从中获得任何效果。我之前没有使用过这个属性,所以可能是我没有正确使用它。

我的问题是自定义视图的drawRect:(CGRect)rect 方法总是以自定义视图的完整大小调用,而不仅仅是放大它的矩形。这会导致性能问题,因为自定义视图增长得越多,绘制周期就会越长。

我在更新代码中做了什么:

dispatch_async( dispatch_get_main_queue(), ^{
    uiScrollView.contentSize = ...; // increase width of contentSize
    customView.frame = ...; // increase width of customView accordingly

    CGRect visibleRect = [uiScrollView convertRect:uiScrollView.bounds toView:customView];

    printf("setNeedsDisplayInRect: %s\n", NSStringFromCGRect(visibleRect).UTF8String);

    [customView setNeedsDisplayInRect:visibleRect];
});

但是,我在上面指定的矩形没有到达 customView 中的 drawRect: 方法,我也像这样记录矩形:

- (void) drawRect:(CGRect)rect {
    printf("drawRect: %s\n", NSStringFromCGRect(rect).UTF8String);

    // drawing code here
    // ...
}

代表原始输出:

...
setNeedsDisplayInRect: {{426, 0}, {320, 192}}
setNeedsDisplayInRect: {{427, 0}, {320, 192}}
setNeedsDisplayInRect: {{427, 0}, {320, 192}}
setNeedsDisplayInRect: {{427, 0}, {320, 192}}
drawRect: {{0, 0}, {587, 192}}

背景: 我正在尝试创建一个滚动波形视图。记录时,应显示最新记录的波形。我可以通过简单的圆形缓冲区和自定义视图来实现这一点,但是在录制后,波形(轨迹)也应该显示出来,用户应该能够使用标准手势滚动,所以我也想使用 UIScrollView+ customView UI 结构,同时记录以及在两种操作模式之间保持 UI 结构一致。

更新:

我突然想到,我尝试重绘 customView 的可见部分,而不是它被放大的部分。但是,这并不能改变整体问题。我同时尝试使用自定义视图被放大的矩形,在这种情况下它是一个 1 坐标单位宽的矩形,但存在完全相同的问题:drawRect: 仍然会以自定义视图的完整大小调用重新绘制。

这也引出了一个问题:我的自定义视图的最大部分通常是不可见的,因为它被滚动到了显示区域之外。为什么 iOS 会告诉我的自定义视图重新绘制这个不可见的区域?

【问题讨论】:

    标签: iphone ios uiscrollview drawrect waveform


    【解决方案1】:

    我认为原因是在 iOS 中调用 -setNeedsDisplayInRect: 将始终标记整个视图以进行更新。查看类似的问题here 和此Technical Note

    一种解决方案可能是将波形视图拆分为多个子视图,并仅针对内容更改的那些调用setNeedsDisplay

    【讨论】:

    • 确实,您链接的另一篇文章以更一般的方式描述了我面临的问题。不幸的是,似乎没有一个干净简单的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多