多くのサブビューを含むいくつかのビューがあり、アニメーション中のパフォーマンスが非常に悪いです。
役立つ可能性がある 1 つの方法は、階層をコンテキストにレンダリングしてフラット化することです。これが機能するには、フラット化できるようにしたい各ビューを、ビューに直接ではなく、すべてのサブビューをコンテナーに追加するように構築する必要があります。また、階層の平坦化を実行する -drawRect: を実装する必要があります。
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
[self.containerLayer renderInContext:context];
}
トリックは、このコンテナ レイヤが のサブレイヤとして追加されないことですself.layer
。Core Animation の場合、階層がフラットに見えます。
しかし、このようなことを試みる前に、それを行うためのより良い方法はありますか?
私が懸念しているのは、オンデマンドでフラット化したいビューのビュー階層を保持する追加のコンテナー レイヤーを作成する必要があることです。-drawRect: -setNeedsDisplay を呼び出したときにのみ呼び出されるので、問題ないようです。
そのようなコンテナを必要とせずにビューのサブビューを平坦化する方法はありますか?
問題は、サブビューの多くが -addSubview: を呼び出すことによって追加されることです。そのためself.layer
、代わりにコンテナーがなければ、それ自体以外に平坦化できる単一のレイヤーはありません。
私がこれをした場合:
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
[self.layer renderInContext:context];
}
これはあまり意味がありませんか?サブビューの階層全体がこのレイヤーにアタッチされることを意味しますが、このレイヤーはビューに関連付けられているため、ビュー階層がフラットではないため、コンテキストにレンダリングする必要はありません。