Hal-hal bisa menjadi sangat berantakan ketika Anda memiliki hierarki tampilan yang rumit, seperti memiliki beberapa pengontrol navigasi dan / atau pengontrol tampilan tab.
Implementasi ini menempatkannya pada pengontrol tampilan individu untuk disetel kapan mereka ingin mengunci orientasi, alih-alih mengandalkan Delegasi Aplikasi untuk menemukannya dengan mengulang melalui subview.
Cepat 3, 4, 5
Di AppDelegate:
var orientationLock = UIInterfaceOrientationMask.all
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
return self.orientationLock
}
Di beberapa kelas struct atau helper global lainnya, di sini saya membuat AppUtility:
struct AppUtility {
static func lockOrientation(_ orientation: UIInterfaceOrientationMask) {
if let delegate = UIApplication.shared.delegate as? AppDelegate {
delegate.orientationLock = orientation
}
}
static func lockOrientation(_ orientation: UIInterfaceOrientationMask, andRotateTo rotateOrientation:UIInterfaceOrientation) {
self.lockOrientation(orientation)
UIDevice.current.setValue(rotateOrientation.rawValue, forKey: "orientation")
UINavigationController.attemptRotationToDeviceOrientation()
}
}
Kemudian di ViewController yang diinginkan, Anda ingin mengunci orientasi:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
AppUtility.lockOrientation(.portrait)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
AppUtility.lockOrientation(.all)
}
Jika iPad atau Aplikasi Universal
Pastikan bahwa "Membutuhkan layar penuh" dicentang di Pengaturan Target -> Umum -> Info Penerapan. supportedInterfaceOrientationsFor
delegasi tidak akan dipanggil jika tidak dicentang.