0

我有一个 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 会告诉我的自定义视图重新绘制这个无论如何不可见的区域?

4

1 回答 1

1

我认为原因是在 iOS 中调用-setNeedsDisplayInRect:将始终标记整个视图以进行更新。请参阅此处的类似问题和此技术说明

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

于 2013-05-27T17:06:37.363 回答