Ios 如何缩放UIBezierPath并使其居中?

Ios 如何缩放UIBezierPath并使其居中?,ios,swift,uibezierpath,Ios,Swift,Uibezierpath,我正在使用BezierPath,可以成功地在视图中制作基本的星形,效果非常好。但是,视图的大小可以更改。当视图大小改变时,我无法将这条贝塞尔路径居中,我成功地缩放了它,但很难将其居中 我怎样才能做到这一点?谢谢 UIView的layoutSubviews在调整大小时被调用,您可以通过覆盖该方法重置掩码。UIView的layoutSubviews在调整大小时被调用,您可以通过覆盖该方法重置掩码。您的路径中心随此命令移动: path.apply(CGAffineTransform(scaleX:

我正在使用BezierPath,可以成功地在视图中制作基本的星形,效果非常好。但是,视图的大小可以更改。当视图大小改变时,我无法将这条贝塞尔路径居中,我成功地缩放了它,但很难将其居中


我怎样才能做到这一点?谢谢

UIView的
layoutSubviews
在调整大小时被调用,您可以通过覆盖该方法重置掩码。

UIView的
layoutSubviews
在调整大小时被调用,您可以通过覆盖该方法重置掩码。

您的路径中心随此命令移动:

path.apply(CGAffineTransform(scaleX: scale, y: scale))
要使您的
中心保持在中心位置,请按
1/scale
对其进行缩放,这样当按
缩放时,它将位于视图的中心位置(因为
(1/scale)*scale==1
):

更改:

let center = CGPoint(x: width / 2.0, y: height / 2.0)
let radius = width / 2.0
致:

这两个缩放相互抵消,然后路径的中心结束于最初计算的位置


也就是说,当
高度!=宽度
。如果您忘记了缩放,只需为
半径计算选择
宽度
高度
中的最小值,可能会得到更好的结果:

去掉
比例
,或将其设置为
1.0
,然后

更改:

let center = CGPoint(x: width / 2.0, y: height / 2.0)
let radius = width / 2.0
致:

这将使恒星尽可能大,同时仍然完全适合视野


正如你所注意到的,恒星随着变小而变得“胖”(更圆)。这是因为
starextraction
的硬编码常量为
60.0
。该值应基于
半径

计算
半径后设置
starextraction

let radius = min(width, height) / 2.0
let starExtrusion = radius * 0.4

您可以改变
0.4
乘数以改变星形的形状。

使用此命令移动路径中心:

path.apply(CGAffineTransform(scaleX: scale, y: scale))
要使您的
中心保持在中心位置,请按
1/scale
对其进行缩放,这样当按
缩放时,它将位于视图的中心位置(因为
(1/scale)*scale==1
):

更改:

let center = CGPoint(x: width / 2.0, y: height / 2.0)
let radius = width / 2.0
致:

这两个缩放相互抵消,然后路径的中心结束于最初计算的位置


也就是说,当
高度!=宽度
。如果您忘记了缩放,只需为
半径计算选择
宽度
高度
中的最小值,可能会得到更好的结果:

去掉
比例
,或将其设置为
1.0
,然后

更改:

let center = CGPoint(x: width / 2.0, y: height / 2.0)
let radius = width / 2.0
致:

这将使恒星尽可能大,同时仍然完全适合视野


正如你所注意到的,恒星随着变小而变得“胖”(更圆)。这是因为
starextraction
的硬编码常量为
60.0
。该值应基于
半径

计算
半径后设置
starextraction

let radius = min(width, height) / 2.0
let starExtrusion = radius * 0.4

您可以改变
0.4
乘数来改变星形的形状。

我已经调用了LayoutSubview,但问题是如何重置遮罩?因为只有当宽度和高度相等时,遮罩才起作用。我已经调用了LayoutSubView,但问题是如何重置遮罩?因为只有当宽度和高度相等时,遮罩才起作用。我试过了,但不起作用,你能分享完整的代码吗,也许我做错了。我建议了两件不同的事情。你有没有试过每一个,但都没有成功?你能分享你的完整代码吗?例如,什么是
pointFrom()
?我更新了答案,以便更清楚地了解我所更改的内容。我的两个建议都适用于你的代码。是的,你绝对是对的,问题在于挤压。自从我动态计算了星体挤出,现在它已经开始工作了。谢谢你的最新更新。我试过了,但没有成功,你能分享完整的代码吗,也许我做错了。我建议了两件不同的事情。你有没有试过每一个,但都没有成功?你能分享你的完整代码吗?例如,什么是
pointFrom()
?我更新了答案,以便更清楚地了解我所更改的内容。我的两个建议都适用于你的代码。是的,你绝对是对的,问题在于挤压。自从我动态计算了星体挤出,现在它已经开始工作了。谢谢你的最新更新。