当按下“取消”按钮时,我试图得到一个视图,使其在右下角缩小到零。目前,当我使用:
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边缘,我想知道这是否与此有关?
发布于 2018-03-13 14:40:24
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)
}
}一旦您更改了CALayer,上面的代码就会更改anchorPoint的位置。你也可以这样做,而不必改变立场。
无论何时设置anchorPoint,只需设置前一帧,
let originalFrame = view.frame
view.layer.anchorPoint = CGPoint(x: 0, y: 0)
view.frame = originalFrame这将阻止您的视图移动,并保持在相同的位置,尽管在anchorPoint的变化。
另外,对于您的特殊情况,将anchorPoint设置为layer会触发内部动画。因此,如果您想使其像收缩到下或上边缘,执行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)
})https://stackoverflow.com/questions/49257340
复制相似问题