gpt4 book ai didi

iphone - 为什么 UIScrollView 的自定义 subview 会完全重绘而不是部分重绘,以及如何更改它?

转载 作者:行者123 更新时间:2023-11-29 03:53:41 25 4
gpt4 key购买 nike

我有一个 UIScrollView 及其 subview ,一个自定义 View ,它的宽度比 UIScrollView 的宽度大得多。在某些时候,我会放大自定义 View (仅宽度),并且我只想重绘放大的部分。这就是整个问题。剩下的只是我如何实现这一目标的细节。

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

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

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

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}}

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

更新:

我突然想到,我尝试重绘customView的可见部分,而不是它被放大的部分。然而,这并不能改变总体问题。与此同时,我尝试使用放大自定义 View 的矩形,在本例中是一个 1 坐标单位宽的矩形,但存在完全相同的问题:drawRect: 仍然被调用为自定义 View 的完整大小重新绘制。

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

最佳答案

我认为原因是在 iOS 中,对 -setNeedsDisplayInRect: 的调用将始终标记整个 View 以进行更新。查看类似问题here还有这个Technical Note .

解决方案可能是将波形 View 拆分为多个 subview ,并仅针对内容发生更改的 subview 调用 setNeedsDisplay

关于iphone - 为什么 UIScrollView 的自定义 subview 会完全重绘而不是部分重绘,以及如何更改它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16776944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com