按下取消按钮时,我试图让视图缩小到右下角。目前,当我使用:
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
边缘,我想知道这是否与它有关?
答案 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)
})