1

UIViewクラスから派生したカスタムクラスがあります。私が達成したいのは、事前定義された距離で垂直の黒い線を描くことです。drawRectメソッドをオーバーライドし、垂直線を描画するコードを記述すると、ビューには完全に黒い背景が表示されます。次に、スーパークラスのdrawRectのみを呼び出す空のオーバーライドされたdrawRectでさえ、背景が黒になることに気付きました。drawRectをコメントアウトすると、ビューが透けて見え、予想どおりに透明になります。

これは、スーパークラスメソッドを呼び出すだけのdrawRectで使用している唯一のコードです。

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

}

この動作の理由は何でしょうか?

4

1 に答える 1

3

UIViewで内部的な問題が発生している可能性が高く、基本クラスが実際にdrawRectを実装していないか、卑劣な最適化が行われている可能性があります。

ドキュメントには、UIViewを直接オーバーライドしている場合はスーパーを呼び出さないように記載されています。また、背景色を設定するだけの場合、または他の方法でコンテンツにデータを入力する場合は、drawRectを実装する必要はないと記載されています。

このメソッドのデフォルトの実装は何もしません。ネイティブの描画テクノロジー(Core GraphicsやUIKitなど)を使用してビューのコンテンツを描画するサブクラスは、このメソッドをオーバーライドし、そこに描画コードを実装する必要があります。ビューが他の方法でコンテンツを設定する場合は、このメソッドをオーバーライドする必要はありません。たとえば、ビューに背景色が表示されるだけの場合、またはビューが基になるレイヤーオブジェクトを使用してコンテンツを直接設定する場合は、このメソッドをオーバーライドする必要はありません。同様に、ビューがOpenGL ESを使用して描画を行う場合は、このメソッドをオーバーライドしないでください。

と:

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

したがって、スーパーを呼び出すことによって、何かを失っている可能性が非常に高くなります。実際の描画コードは表示されないため、どこで問題が発生しているのかを確認するのは困難ですが、UIViewを直接オーバーライドした場合は、開始点としてsuperを呼び出さないでください。

于 2012-12-28T19:13:07.147 に答える