代码之家  ›  专栏  ›  技术社区  ›  hkatz

从其子视图中的路径对象在uiview中构建剪辑区域

  •  0
  • hkatz  · 技术社区  · 14 年前

    我试图在uiview中生成一个裁剪区域,这个区域是由其子视图中的path对象生成的。例如,我可能有一个子视图包含正方形,另一个子视图包含圆。我希望能够在父超视图中生成一个剪辑,这是两个形状的结合。有人能解释一下怎么做吗?到目前为止我所能知道的是:

    1-在其子视图的drawrect s之前调用superview的drawrect:方法,并且
    2-在所有三个实例中可访问的contextref是相同的。

    除此之外,我很困惑。 谢谢,
    霍华德

    2 回复  |  直到 6 年前
        1
  •  2
  •   drawnonward    14 年前

    简而言之,您必须遍历所有子视图,让每个子视图修改当前上下文路径,然后将该路径设置为剪切路径。您可以从每个视图请求路径,或者将上下文传递到每个视图。

    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 );
    
        2
  •  0
  •   Max    6 年前

    可能尝试将背景色设置为。清除:仅保留路径形状,uiview-矩形将消失。

    推荐文章