我有一个自定义绘制的UIView(即使用drawView渲染自己)。要显示的数据通常会大于屏幕可以显示的数据,因此我希望在视图中包含滚动视图功能,以便类的客户端不必处理它,因此自定义视图可以处理延迟加载数据滚动。
但我如何设计这样的视图呢? UITableView采用从UIScrollView继承的方法。我试过做同样的事情,但滚动条不再对显示的内容产生影响(当条形移动时没有调用drawView)。如果我的自定义视图包含滚动视图,那么我需要两个单独的类(外部视图类和滚动视图内部的自定义绘制视图),这不是最佳的。
答案 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)。但是,如果您的视图比屏幕大很多,第一种方法会变慢。并且视图的最大大小。如果您的内容非常大,则应用可能会因第一种方法而崩溃。