2010-08-06 108 views
1

我有一个自定义绘制UIView(即使用drawView来呈现自己)。要显示的数据通常会比屏幕显示的大,所以我想在视图中包含滚动视图功能,以便类的客户端不必处理它,所以自定义视图可以处理延迟加载数据在滚动时显示。创建一个处理自己滚动的自定义UIView

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

回答

1

你绝对应该把你的视图放在滚动视图中,不要过分复杂的事情!

(!如果你这样做,首先尝试与当你坚持一个具体的问题来这里)

+1

同意,我打算这样做。试图弄清楚如何将滚动封装到自定义类中,以便外部用户不必自己创建滚动视图并自行更新内容大小。 – Bill 2010-08-07 00:08:00

+1

然后为他们提供完整的软件包,包括滚动视图。只是子类uiscrollview。这比重新发明轮子的工作要少。 – mvds 2010-08-07 00:10:38

+0

对,但如果我继承UIScrollView,drawView不会在滚动上调用。 – Bill 2010-08-07 00:19:27

1

基本上有两种方式:

- >使您的视图的一个子视图NSScrollView,这当然是最简单的方法。

- >子类NSScrollView和切换在你做一个-init上重绘每一个变化

某处:

[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)。但是,如果您的视图比屏幕大很多,第一种方法会变慢。并且有一个最大尺寸的意见。如果您的内容非常大,则该应用可能会因第一种方法而崩溃。