⚠️Device Orientation! = Định hướng giao diện⚠️
Swift 5. * iOS14 trở xuống
Bạn thực sự nên tạo ra sự khác biệt giữa:
- Hướng thiết bị => Cho biết hướng của thiết bị vật lý
- Hướng giao diện => Cho biết hướng của giao diện hiển thị trên màn hình
Có nhiều trường hợp trong đó 2 giá trị đó không khớp, chẳng hạn như:
- Khi bạn khóa hướng màn hình của mình
- Khi bạn đặt thiết bị của mình phẳng
Trong hầu hết các trường hợp, bạn muốn sử dụng hướng giao diện và bạn có thể lấy nó qua cửa sổ:
private var windowInterfaceOrientation: UIInterfaceOrientation? {
return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation
}
Trong trường hợp bạn cũng muốn hỗ trợ <iOS 13 (chẳng hạn như iOS 12), bạn sẽ làm như sau:
private var windowInterfaceOrientation: UIInterfaceOrientation? {
if #available(iOS 13.0, *) {
return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation
} else {
return UIApplication.shared.statusBarOrientation
}
}
Bây giờ bạn cần xác định nơi phản ứng với sự thay đổi hướng giao diện cửa sổ. Có nhiều cách để làm điều đó nhưng giải pháp tối ưu là thực hiện nó bên trong
willTransition(to newCollection: UITraitCollection
.
Phương thức UIViewController kế thừa này có thể bị ghi đè sẽ được kích hoạt mỗi khi hướng giao diện thay đổi. Do đó, bạn có thể thực hiện tất cả các sửa đổi của mình trong phần sau.
Đây là một ví dụ giải pháp :
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
}
}
Bằng cách triển khai phương pháp này, bạn sẽ có thể phản ứng với bất kỳ sự thay đổi hướng nào đối với giao diện của mình. Nhưng hãy nhớ rằng nó sẽ không được kích hoạt khi mở ứng dụng, vì vậy bạn cũng sẽ phải cập nhật giao diện của mình theo cách thủ công viewWillAppear()
.
Tôi đã tạo một dự án mẫu nhấn mạnh sự khác biệt giữa hướng thiết bị và hướng giao diện. Ngoài ra, nó sẽ giúp bạn hiểu các hành vi khác nhau tùy thuộc vào bước vòng đời nào bạn quyết định cập nhật giao diện người dùng của mình.
Hãy sao chép và chạy kho lưu trữ sau:
https://github.com/wjosset/ReactToOrientation