Ali*_*olt 19 objective-c calayer uiview
我正在使用CGAffineTransformMakeScale缩放UIView,但我希望将其固定在当前的顶部中心点,因为它已经缩放.
我已经研究了设置,view.layer.anchorPoint
但我相信我需要将其与设置结合起来view.layer.position
考虑锚点的变化.
如果有人能指出我正确的方向,我将非常感激!
rob*_*off 40
看看我在这里的答案,了解更改锚点时视图移动的原因:https://stackoverflow.com/a/12208587/77567
因此,从您的视图转换设置开始以识别身份.当视图未转换时,找到其上边缘的中心:
CGRect frame = view.frame;
CGPoint topCenter = CGPointMake(CGRectGetMidX(frame), CGRectGetMinY(frame));
Run Code Online (Sandbox Code Playgroud)
然后锚点指向顶部边缘的中间:
view.layer.anchorPoint = CGPointMake(0.5, 0);
Run Code Online (Sandbox Code Playgroud)
现在图层position
(或视图center
)是图层顶边中心的位置.如果你停在此处,图层将移动,使其顶边的中心位于更改锚点之前的真实中心位置.因此position
,刚才将图层更改为其上边缘的中心:
view.layer.position = topCenter;
Run Code Online (Sandbox Code Playgroud)
现在图层停留在屏幕上的相同位置,但其锚点是其上边缘的中心,因此缩放和旋转将使该点固定.
使用特定锚点缩放UIView,同时避免放错位置:
extension UIView {
func applyTransform(withScale scale: CGFloat, anchorPoint: CGPoint) {
layer.anchorPoint = anchorPoint
let scale = scale != 0 ? scale : CGFloat.leastNonzeroMagnitude
let xPadding = 1/scale * (anchorPoint.x - 0.5)*bounds.width
let yPadding = 1/scale * (anchorPoint.y - 0.5)*bounds.height
transform = CGAffineTransform(scaleX: scale, y: scale).translatedBy(x: xPadding, y: yPadding)
}
}
Run Code Online (Sandbox Code Playgroud)
因此,以视图的顶部中心为锚点将视图缩小到其大小的一半:
view.applyTransform(withScale: 0.5, anchorPoint: CGPoint(x: 0.5, y: 0))
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
18601 次 |
最近记录: |