将 UIBezierPath 添加到 UIView

add UIBezierPath to UIView

我有一个带有布局约束的 UIView(宽度:400,height:180),我想在视图中添加一个贝塞尔曲线。

我的贝塞尔曲线是这样的:

UIBezierPath* bezierPath = [UIBezierPath bezierPath];

// origin, height | left border
[bezierPath moveToPoint: CGPointMake(0, 20)];

// origin, height | left border
[bezierPath addLineToPoint: CGPointMake(0, _donationView.frame.size.height)];

// height, width | bottom border
[bezierPath addLineToPoint: CGPointMake(_donationView.frame.size.width , _donationView.frame.size.height)];

[bezierPath addLineToPoint: CGPointMake(_donationView.frame.size.width, 20)];

[bezierPath addLineToPoint: CGPointMake(_donationView.frame.size.width - 20, 20)];

[bezierPath addLineToPoint: CGPointMake(_donationView.frame.size.width - 30, 15)];

[bezierPath addLineToPoint: CGPointMake(_donationView.frame.size.width - 40, 20)];

[bezierPath addLineToPoint: CGPointMake(0, 20)];

[bezierPath closePath];
[UIColor.grayColor setFill];
[bezierPath fill];
[UIColor.blackColor setStroke];
bezierPath.lineWidth = 1;
[bezierPath stroke];

创建贝塞尔曲线后我传递给:

CAShapeLayer *shapeView = [[CAShapeLayer alloc] initWithLayer:_donationView.layer];
[shapeView setPath:bezierPath.CGPath];

_donationView.layer.mask = shapeView;

但是贝塞尔曲线转到这个 CGRect(0, 0, 240, 128);

我怎样才能拥有 (0,0,400, 180) 的 CGRect?

谢谢大家

问题是您做得太早了,donationView 还没有达到最终大小。因此,当您读出它的 frame.size 时,您会得到错误的结果。您需要推迟添加蒙版,直到 布局完成后。

如果 donationView 以后 调整过大小,您还可以 运行 进入更多问题。遮罩层(或任何层)不参与自动布局是非常烦人的。因此,如果调整 donationView 的大小,您将必须删除此掩码并创建一个具有正确大小的新掩码并再次添加