2017-10-09 91 views
0

在定位更改後查詢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正確的方法來監測方向變化?

+0

您是否將'screenHeight'值變大或變小? – Srdjan

+0

停止使用screensize = UIScreen.main.bounds並改爲使用大小,它會在方法中提供給您。你可以做size.height * 0.75 –

+0

另外,如果你正在使用約束條件,並且你的searchView等於你的視圖的高度,那麼在同一個heighViewConstraint上,你可以將修飾符設置爲0.75,如果它總是會達到那個尺寸。然後,你將得到的旋轉視圖將更新自己,你根本不必做任何邏輯。 –

回答

1

你應該使用的是 viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)。這會給你的大小,並且比使用通知更可靠。

另外,如果你想要做的動畫,在UIViewControllerTransitionCoordinator裏面,你可以利用該方法animate(alongsideTransition animation: ((UIViewControllerTransitionCoordinatorContext) -> Swift.Void)?, completion: ((UIViewControllerTransitionCoordinatorContext) -> Swift.Void)? = nil) -> Bool

+0

我已經試過這個,它的行爲與我的問題中的代碼完全相反。即。它會報告iPad上的正確尺寸,但iPhone上的尺寸錯誤。 – Turnip

+0

您是否嘗試過使用動畫(alongsideTransition ...)?我已經使用了這個方法,並且在完成這個方法時,一切似乎都落空了。 –

+0

所以當我創建一個測試項目並打印出iPhone的大小時,我得到:'landscape(736.0,414.0)'和'portrait(414.0,736.0)',然後對於iPad我得到'landscape(1024.0,768.0)'和'肖像(768.0,1024.0)'。這些是iPad Air 2和iPhone 8. –

0

這雨燕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) 
    } 

}