1

注意: 私は実用的な問題を解決しようとはしていません。好奇心から尋ねます。

アプリケーションのメイン ビューで使用するカスタムUIViewサブクラスがあります。金属層クラスがあります。

+ (id)layerClass
{
    return [CAMetalLayer class];
}

-(void)drawRect:(CGRect)rectメソッドをオーバーライドすると、エラー メッセージが表示されるようになることに気付きました。

<CAMetalLayer: 0x17005dc70>: calling -display has no effect.

さらに興味深いのは、次のようにオーバーライドしても表示されることです。

- (void)drawRect:(CGRect)rect
{
    [super drawRect:rect];
}

OOPの基本原則によれば、そのようなオーバーライド(基本クラスを呼び出すだけ)はプログラムの動作を変更するべきではないため、私が理解している限り、これはまったく違いを生むことはできませんでした。

このエラー メッセージは正確には何を意味するのでしょうか? そして、なぜそれが現れるのですか?

4

1 に答える 1

1

UIViewAPI が古く、いい API ではありません。UIViewとの相互作用CALayerはかなり複雑です。興味深い点は、オーバーライドしているかどうかをシステムがチェックすることですdrawRect。そのため、UIViewドキュメントに次の警告があります。

drawRect: - ビューがカスタム コンテンツを描画する場合は、このメソッドを実装します。ビューがカスタム描画を行わない場合は、このメソッドをオーバーライドしないでください。

電話する必要はありません[super drawRect:rect]。スーパークラスは実際の描画を行いません。何も描画したくない場合は、メソッドを完全に削除してください。レイヤー上にカスタム コンテンツを描画する場合は、呼び出さないでくださいsuper(スーパークラスもオーバーライドされていることがわかっている場合にのみ super を呼び出しますdrawRect)。

UIView を直接サブクラス化する場合、このメソッドの実装で super を呼び出す必要はありません。ただし、別のビュー クラスをサブクラス化する場合は、実装のある時点で super を呼び出す必要があります。

あなたの場合、呼び出し[super drawRect]が起こるはずのないことをしていると思います。

于 2015-03-27T12:59:43.840 に答える