gpt4 book ai didi

ios - 动画 UIBezierPath 从所有圆角到具有左上角和右上角圆角的路径

转载 作者:行者123 更新时间:2023-12-01 22:21:00 25 4
gpt4 key购买 nike

我正在设置一个带有所有圆角路径的蒙版到这样的 View :

CGFloat cornerRadius = CGRectGetHeight(self.myView.bounds) / 2;
CGSize cornerRadiusSize = CGSizeMake(cornerRadius, cornerRadius);
CGRect bounds = self.myView.bounds;

CAShapeLayer *maskLayer = [CAShapeLayer layer];

UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:bounds byRoundingCorners:UIRectCornerAllCorners cornerRadii:cornerRadiusSize];

maskLayer.path = maskPath.CGPath;

self.myView.layer.mask = maskLayer;

看起来像这样:

screenshot 1

我正在尝试将其设置为具有左上角和右上角圆角的路径,如下所示:
UIBezierPath *newMaskPath = [UIBezierPath bezierPathWithRoundedRect:bounds byRoundingCorners:UIRectCornerTopLeft | UIRectCornerTopRight cornerRadii:cornerRadiusSize];

CABasicAnimation *maskPathAnimation = [CABasicAnimation animationWithKeyPath:@"path"];

maskPathAnimation.duration = 0.3;

maskPathAnimation.fromValue = (id)maskLayer.path;
maskPathAnimation.toValue = (id)newMaskPath.CGPath;

[maskLayer addAnimation:maskPathAnimation forKey:nil];

maskLayer.path = newMaskPath.CGPath;

看起来像这样:

screenshot 2

但是动画被破坏了,它看起来像是将一些角落动画到其他角落:

screenshot 3

最佳答案

我通过使用以下方法手动创建蒙版路径来解决它:

- (UIBezierPath *)getMaskPathForView:(UIView *)view withCorners:(UIRectCorner)corners {

CGSize size = view.bounds.size;
CGFloat cornerRadius = size.height / 2;

UIBezierPath *maskPath = [UIBezierPath bezierPath];

// top left
if (corners & UIRectCornerTopLeft) {
[maskPath moveToPoint:CGPointMake(0, cornerRadius)];
[maskPath addQuadCurveToPoint:CGPointMake(cornerRadius, 0) controlPoint:CGPointZero];
} else {
CGPoint topLeftCornerPoint = CGPointZero;

[maskPath moveToPoint:topLeftCornerPoint];
[maskPath addQuadCurveToPoint:topLeftCornerPoint controlPoint:topLeftCornerPoint];
}

// top right
if (corners & UIRectCornerTopRight) {
[maskPath addLineToPoint:CGPointMake(size.width - cornerRadius, 0)];
[maskPath addQuadCurveToPoint:CGPointMake(size.width, cornerRadius) controlPoint:CGPointMake(size.width, 0)];
} else {
CGPoint topRightCornerPoint = CGPointMake(size.width, 0);

[maskPath addLineToPoint:topRightCornerPoint];
[maskPath addQuadCurveToPoint:topRightCornerPoint controlPoint:topRightCornerPoint];
}

// bottom right
if (corners & UIRectCornerBottomRight) {
[maskPath addLineToPoint:CGPointMake(size.width, size.height - cornerRadius)];
[maskPath addQuadCurveToPoint:CGPointMake(size.width - cornerRadius, size.height) controlPoint:CGPointMake(size.width, size.height)];
} else {
CGPoint bottomRightCornerPoint = CGPointMake(size.width, size.height);

[maskPath addLineToPoint:bottomRightCornerPoint];
[maskPath addQuadCurveToPoint:bottomRightCornerPoint controlPoint:bottomRightCornerPoint];
}

// bottom left
if (corners & UIRectCornerBottomLeft) {
[maskPath addLineToPoint:CGPointMake(cornerRadius, size.height)];
[maskPath addQuadCurveToPoint:CGPointMake(0, size.height - cornerRadius) controlPoint:CGPointMake(0, size.height)];
} else {
CGPoint bottomLeftCornerPoint = CGPointMake(0, size.height);

[maskPath addLineToPoint:bottomLeftCornerPoint];
[maskPath addQuadCurveToPoint:bottomLeftCornerPoint controlPoint:bottomLeftCornerPoint];
}

[maskPath closePath];

return maskPath;
}

像这样:
CAShapeLayer *maskLayer = [CAShapeLayer layer];

UIBezierPath *maskPath = [self getMaskPathForView:self.myView withCorners:UIRectCornerAllCorners];

maskLayer.path = maskPath.CGPath;

self.myView.layer.mask = maskLayer;

和:
UIBezierPath *newMaskPath = [self getMaskPathForView:self.myView withCorners:UIRectCornerTopLeft | UIRectCornerTopRight];

CABasicAnimation *maskPathAnimation = [CABasicAnimation animationWithKeyPath:@"path"];

maskPathAnimation.duration = 0.3;

maskPathAnimation.fromValue = (id)maskLayer.path;
maskPathAnimation.toValue = (id)newMaskPath.CGPath;

[maskLayer addAnimation:maskPathAnimation forKey:nil];

maskLayer.path = newMaskPath.CGPath;

关于ios - 动画 UIBezierPath 从所有圆角到具有左上角和右上角圆角的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44882491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com