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