UIBezierPath 不起作用

Posted

技术标签:

【中文标题】UIBezierPath 不起作用【英文标题】:UIBezierPath doesn't work 【发布时间】:2014-06-24 04:28:17 【问题描述】:

在想到发布这个问题之前,我已经在这个小sn-p代码上花费了几个小时......所以我在两个不同的类中编写了两段不同的代码,并且都习惯于剪出一个特定的形状。但是由于某种原因,其中只有一个有效!?!?我完全不知道为什么会这样,因为它们的结构完全相同。

下面是 WORKS 的 sn-p。

- (id)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    if (self) 
        // Initialization code
        self.backgroundColor = [UIColor blackColor];
        UIBezierPath *arrowPath = [UIBezierPath bezierPath];
        CGPoint start = CGPointMake(self.frame.size.width - 2, self.frame.size.height / 2);
        [arrowPath moveToPoint:start];
        [arrowPath addLineToPoint:CGPointMake(7, 7)];
        [arrowPath addLineToPoint:CGPointMake(2, 7)];
        [arrowPath addLineToPoint:CGPointMake(self.frame.size.width - 7, self.frame.size.height/2)];
        [arrowPath addLineToPoint:CGPointMake( 2, self.frame.size.height - 7)];
        [arrowPath addLineToPoint:CGPointMake(7, self.frame.size.height - 7)];
        [arrowPath addLineToPoint:start];
        [arrowPath closePath];
        UIView *arrow = [[UIView alloc]initWithFrame:self.frame];
        arrow.backgroundColor = [UIColor whiteColor];
        CAShapeLayer *mask = [CAShapeLayer layer];
        mask.frame = self.frame;
        mask.backgroundColor = (__bridge CGColorRef)([UIColor clearColor]);
        mask.path = arrowPath.CGPath;
        arrow.layer.mask = mask;
        [self addSubview:arrow];
        
    return self;

这是一段只能部分工作的代码。

- (id)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    if (self) 
        // Initialization code
        UIView *roundedRectView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height - 20)];
        roundedRectView.backgroundColor = [UIColor clearColor];
        [self addSubview:roundedRectView];

        UIBezierPath *roundedRectPath = [UIBezierPath bezierPathWithRoundedRect:roundedRectView.frame cornerRadius:10];
        UIView *rectangle = [[UIView alloc]initWithFrame:roundedRectView.frame];
        rectangle.backgroundColor = [UIColor blackColor];
        CAShapeLayer *mask = [CAShapeLayer layer];
        mask.frame = rectangle.frame;
        mask.path = roundedRectPath.CGPath;
        mask.backgroundColor = (__bridge CGColorRef)([UIColor clearColor]);
        rectangle.layer.mask = mask;
        rectangle.alpha = 0.8;
        [roundedRectView addSubview:rectangle];

        UIView *rectangleTwo = [[UIView alloc]initWithFrame:CGRectMake(0, self.frame.size.height - 20, self.frame.size.width, 20)];
        rectangleTwo.backgroundColor = [UIColor redColor];
        UIBezierPath *trianglePath = [UIBezierPath bezierPath];
        CGPoint start = CGPointMake(rectangleTwo.frame.size.width / 2 - 15, 0);
        [trianglePath moveToPoint:start];
        [trianglePath addLineToPoint:CGPointMake(start.x + 20, start.y)];
        [trianglePath addLineToPoint:CGPointMake(start.x + 10, start.y + 20)];
        [trianglePath addLineToPoint:start];
        [trianglePath closePath];
        CAShapeLayer *triangleMask = [CAShapeLayer layer];
        triangleMask.frame = rectangleTwo.frame;
        triangleMask.path = trianglePath.CGPath;
        rectangleTwo.layer.mask = triangleMask;
        [self addSubview:rectangleTwo];
    
    return self;

使用CGRectMake(0,0,80,60) 分配此对话气泡,屏幕上只显示圆角矩形,但看不到三角形。

谁能指出这段代码有什么问题?任何帮助表示赞赏,谢谢!

【问题讨论】:

【参考方案1】:

问题解决了! 原来我的triangleMask.frame 没有正确定义。我应该使用triangleMask.frame = CGRectMake(0, 0, rectangleTwo.frame.size.width, rectangleTwo.frame.size.height); 而不是triangleMask.path = rectangleTwo.frameCAShapeLayer 的原点与您要放置它的形状的原点有关!

【讨论】:

以上是关于UIBezierPath 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

设置线帽样式不起作用 UIBezierPath

在自定义 UIView 中动画 UIBezierPath 不起作用

UIBezierPath 在右上角和右下角不起作用

自定义 UIImageView 不起作用

UITextView textContainer排除路径在视图控制器的中间时不起作用

使用 UIBezierPath 向 UIView 添加阴影