如何使动画视图与所有设备上的屏幕底部保持一致的距离?
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-horizontally、width 和 height,假设此视图是屏幕上的唯一组件。如果不是,则组件位于其顶部的视图必须有一个 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
}
我正在开发一项功能,该功能将使 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-horizontally、width 和 height,假设此视图是屏幕上的唯一组件。如果不是,则组件位于其顶部的视图必须有一个 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
}