以顶部中心为锚点来缩放UIView?

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)

现在图层停留在屏幕上的相同位置,但其锚点是其上边缘的中心,因此缩放和旋转将使该点固定.

  • 很好的答案.谢谢! (4认同)

Lau*_*ert 5

通过使用扩展

使用特定锚点缩放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)