【问题标题】:Rotate UIView around center where origin is different from x:0, y:0围绕原点与 x:0, y:0 不同的中心旋转 UIView
【发布时间】:2018-06-13 11:13:12
【问题描述】:

假设我已经创建了一个这样的自定义 UIView:

let view = CustomView((frame: CGRect(x: 0, y: 44, width: self.view.frame.width, height: self.view.frame.width))
                                           ======

我想这样旋转它:

// Inside the CustomView    
self.transform = CGAffineTransform(rotationAngle: angle)

然后视图不会围绕其中心旋转。但是如果视图是这样创建的

let view = CustomView((frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.width))
                                           =====

(我已经用 ===== 标记了差异)

视图按预期围绕其中心旋转。我知道可以通过锚点调整旋转中心。但据我了解,CGPoint(0,0) 表示“左上角”,CGPoint(0.5, 0,5) 表示中心,但如果原点的 y 轴与 0 不同,这将不起作用。

谁能告诉我如何解决这个问题?

【问题讨论】:

    标签: ios uiview cgaffinetransform


    【解决方案1】:

    要设置anchorPoint,请使用以下方法

    func setAnchorPoint(_ anchorPoint: CGPoint, for view: UIView) {
        var newPoint = CGPoint(x: view.bounds.size.width * anchorPoint.x, y: view.bounds.size.height * anchorPoint.y)
        var oldPoint = CGPoint(x: view.bounds.size.width * view.layer.anchorPoint.x, y: view.bounds.size.height * view.layer.anchorPoint.y)
    
        newPoint = newPoint.applying(view.transform)
        oldPoint = oldPoint.applying(view.transform)
    
        var position: CGPoint = view.layer.position
        position.x -= oldPoint.x
        position.x += newPoint.x
        position.y -= oldPoint.y
        position.y += newPoint.y
    
        view.layer.position = position
        view.layer.anchorPoint = anchorPoint
    }
    

    你可以设置锚点...

    setAnchorPoint(CGPoint(x: 0.5, y: 0.5), view: view)
    

    然后执行转换。因此它将围绕其锚点转换视图。

    【讨论】:

    • 感谢您的回答。我的一个朋友刚刚发现了一个丑陋的黑客来实现我的目标:我在我的视图周围放置了一个相同大小的包装器。如果我在包装器内旋转视图,尽管包装器的原点已更改,但锚点仍按预期保持。当有时间重构和整理东西时,我会测试你的解决方案,没有冒犯。
    猜你喜欢
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 2013-09-22
    • 2010-10-05
    相关资源
    最近更新 更多