代码之家  ›  专栏  ›  技术社区  ›  Bill

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

  •  1
  • Bill  · 技术社区  · 14 年前

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

    但我该如何设计这样的视图呢?UITableView采用从UIScrollView继承的方法。我尝试了同样的操作,但是滚动条不再影响显示的内容(当滚动条移动时,drawView不会被调用)。如果我的自定义视图包含一个滚动视图,那么我需要两个单独的类(外部视图类和滚动视图内部的自定义绘制视图),这是不太理想的。

    2 回复  |  直到 14 年前
        1
  •  1
  •   mvds    14 年前

    你一定要把你的视图放在滚动视图中,不要把事情搞得太复杂了!

    (如果你这样做了,那就先试试,当你陷入困境时,带着一个具体的问题来这里!)

        2
  •  1
  •   Max Seelemann    14 年前

    基本上有两种方法:

    ->子类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];
        }
    }
    

    如果可能的话,你应该坚持使用第一种方法,这种方法速度更快,因为它不是每次都重画,而是在图形卡上移动一个预渲染的纹理(视图的CALayer)。但是,如果您的视图比屏幕大得多,则第一种方法将变慢。视图有一个最大大小。如果你的内容很大,应用程序可能会因为第一个方法而崩溃。