Ios 如何缩放UIBezierPath并使其居中?
我正在使用BezierPath,可以成功地在视图中制作基本的星形,效果非常好。但是,视图的大小可以更改。当视图大小改变时,我无法将这条贝塞尔路径居中,我成功地缩放了它,但很难将其居中Ios 如何缩放UIBezierPath并使其居中?,ios,swift,uibezierpath,Ios,Swift,Uibezierpath,我正在使用BezierPath,可以成功地在视图中制作基本的星形,效果非常好。但是,视图的大小可以更改。当视图大小改变时,我无法将这条贝塞尔路径居中,我成功地缩放了它,但很难将其居中 我怎样才能做到这一点?谢谢 UIView的layoutSubviews在调整大小时被调用,您可以通过覆盖该方法重置掩码。UIView的layoutSubviews在调整大小时被调用,您可以通过覆盖该方法重置掩码。您的路径中心随此命令移动: path.apply(CGAffineTransform(scaleX:
我怎样才能做到这一点?谢谢 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()
?我更新了答案,以便更清楚地了解我所更改的内容。我的两个建议都适用于你的代码。是的,你绝对是对的,问题在于挤压。自从我动态计算了星体挤出,现在它已经开始工作了。谢谢你的最新更新。