创建一个处理自己滚动的自定义UIView

时间:2010-08-06 23:53:53

标签: iphone uiview uiscrollview

我有一个自定义绘制的UIView(即使用drawView渲染自己)。要显示的数据通常会大于屏幕可以显示的数据,因此我希望在视图中包含滚动视图功能,以便类的客户端不必处理它,因此自定义视图可以处理延迟加载数据滚动。

但我如何设计这样的视图呢? UITableView采用从UIScrollView继承的方法。我试过做同样的事情,但滚动条不再对显示的内容产生影响(当条形移动时没有调用drawView)。如果我的自定义视图包含滚动视图,那么我需要两个单独的类(外部视图类和滚动视图内部的自定义绘制视图),这不是最佳的。

2 个答案:

答案 0 :(得分:1)

你绝对应该把你的观点放在滚动视图中,不要过于复杂!

(如果你这样做的话,先试试吧,当你被困住时,带着具体的问题到这里来!)

答案 1 :(得分:1)

基本上有两种方式:

- >使您的视图成为NSScrollView的子视图,这肯定是最简单的方法。

- >子类NSScrollView并在每次更改时切换重绘

你做的某个地方:

[self addObserver:self forKeyPath:@"contentOffset" withOptions:0 context:@"redraw"];

然后覆盖此方法:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if (context == @"redraw") {
        [self setNeedsDisplay];
    } else {
        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
    }
}

这将要求您的视图每次都更新它的显示。 drawRect:将被调用,您需要做的就是绘制视图的这一部分。

如果可能的话,你应该坚持第一种方法,这种方法更快,因为它不会每次重绘,而只是在显卡上移动预渲染纹理(视图的CALayer)。但是,如果您的视图比屏幕大很多,第一种方法会变慢。并且视图的最大大小。如果您的内容非常大,则应用可能会因第一种方法而崩溃。