我假设你想要完全填充(不变形)形状以适应视图。我还假设您已经有了具有路径的形状层,因为问题被标记为CAShapeLayer。
在这种情况下,您将获得形状图层路径的边界框,并计算适用于该路径的适当比例因子。
根据形状的纵横比和它应该适合的视图,宽度或高度将确定比例因子。
一旦您有了比例因子,就会创建一个变换来应用于路径。由于路径可能不从(0,0)开始,因此您还需要在变换中将路径平移(移动)到边界框原点。
如果您希望新路径位于视图中心,则需要计算要移动多少。如果您不需要,请注释掉该代码,但我也包含了它以供其他人阅读此答案时使用。
最后,您有一个新路径,所以您只需创建一个新形状层,分配路径,适当地设置样式并将其添加到视图中即可。
CGRect boundingBox = CGPathGetBoundingBox(shapeLayer.path);
CGFloat boundingBoxAspectRatio = CGRectGetWidth(boundingBox)/CGRectGetHeight(boundingBox);
CGFloat viewAspectRatio = CGRectGetWidth(viewToFitIn.frame)/CGRectGetHeight(viewToFitIn.frame);
CGFloat scaleFactor = 1.0;
if (boundingBoxAspectRatio > viewAspectRatio) {
scaleFactor = CGRectGetWidth(viewToFitIn.frame)/CGRectGetWidth(boundingBox);
} else {
scaleFactor = CGRectGetHeight(viewToFitIn.frame)/CGRectGetHeight(boundingBox);
}
CGAffineTransform scaleTransform = CGAffineTransformIdentity;
scaleTransform = CGAffineTransformScale(scaleTransform, scaleFactor, scaleFactor);
scaleTransform = CGAffineTransformTranslate(scaleTransform, -CGRectGetMinX(boundingBox), -CGRectGetMinY(boundingBox));
CGSize scaledSize = CGSizeApplyAffineTransform(boundingBox.size, CGAffineTransformMakeScale(scaleFactor, scaleFactor));
CGSize centerOffset = CGSizeMake((CGRectGetWidth(viewToFitIn.frame)-scaledSize.width)/(scaleFactor*2.0),
(CGRectGetHeight(viewToFitIn.frame)-scaledSize.height)/(scaleFactor*2.0));
scaleTransform = CGAffineTransformTranslate(scaleTransform, centerOffset.width, centerOffset.height);
CGPathRef scaledPath = CGPathCreateCopyByTransformingPath(shapeLayer.path,
&scaleTransform);
CAShapeLayer *scaledShapeLayer = [CAShapeLayer layer];
scaledShapeLayer.path = scaledPath;
scaledShapeLayer.fillColor = [UIColor blueColor].CGColor;
[viewToFitIn.layer addSublayer:scaledShapeLayer];
CGPathRelease(scaledPath);
在我的示例代码和形状中,它看起来像这样:
![输入图像说明](https://istack.dev59.com/pbb4p.webp)