gpt4 book ai didi

swift - 动画 View 以隐藏/缩放到其右下角

转载 作者:行者123 更新时间:2023-11-28 10:44:09 25 4
gpt4 key购买 nike

当按下取消按钮时,我试图让 View 在右下角缩小到什么都没有。目前当我使用:

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

View 缩小到它的中心。

我知道我应该设置图层的 anchor ,以便它缩小到那个点,但是当我这样做时,它会将 View 中心移动到那个点然后缩小:

    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)
})

有什么想法吗?

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

最佳答案

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

当您更改 CALayer 的 anchor 时,您也可以立即设置图层的位置以适应更改。您可以使用相对于 View 边界的 anchor 更改量来偏移 View 位置。

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

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 的位置。您也可以这样做而无需更改位置。

无论何时设置 anchor ,只需将前一帧设置回原位即可,

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

这将防止您的 View 移动并保持在同一位置,尽管 anchorPoint 发生了变化。

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

    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)
})

关于swift - 动画 View 以隐藏/缩放到其右下角,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49257340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com