Mọi thứ có thể trở nên khá lộn xộn khi bạn có một hệ thống phân cấp chế độ xem phức tạp, chẳng hạn như có nhiều bộ điều khiển điều hướng và / hoặc bộ điều khiển chế độ xem tab.
Việc triển khai này đặt nó trên các bộ điều khiển chế độ xem riêng lẻ để đặt thời điểm họ muốn khóa các hướng, thay vì dựa vào App Delegate để tìm chúng bằng cách lặp lại các lần xem phụ.
Swift 3, 4, 5
Trong AppDelegate:
/// set orientations you want to be allowed in this property by default
var orientationLock = UIInterfaceOrientationMask.all
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
return self.orientationLock
}
Trong một số cấu trúc chung hoặc lớp trợ giúp khác, ở đây tôi đã tạo AppUtility:
struct AppUtility {
static func lockOrientation(_ orientation: UIInterfaceOrientationMask) {
if let delegate = UIApplication.shared.delegate as? AppDelegate {
delegate.orientationLock = orientation
}
}
/// OPTIONAL Added method to adjust lock and rotate to the desired orientation
static func lockOrientation(_ orientation: UIInterfaceOrientationMask, andRotateTo rotateOrientation:UIInterfaceOrientation) {
self.lockOrientation(orientation)
UIDevice.current.setValue(rotateOrientation.rawValue, forKey: "orientation")
UINavigationController.attemptRotationToDeviceOrientation()
}
}
Sau đó, trong ViewController mong muốn, bạn muốn khóa các hướng:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
AppUtility.lockOrientation(.portrait)
// Or to rotate and lock
// AppUtility.lockOrientation(.portrait, andRotateTo: .portrait)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
// Don't forget to reset when view is being removed
AppUtility.lockOrientation(.all)
}
Nếu iPad hoặc Ứng dụng toàn cầu
Đảm bảo rằng "Yêu cầu toàn màn hình" được chọn trong Cài đặt mục tiêu -> Chung -> Thông tin triển khai. supportedInterfaceOrientationsFor
đại biểu sẽ không được gọi nếu điều đó không được chọn.