如何使动画视图与所有设备上的屏幕底部保持一致的距离?

How can I make an animated view be a consistent distance from the bottom of the screen on all devices?

我正在开发一项功能,该功能将使 UIView 从屏幕底部向上移动,以告诉用户他们的数据已保存。但是,它在 iPhone 11 Pro Max 和 iPhone X 上出现的位置不同。

iPhone 11 Pro Max(这是我想要的样子):

但是在 iPhone X:

我可能应该注意到,我在故事板上创建了视图,并有一个 @IBOutlet 连接到它。在故事板上,它位于您在顶部屏幕截图中看到的位置。我没有对它施加任何限制。剩下的在代码中完成。

动画代码非常简单:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    savedView.center.y += view.bounds.height // start with it off the screen 
    savedView.center.x = (view.bounds.width / 2)

}

override func viewDidAppear(_ animated: Bool) {
    super.viewWillAppear(true)

    // animate it onto the screen
    UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.6, initialSpringVelocity: 0.0, options: [], animations: {
        self.savedView.center.y -= self.view.bounds.height <-- the problem must be here

    }, completion: nil)

}

我认为这可能是由于设备尺寸不同 类 但所有 iPhone 都是 'regular' 高度,所以我认为不是这样。

如何让这个视图在所有设备上都位于相同的位置(相对于屏幕底部)?

为了在所有设备上将您的视图放在同一个地方,必须设置约束。这样,系统才能正确显示您的观点。

因此,要为您的视图实现底部居中的附加行为,您需要为 安全区域底部 设置一个约束,一个名为 的约束centered-horizo​​ntallywidthheight,假设此视图是屏幕上的唯一组件。如果不是,则组件位于其顶部的视图必须有一个 top 约束

希望这对你有帮助,至少能给你一个想法。

Constraints reference

我想通了。

问题是视图的初始 center.y 位置从 814 开始,基于它在故事板中的位置 。所以它在故事板上看起来不错,我将其视为 iPhone 11 Pro,但是当 运行 在具有不同尺寸的其他设备模拟器上时,数学不再有效。

解决方案是根据 view.bounds.height 设置 center.y 位置,使其在任何设备上都有一致的起始位置:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    savedView.center.y = (view.bounds.height - 60) // position the view 60 pixels bottom
    savedView.center.x = (view.bounds.width / 2) // center it horizontally
    savedView.center.y += view.bounds.height // move it outside the visible bounds

}