swift 如何获取屏幕方向改变后的高度?

6qqygrtg  于 12个月前  发布在  Swift
关注(0)|答案(4)|浏览(112)

在方向改变后查询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是监控方向变化的正确方法吗?

zyfwsgd6

zyfwsgd61#

你应该使用的是viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)。这将给予你的大小,比使用通知更可靠。
此外,如果您想制作动画,可以在UIViewControllerTransitionCoordinator中利用方法animate(alongsideTransition animation: ((UIViewControllerTransitionCoordinatorContext) -> Swift.Void)?, completion: ((UIViewControllerTransitionCoordinatorContext) -> Swift.Void)? = nil) -> Bool

ars1skjm

ars1skjm2#

您需要用途:

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

字符串
//在dispatch_declare c下编写代码所需的全部内容
此代码将在循环完成(在主队列中)并且新大小可用后执行。

qvsjd97n

qvsjd97n3#

这在Swift 2.3中适用于iPad和iPhone。

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)
     }

}

字符串

1bqhqjot

1bqhqjot4#

您可以使用延迟,您将收到重新计算的高度

DispatchQueue.main.asyncAfter(deadline: .now() + 0.7, execute: {
        // your code hear
})

字符串

相关问题