设备旋转后如何固定错误的框架?

时间:2019-08-09 14:48:18

标签: swift uiview swift4 device-orientation

我在应用程序中使用自定义警报视图。调用时,其框架完全填满屏幕。但是,旋转设备后,它看起来不正确。

look right look wrong

然后,我尝试更改警告框,并在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
    }

因此,我的警报框架发生了变化。但是它的尺寸仍小于屏幕高度,从而形成一个空白区域。

enter image description here

为什么会这样?我该如何解决呢? (我使用Swift4)

2 个答案:

答案 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()

对我来说就像一个魅力。