我在应用程序中使用自定义警报视图。调用时,其框架完全填满屏幕。但是,旋转设备后,它看起来不正确。
然后,我尝试更改警告框,并在viewWillTransition
中为它分配新的屏幕尺寸
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
coordinator.animate(alongsideTransition: nil) { _ in UIView.setAnimationsEnabled(true) }
UIView.setAnimationsEnabled(false)
super.viewWillTransition(to: size, with: coordinator)
if let _ = alert {
alert?.rotateAlert(to: size)
Logger.Log("after size = \(alert?.backgroundView.frame.size)")
Logger.Log("after frame = \(alert?.frame)")
Logger.Log("after bounds = \(alert?.bounds)")
}
我尝试在viewDidLayoutSubviews
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
if let _ = alert {
Logger.Log("viewDidLayoutSubviews before rotation")
alert?.rotateAlert(to: self.view.frame.size)
Logger.Log("after size = \(alert?.backgroundView.frame.size)")
Logger.Log("after frame = \(alert?.frame)")
Logger.Log("after bounds = \(alert?.bounds)")
}
}
func rotateAlert(to size: CGSize) {
self.frame.size = size
backgroundView.frame = frame
}
因此,我的警报框架发生了变化。但是它的尺寸仍小于屏幕高度,从而形成一个空白区域。
为什么会这样?我该如何解决呢? (我使用Swift4)
答案 0 :(得分:0)
要将alert
放置在屏幕中央,并假设它是UIView
的实例,请执行以下操作:
alert.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
alert.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
// Or
NSLayoutConstraint.activate([
alert.centerXAnchor.constraint(equalTo: view.centerXAnchor),
alert.centerYAnchor.constraint(equalTo: view.centerYAnchor),
])
这是使用自动布局来放置视图的位置,并且当特征集更改时,视图将正确更新。
答案 1 :(得分:0)
以编程方式添加视图时,该视图不会根据屏幕旋转进行调整,因为您已经固定了视图的高度,宽度,因此旋转后需要再次提供其框架。
当您使用约束以编程方式或从情节提要中添加视图时,不会发生这种情况
要调整警报大小,您必须再次在1
中给出其框架
viewDidLayoutSubviews()
对我来说就像一个魅力。