动画视图隐藏/缩放到其右下角

时间:2018-03-13 13:23:40

标签: swift

按下取消按钮时,我试图让视图缩小到右下角。目前,当我使用:

    UIView.animate(withDuration: 0.7, delay: 0, options: .beginFromCurrentState, animations: {
        self.transform = CGAffineTransform(scaleX: 0.01, y: 0.01)
    })

视图缩小到其中心。

据我所知,我应该设置图层的锚点,使其缩小到那一点,但是当我这样做时,它会将视图中心移动到那个点然后收缩:

    UIView.animate(withDuration: 0.7, delay: 0, options: .beginFromCurrentState, animations: {
        self.layer.anchorPoint = CGPoint(x: 0.0, y: 0.0)
        self.transform = CGAffineTransform(scaleX: 0.01, y: 0.01)
    })

有什么想法吗?

编辑:更多信息将是我使用制图将视图的约束设置为viewController.view边缘,我想知道这是否与它有关?

1 个答案:

答案 0 :(得分:3)

UIView或CALayer的框架实际上是从图层位置和锚点计算的派生属性。因此,当您更改其中任何一个时,图层框架也会发生变化,因此您会看到视图移动的效果。

当您更改CALayer的锚点时,您还可以立即设置图层的位置以便为更改进行折衷。您可以使用相对于视图边界的锚点更改量来偏移视图位置。

这是UIView上的一个简单扩展,您可以使用它来更改图层锚点,而无需实际更改位置。

extension UIView {

    func set(anchorPoint: CGPoint) {

        let originalPosition = CGPoint(x: frame.midX, y: frame.midY)

        let width = bounds.width
        let height = bounds.height

        let newXPosition = originalPosition.x +  (anchorPoint.x - 0.5) * width
        let newYPosition = originalPosition.y + (anchorPoint.y - 0.5) * height

        layer.anchorPoint = anchorPoint

        layer.position = CGPoint(x: newXPosition,
                                 y: newYPosition)
    }
}

一旦您更改了anchorPoint,上面的代码就会更改CALayer的位置。你也可以这样做而不必改变位置。

每当你设置anchorPoint时,只需设置回前一帧,

let originalFrame = view.frame
view.layer.anchorPoint = CGPoint(x: 0, y: 0)
view.frame = originalFrame

这会阻止你的视图移动并保持在同一位置,尽管anchorPoint发生了变化。

此外,对于您的特定情况,将anchorPoint设置为图层会触发内部动画。所以,如果你想让它像收缩到下边缘或上边缘一样,在动画之前执行anchorPoint更改,就像这样,

    UIView.performWithoutAnimation {
        self.set(anchorPoint: CGPoint(x: 0, y: 0))
    }

    UIView.animate(withDuration: 0.7, delay: 0, options: .beginFromCurrentState, animations: {
        self.transform = CGAffineTransform(scaleX: 0.01, y: 0.01)
    })