如何在缩放并翻转图形后将其正确定位到视图边界框?
问题:缩放翻转图形后无法正确定位回边界框
原始闪电图形:
我尝试用以下代码对图形进行缩放并垂直翻转:
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
相关产品推荐
相关产品推荐

