方向改变后如何获得屏幕高度?

时间:2017-10-09 14:46:01

标签: ios swift notificationcenter

在方向更改后查询UIScreen.main.bounds.height时,我得到了一些奇怪的结果。也许这不是正确的做法。

我有一个观察者,负责监听NSNotification.Name.UIDeviceOrientationDidChange事件:

NotificationCenter.default.addObserver(self, selector: #selector(self.orientationChange), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil)

这会调用一个将约束设置为新屏幕高度的75%的函数。这适用于iPhone,但iPad返回错误的屏幕高度。

如果iPad处于横向方向,UIScreen.main.bounds.height将返回一个等于纵向方向高度的值,反之亦然。

func orientationChange() {
    // This will print the correct value on iPhone and iPad.
    if UIDevice.current.orientation.isLandscape {
        print("Landscape")
    } else {
        print("Portrait")
    }

    let screenSize = UIScreen.main.bounds
    let screenHeight = screenSize.height
    self.searchViewHeightConstraint.constant = screenHeight * 0.75

    // Correct value on iPhone. Incorrect on iPad.
    print("screenHeight: '\(screenHeight)'") 

    UIView.animate(withDuration: 0.6, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 0, options: .curveEaseOut, animations: {
        self.searchView.superview?.layoutIfNeeded()
    }, completion: nil)
}

我也遇到了监控方向变化的viewWilltransition方法,但这与上述方法完全相反。即。 iPad上的高度是正确的但在iPhone上不正确:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    let screenSize = UIScreen.main.bounds
    let screenHeight = screenSize.height
    self.searchViewHeightConstraint.constant = screenHeight * 0.75

    // Correct value on iPad. Incorrect on iPhone.
    print("screenHeight: '\(screenHeight)'") 
}

iPhone和iPad之间出现这种不一致行为的原因是什么,并使用NotificationCenter正确的方法来监控方向变化?

3 个答案:

答案 0 :(得分:3)

你应该使用的是什么 animate(alongsideTransition animation: ((UIViewControllerTransitionCoordinatorContext) -> Swift.Void)?, completion: ((UIViewControllerTransitionCoordinatorContext) -> Swift.Void)? = nil) -> Bool。这将为您提供尺寸,并且比使用通知更可靠。

另外,如果你想做动画,在UIViewControllerTransitionCoordinator内你可以利用方法public void concurrentMethod(Object data) { int numberOfThreadsExecutingThisMethodSimulataneously = //...? System.out.println(numberOfThreadsExecutingThisMethodSimulataneously); //method body... }

答案 1 :(得分:1)

您需要使用:

dispatch_async(dispatch_get_main_queue()) { 
println("h:\(view.bounds.size.height)")
println("w:\(view.frame.size.width)")
         }

//您只需要在dispatch_async下编写代码

此代码将在轮换完成之后(在主队列中)执行,并且新的大小可用。

答案 2 :(得分:0)

这适用于适用于iPad和iPhone的Swift 2.3。

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    print(size.height)

  if UIDevice.currentDevice().orientation.isLandscape {
     print("Landscape")
     print(size.height)

  } 
 else {
      print("Portrait")
      print(size.height)
     }

}