0

我有几个带有很多子视图的视图,并且在动画期间性能很差。

一种可能有所帮助的方法是通过将层次结构呈现到上下文中来展平层次结构。为此,我希望能够展平的每个视图都必须以这样一种方式构造,即它们的所有子视图都添加到容器中,而不是直接添加到视图中。此外,我必须实现 -drawRect: 来执行层次结构的展平:

- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    [self.containerLayer renderInContext:context];
}

诀窍是这个容器层没有添加为self.layer. 对于核心动画,它看起来层次结构是平的。

但是在尝试这样的事情之前,有没有更好的方法呢?

我担心的是我必须创建一个额外的容器层来保存我想要按需展平的视图的视图层次结构。-drawRect: 仅在我调用 -setNeedsDisplay 时才被调用,所以这看起来很好。

有没有办法在不需要这样的容器的情况下展平视图的子视图?

问题是我的许多子视图都是通过调用 -addSubview: 添加的,所以self.layer如果我没有容器,那么除了它自己之外,没有任何一层我可以展平。

如果我这样做怎么办:

- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    [self.layer renderInContext:context];
}

这不会有多大意义吧?我的意思是子视图的整个层次结构将附加到该层,但是该层与视图相关联,因此将其渲染到上下文中是多余的,因为视图层次结构不会是平坦的。

4

1 回答 1

2

首先,看[CALayer shouldRasterize]。它可能会处理您尝试做的大部分事情。

Second, having "many" subviews is often a bad idea. Views are heavyweight objects. Unless you need event (touch) handling on them all, you should really consider changing your views to layers. In some cases it can be worth it even if you have to do your own layer hit testing (i.e. let the view figure out which layer was touched).

Finally, calling renderInContext: in drawRect: is unlikely to give any benefit at all. Calling renderInContext: only really gives a benefit if you can call it either (a) on a background thread or (b) less often than drawRect:. Otherwise you're just doing all the same work.

于 2012-09-09T21:51:40.540 回答