首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动画视图以隐藏/缩放到其右下角

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

Stack Overflow用户
提问于 2018-03-13 13:23:39
回答 1查看 1.2K关注 0票数 0

当按下“取消”按钮时,我试图得到一个视图,使其在右下角缩小到零。目前,当我使用:

代码语言:javascript
复制
    UIView.animate(withDuration: 0.7, delay: 0, options: .beginFromCurrentState, animations: {
        self.transform = CGAffineTransform(scaleX: 0.01, y: 0.01)
    })

视野缩小到中心。

我知道我应该设置这个层的锚点,这样它就会收缩到那个点,但是当我这样做的时候,它会将视图中心移动到那个点,然后收缩:

代码语言:javascript
复制
    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边缘,我想知道这是否与此有关?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-13 14:40:24

UIView或CALayer的帧实际上是从层位和锚固点计算出的属性。所以,当你改变其中任何一个,层框架也会改变,因此你会看到视图运动的效果。

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

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

代码语言:javascript
复制
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)
    }
}

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

无论何时设置anchorPoint,只需设置前一帧,

代码语言:javascript
复制
let originalFrame = view.frame
view.layer.anchorPoint = CGPoint(x: 0, y: 0)
view.frame = originalFrame

这将阻止您的视图移动,并保持在相同的位置,尽管在anchorPoint的变化。

另外,对于您的特殊情况,将anchorPoint设置为layer会触发内部动画。因此,如果您想使其像收缩到下或上边缘,执行anchorPoint更改之前,动画如下,

代码语言:javascript
复制
    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)
    })
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49257340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档