我正在尝试在 UIView 中生成一个剪切区域,该区域是从其子视图中的路径对象生成的。例如,我可能有一个包含正方形的子视图和另一个包含圆形的子视图。我希望能够在父超级视图中生成一个剪辑,这是这两种形状的结合。有人可以解释如何做到这一点吗?到目前为止,我能弄清楚的就是:
1 - 父视图的 drawRect: 方法在其子视图的 drawRects 之前被调用,并且
2 - 在所有三个实例中可访问的 ContextRef 是相同的。
除此之外,我很难过。谢谢,
霍华德
我正在尝试在 UIView 中生成一个剪切区域,该区域是从其子视图中的路径对象生成的。例如,我可能有一个包含正方形的子视图和另一个包含圆形的子视图。我希望能够在父超级视图中生成一个剪辑,这是这两种形状的结合。有人可以解释如何做到这一点吗?到目前为止,我能弄清楚的就是:
1 - 父视图的 drawRect: 方法在其子视图的 drawRects 之前被调用,并且
2 - 在所有三个实例中可访问的 ContextRef 是相同的。
除此之外,我很难过。谢谢,
霍华德
简而言之,您必须遍历所有子视图并让每个子视图修改当前上下文路径,然后将该路径设置为剪切路径。您可以要求每个视图的路径或将上下文传递给每个视图。
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 );
也许尝试将背景颜色设置为 .clear:UIView - Rectangle 将消失 仅租赁路径形状