Der Aufbau einen Clip-Bereichs in einem UIView von Pfadobjekten in seiner Subviews
-
28-09-2019 - |
Frage
Ich versuche, einen Clipping-Bereich in einem UIView zu erzeugen, die von Pfadobjekten in seiner Subviews erzeugt wird. Zum Beispiel könnte ich ein Subview, die einen Platz haben und ein anderer einen Kreis enthält. Ich möchte in der Lage, einen Clip in der übergeordneten Super zu erzeugen, die die Vereinigung dieser beiden Formen ist. Kann jemand erklären, wie dies zu tun? Über alle habe ich in der Lage gewesen, so weit, um herauszufinden, ist, dass:
1 - der drawRect des Superview: Methode wird aufgerufen, bevor seine Subviews' drawRects ist, und
. 2 - die contextRef, die in allen drei Fällen das gleiche ist
Anders als das ich ratlos bin.
Danke,
Howard
Lösung
Auf den Punkt gebracht, müssen Sie durchlaufen alle Subviews und lassen Sie jeder den aktuellen Kontext Pfad ändern, dann eingestellt, dass Pfad als Beschneidungspfad. Sie könnten aus jeder Ansicht für einen Weg fragen oder um den Kontext zu jeder Ansicht übergeben.
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:
Wenn die subview Aufruf, können Sie den Kontext anzupassen, so dass 0,0 ist der Ursprung der aufgerufenen Ansicht, nicht die Superview:
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 );
Andere Tipps
Vielleicht versuchen, die Hintergrundfarbe zu setzen .clear: die UIView - Rechteck wird Leasing verschwindet nur die Pfadform