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