You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在缩放并翻转图形后将其正确定位到视图边界框?

问题:缩放翻转图形后无法正确定位回边界框

原始闪电图形:
原始闪电图形

我尝试用以下代码对图形进行缩放并垂直翻转:

CGAffineTransform transform = CGAffineTransformMakeScale(newSize.width / initialSize.width, -1 * (newSize.height / initialSize.height));
CGMutablePathRef mutablePath = CGPathCreateMutableCopyByTransformingPath(shapeLayer.path, &transform);
shapeLayer.path = mutablePath;
CGPathRelease(mutablePath);

执行后得到的效果:
翻转缩放后的错误效果

我试过下面的平移变换组合,但还是没成功:

CGAffineTransform transform = CGAffineTransformMakeTranslation(newSize.width / 2, newSize.height / 2);
transform = CGAffineTransformScale(transform, newSize.width / initialSize.width, -1 * (newSize.height / initialSize.height));
transform = CGAffineTransformTranslate(transform, -newSize.width / 2, -newSize.height / 2);

请问怎么把图形正确定位回视图的边界框内?


解决方案

问题核心是你用视图尺寸做平移参考,但翻转缩放的基准应该是图形自身的边界框,而非视图尺寸。正确的处理逻辑是围绕图形自身的中心做变换,再修正翻转后的位置偏移,具体代码如下:

// 获取原始路径的自身边界框
CGRect pathBounds = CGPathGetBoundingBox(shapeLayer.path);

// 计算缩放比例
CGFloat scaleX = newSize.width / pathBounds.size.width;
CGFloat scaleY = -newSize.height / pathBounds.size.height;

// 构建变换矩阵:先平移到图形中心,再缩放翻转,最后平移到视图左上角修正偏移
CGAffineTransform transform = CGAffineTransformMakeTranslation(
    -pathBounds.origin.x - pathBounds.size.width / 2,
    -pathBounds.origin.y - pathBounds.size.height / 2
);
transform = CGAffineTransformScale(transform, scaleX, scaleY);
transform = CGAffineTransformTranslate(transform, newSize.width / 2, newSize.height / 2);

// 应用变换到路径
CGMutablePathRef mutablePath = CGPathCreateMutableCopyByTransformingPath(shapeLayer.path, &transform);
shapeLayer.path = mutablePath;
CGPathRelease(mutablePath);

另一种更简便的方式是直接操作shapeLayer的属性,无需修改路径:

// 将图层锚点设为中心
shapeLayer.anchorPoint = CGPointMake(0.5, 0.5);
// 把图层位置移到视图中心
shapeLayer.position = CGPointMake(newSize.width / 2, newSize.height / 2);
// 应用缩放和垂直翻转
shapeLayer.transform = CATransform3DMakeScale(
    newSize.width / initialSize.width,
    -newSize.height / initialSize.height,
    1.0
);

两种方式都能让图形正确填充到视图的边界框内,不会出现偏移。


内容的提问来源于stack exchange,提问作者Ser Pounce

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 23:00:22