- (void)drawRect:(CGRect)rect {
// Start by filling the area with the blue color
[[UIColor blueColor] setFill];
UIRectFill( rect );
// Assume that there's an ivar somewhere called holeRect of type CGRect
// We could just fill holeRect, but it's more efficient to only fill the
// area we're being asked to draw.
CGRect holeRectIntersection = CGRectIntersection( holeRect, rect );
[[UIColor clearColor] setFill];
UIRectFill( holeRectIntersection );
}
5条答案
按热度按时间qybjjes11#
你必须重写顶视图的
drawRect
方法。例如,你可以创建一个HoleyView
类,它派生自UIView
(你可以通过添加一个新文件到你的项目中,选择Objective-C子类,并将“Subclass of”设置为UIView
)。在HoleyView
中,drawRect
看起来像这样:如果你使用的是Interface Builder,请确保将holey视图的类更改为
HoleyView
。你可以通过在Interface Builder的视图中选择并在检查器中选择“Identity”窗格(最右边的“i”图标)来完成。您还必须使用以下代码片段将顶视图设置为非不透明,或者通过取消选中“界面构建器”中视图属性中的
Opaque
复选框(您将在视图属性的“视图”部分中找到它),并将其背景色的不透明度设置为0%(背景色在同一部分中设置)。如果你想画圆,你必须使用
Core Graphics
(又名Quartz 2D),你可能想阅读编程指南,可以在这里找到。要绘制椭圆而不是矩形,
drawRect
应如下所示:iszxjhcz2#
所有其他的答案都是正确的,但是很可能用清晰的颜色绘制,或者说 * 擦除 * 任何路径中的现有颜色,即使使用-[UIBezierPath fill]或类似的方便方法。您所要做的就是根据您试图实现的效果将上下文混合模式设置为一个适当的值,如下所示:
有大约24个不同的选项可以选择,看看CGContext参考。
vulvrdjw3#
要绘制椭圆而不是矩形,只需将blendMode设置为clear:
hpxqektj4#
这些可能是愚蠢的方式,但我不会做你描述的方式,但使它看起来像你想要的样子。
(雅克的答案刚刚弹出来--在我看来不错)
方法1:在视图控制器中建立一个矩形列表,在暴露的"洞"周围平铺。随着你的洞数量的增加,平铺矩形的数量也会增加。
方法二:反过来想。蓝色视图应该在后面,红色视图的一部分放在上面。你仍然看到红色视图,除了蓝色视图掩盖的"洞"之外,所有的东西都被红色视图掩盖了。但是你真正做的是从你想曝光的视图中复制区域,并在你制作每个孔时把它们放在蒙版的顶部。如果你有一些模拟深度的效果,你可以根据需要为每个洞添加。
两者都不需要子类化或drawRect:。
6rvt4ljy5#
有些答案相当古老。
2023年,最新技术包括...
以及