0

我正在尝试在 UIView 中生成一个剪切区域,该区域是从其子视图中的路径对象生成的。例如,我可能有一个包含正方形的子视图和另一个包含圆形的子视图。我希望能够在父超级视图中生成一个剪辑,这是这两种形状的结合。有人可以解释如何做到这一点吗?到目前为止,我能弄清楚的就是:

1 - 父视图的 drawRect: 方法在其子视图的 drawRects 之前被调用,并且
2 - 在所有三个实例中可访问的 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 回答
0

也许尝试将背景颜色设置为 .clear:UIView - Rectangle 将消失 仅租赁路径形状

于 2019-01-21T15:34:49.983 回答