⚠️Device Orientation! = Interface Orientation⚠️
Swift 5. * iOS14 และต่ำกว่า
คุณควรสร้างความแตกต่างระหว่าง:
- Device Orientation => ระบุการวางแนวของอุปกรณ์จริง
- Interface Orientation => ระบุการวางแนวของอินเทอร์เฟซที่แสดงบนหน้าจอ
มีหลายสถานการณ์ที่ทั้ง 2 ค่าไม่ตรงกันเช่น:
- เมื่อคุณล็อกการวางแนวหน้าจอ
- เมื่อคุณมีอุปกรณ์ของคุณแบน
ในกรณีส่วนใหญ่คุณต้องการใช้การวางแนวอินเทอร์เฟซและคุณสามารถรับได้ทางหน้าต่าง:
private var windowInterfaceOrientation: UIInterfaceOrientation? {
return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation
}
ในกรณีที่คุณต้องการรองรับ <iOS 13 (เช่น iOS 12) คุณต้องดำเนินการดังต่อไปนี้:
private var windowInterfaceOrientation: UIInterfaceOrientation? {
if #available(iOS 13.0, *) {
return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation
} else {
return UIApplication.shared.statusBarOrientation
}
}
ตอนนี้คุณต้องกำหนดตำแหน่งที่จะตอบสนองต่อการเปลี่ยนแปลงการวางแนวของหน้าต่าง มีหลายวิธีที่จะทำ
willTransition(to newCollection: UITraitCollection
แต่จะมีทางออกที่ดีที่สุดคือการทำมันภายใน
วิธีการ UIViewController ที่สืบทอดมานี้ซึ่งสามารถแทนที่ได้จะถูกทริกเกอร์ทุกครั้งที่การวางแนวของอินเทอร์เฟซจะเปลี่ยนไป ดังนั้นคุณสามารถทำการปรับเปลี่ยนทั้งหมดได้ในภายหลัง
นี่คือตัวอย่างการแก้ปัญหา :
class ViewController: UIViewController {
override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
super.willTransition(to: newCollection, with: coordinator)
coordinator.animate(alongsideTransition: { (context) in
guard let windowInterfaceOrientation = self.windowInterfaceOrientation else { return }
if windowInterfaceOrientation.isLandscape {
} else {
}
})
}
private var windowInterfaceOrientation: UIInterfaceOrientation? {
return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation
}
}
เมื่อใช้วิธีนี้คุณจะสามารถตอบสนองต่อการเปลี่ยนแปลงการวางแนวในอินเทอร์เฟซของคุณได้ แต่เก็บไว้ในใจว่ามันจะไม่ถูกเรียกที่เปิดของ app viewWillAppear()
เพื่อให้คุณยังจะมีการปรับปรุงอินเตอร์เฟซของคุณด้วยตนเองใน
ฉันได้สร้างโครงการตัวอย่างที่เน้นความแตกต่างระหว่างการวางแนวอุปกรณ์และการวางแนวอินเทอร์เฟซ นอกจากนี้ยังช่วยให้คุณเข้าใจพฤติกรรมที่แตกต่างกันขึ้นอยู่กับขั้นตอนวงจรชีวิตที่คุณตัดสินใจอัปเดต UI ของคุณ
อย่าลังเลที่จะโคลนและเรียกใช้ที่เก็บต่อไปนี้:
https://github.com/wjosset/ReactToOrientation