从子视图中的路径对象在 UIView 中构建剪辑区域
Posted
技术标签:
【中文标题】从子视图中的路径对象在 UIView 中构建剪辑区域【英文标题】:Building a clip area in a UIView from path objects in its subviews 【发布时间】:2011-02-09 22:07:32 【问题描述】:我正在尝试在 UIView 中生成一个剪切区域,该区域由其子视图中的路径对象生成。例如,我可能有一个包含正方形的子视图和另一个包含圆形的子视图。我希望能够在父超级视图中生成一个剪辑,这是这两种形状的结合。有人可以解释如何做到这一点吗?到目前为止,我能弄清楚的只是:
1 - 父视图的 drawRect: 方法在其子视图的 drawRects 之前被调用,并且 2 - 在所有三个实例中可访问的 ContextRef 是相同的。
除此之外,我很难过。 谢谢, 霍华德
【问题讨论】:
【参考方案1】:简而言之,您必须遍历所有子视图并让每个子视图修改当前上下文路径,然后将该路径设置为剪切路径。您可以要求每个视图的路径或将上下文传递给每个视图。
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 );
【讨论】:
啊,我想我差不多了。我假设每个子视图的 pathTranslatedForView: 方法的主要任务之一是调整路径的坐标以说明子视图相对于其父视图的偏移量,但最简单的方法是什么?在构建路径之前设置平移变换? 这主要取决于您的实施细节。您是在视图中保留实际的 CGPathRef,还是圆形和正方形的位置?许多 CGPath 操作接受一个变换,因此每个类都可以为自己构建一个变换。或者,超级视图可以在调用每个子视图之前对上下文应用转换。【参考方案2】:也许尝试将背景颜色设置为 .clear:UIView - Rectangle 将消失只租用路径形状
【讨论】:
以上是关于从子视图中的路径对象在 UIView 中构建剪辑区域的主要内容,如果未能解决你的问题,请参考以下文章