iOS在UIView中打洞不是正方形

Posted

技术标签:

【中文标题】iOS在UIView中打洞不是正方形【英文标题】:iOS make hole in UIView other shape than square 【发布时间】:2014-02-13 00:38:19 【问题描述】:

我有一个UIView 可以绘制不同的形状。我可以在我的图像上打一个洞让它透明,工作正常,但这个洞只是方形的,

//hole
CGRect holeRectValue = CGRectMake(300, 40, 80, 100);

CGRect holeRectIntersection = CGRectIntersection( holeRectValue, rect );
[[UIColor clearColor] setFill];
UIRectFill(holeRectIntersection);

现在我需要在图像上打洞,但不是矩形,而是我绘制的图形的形状,

代码如下:

- (id)initWithFrame:(CGRect)frame forNode0:(CGPoint)node0 forNode1:(CGPoint)node1 fornode2:(CGPoint)node2 fornode3:(CGPoint)node3 fornode4:(CGPoint)node4 fornode5:(CGPoint)node5 fornode6:(CGPoint)node6 fornode7:(CGPoint)node7 fornode8:(CGPoint)node8 fornode9:(CGPoint)node9

    self = [super initWithFrame:frame];
    if (self) 
        self.opaque = NO;
        self.node0Pos = node0;
        self.node1Pos = node1;
        self.node2Pos = node2;
        self.node3Pos = node3;
        self.node4Pos = node4;
        self.node5Pos = node5;
    
    return self;


// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect

    //bgnd
    UIGraphicsBeginImageContext(self.frame.size);
    [[UIImage imageNamed:@"cat.jpeg"] drawInRect:self.bounds];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    [[UIColor colorWithPatternImage:image] setFill];

    // Drawing code
    UIRectFill(rect);

    // Drawing code
    //1. begin new path
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextBeginPath(context);
    //2. move to initial starting point
    CGContextMoveToPoint(context, self.node0Pos.x, self.node0Pos.y);
    //3. add lines defining shape
    CGContextAddLineToPoint(context, self.node1Pos.x, self.node1Pos.y);
    CGContextAddLineToPoint(context, self.node2Pos.x, self.node2Pos.y);
    CGContextAddLineToPoint(context, self.node3Pos.x, self.node3Pos.y);
    CGContextAddLineToPoint(context, self.node4Pos.x, self.node4Pos.y);
    CGContextAddLineToPoint(context, self.node5Pos.x, self.node5Pos.y);

    //4. optionally close path
    CGContextClosePath(context);

    CGColorRef color;

    //5. draw path
    color = [UIColor colorWithRed:1 green:0 blue:228/255.0f alpha:0.5].CGColor;

    //CGContextSetFillColor(context, color);
    CGContextSetFillColorWithColor(context, color);
    CGContextDrawPath(context, kCGPathFill);

    //
    //hole
    CGRect holeRectValue = CGRectMake(300, 40, 80, 100);

    CGRect holeRectIntersection = CGRectIntersection( holeRectValue, rect );
    [[UIColor clearColor] setFill];
    UIRectFill(holeRectIntersection);

那么我如何用我的实际上下文路径制作“洞”?

附:我做了一些遮罩,但它在孔周围留下了一条白线,所以我需要避免这种情况。

【问题讨论】:

drawRect: How do I do an "inverted clip"的可能重复 看看这个类似的问答是否有帮助:[Cut transparent hole in UIView][1] [1]:***.com/questions/9711248/… 【参考方案1】:
[[UIColor clearColor] setFill];
UIRectFill(holeRectIntersection);

这无济于事——用清晰的颜色绘制实际上是无操作的。您最可能想要做的是将您尝试剪切的矩形添加为您正在创建的路径的一部分,即在您的 CGContextClosePath 之前插入对CGContextAddRect 的调用。请参阅 Quartz 2D 编程指南中的 Filling a Path。

【讨论】:

嗨,Noah,谢谢,但我当时并没有说清楚,我只是用矩形来测试我视图上的切割孔,我想做的是将孔切割成我的多边形【参考方案2】:

我相信您正在寻找的是 CALayer.mask 属性。要创建一个“洞”,您将生成一个 CALayer 对象,该对象具有您想要制作的洞的形状的 Alpha 通道,然后将其应用于您想要打洞的视图。

在半伪代码中:

CALayer *holeMask;
UIView *myView;

// 
// Build the holeMask object via whatever means, 
// and set myView to the target view that you want
// to punch the hole in...
//

myView.layer.mask = holeMask

【讨论】:

以上是关于iOS在UIView中打洞不是正方形的主要内容,如果未能解决你的问题,请参考以下文章

ios 设备上图像的内存管理性能不佳

将uiview分配或替换给其他uiview

在 iOS 中将图像裁剪为正方形

如何在 Swift 中创建独特的形状或 UIView

如何制作具有圆角顶角和方形底角的 UIView

UIView 使用约束自动布局居中和调整大小