iOS在UIView上打造的其他形状比正方形更好

时间:2014-02-13 00:38:19

标签: ios uiview mask

我有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);
}

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

P.S。我正在做一些掩蔽,但它在洞周围留下了一条白线,所以我需要避免这种情况。

2 个答案:

答案 0 :(得分:2)

[[UIColor clearColor] setFill];
UIRectFill(holeRectIntersection);

这没有做任何事情 - 用清晰的颜色绘画实际上是无操作。您最想要做的是添加您尝试剪切的矩形作为您正在创建的路径的一部分,即在CGContextClosePath之前插入对CGContextAddRect的调用。请参阅Quartz 2D Programming Guide中的Filling a Path

答案 1 :(得分: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