0

サブビューのパス オブジェクトから生成された UIView にクリッピング エリアを作成しようとしています。たとえば、正方形を含むサブビューと円を含むサブビューがあるとします。これらの両方の形状の結合である親スーパービューでクリップを作成できるようにしたいと考えています。誰かがこれを行う方法を説明できますか? これまでに把握できたのは、次のことだけです。

1 - スーパービューの drawRect: メソッドは、そのサブビューの drawRects が呼び出される前に呼び出されます
。2 - 3 つのインスタンスすべてでアクセス可能な ContextRef は同じです。

それ以外は困惑しています。ありがとう、
ハワード

4

2 に答える 2

2

簡単に言えば、すべてのサブビューを繰り返し処理し、それぞれに現在のコンテキスト パスを変更させ、そのパスをクリッピング パスとして設定する必要があります。各ビューからパスを要求するか、コンテキストを各ビューに渡すことができます。

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState( context );
CGContextBeginPath( context );

for ( view in subviews ) {
  if ( [view respondsToSelector:@selector(pathTranslatedForView:)] ) {
    CGContextAddPath( context , [(MyCustomViewPath *)view pathTranslatedForView:self] );
  }
}

CGContextClip( context );
// do stuff with clipping path
CGContextRestoreGState( context );

編集:

サブビューを呼び出すとき、スーパービューではなく、0,0 が呼び出されたビューの起点になるようにコンテキストを調整することができます。

CGRect frame = [view frame];
CGContextTranslateCTM( context , -frame.origin.x , -frame.origin.y );
CGContextAddPath( context , [(MyCustomViewPath *)view path]; 
CGContextTranslateCTM( context , frame.origin.x , frame.origin.y );
于 2010-04-19T23:30:46.597 に答える