В двух словах, вы должны пройтись по всем подпредставлениям и позволить каждому изменить текущий путь контекста, а затем установить этот путь как путь отсечения. Вы можете запросить путь от каждого представления или передать контекст каждому представлению.
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 );
Edit:
При вызове подпредставления вы можете настроить контекст таким образом, чтобы 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 );