2017-09-19 16 views
38

Tôi bắt đầu điều chỉnh ứng dụng của mình cho iPhone X và tìm thấy sự cố trong Trình tạo giao diện. Hướng dẫn bố cục an toàn khu vực được cho là tương thích ngược, theo video chính thức của Apple. Tôi thấy rằng nó hoạt động tốt trong bảng phân cảnh.Hướng dẫn bố cục khu vực an toàn trong các tệp xib - iOS 10

Nhưng trong các tập tin XIB của tôi, hướng dẫn bố trí khu vực an toàn không được tôn trọng trong iOS 10

Họ làm việc tốt cho các phiên bản hệ điều hành mới, nhưng các thiết bị iOS 10 dường như chỉ đơn giản cho rằng khoảng cách khu vực an toàn như bằng không (bỏ qua kích thước thanh trạng thái).

Tôi có thiếu bất kỳ cấu hình bắt buộc nào không? Đây có phải là lỗi Xcode hay không và nếu có, có cách giải quyết nào không?

Đây là một ảnh chụp màn hình về vấn đề này trong một dự án thử nghiệm (trái iOS 10, phải iOS 11):

safe area alignment on top of the screen

Trả lời

41

Có một số vấn đề với bố trí khu vực an toàn và khả năng tương thích ngược. Xem nhận xét của tôi qua here.

Bạn có thể giải quyết các vấn đề với các ràng buộc bổ sung như mức độ ưu tiên 1000> = 20,0 thành superview.top và mức ưu tiên 750 == safearea.top. Nếu bạn luôn hiển thị thanh trạng thái, điều đó sẽ khắc phục mọi thứ.

Một cách tiếp cận tốt hơn có thể là có bảng phân cảnh/xib riêng biệt cho pre-iOS 11 và iOS-11 trở lên, đặc biệt nếu bạn gặp phải nhiều vấn đề hơn vấn đề này. Lý do đó là thích hợp hơn là bởi vì pre-iOS 11 bạn nên bố trí ràng buộc để hướng dẫn bố trí trên/dưới, nhưng đối với iOS 11 bạn nên đặt chúng ra cho các khu vực an toàn. Hướng dẫn bố cục đã biến mất. Việc bố trí các hướng dẫn bố cục cho pre-iOS 11 có phong cách tốt hơn so với chỉ bù trừ tối thiểu 20 pixel, mặc dù kết quả sẽ là cùng IFF bạn luôn hiển thị thanh trạng thái.

Nếu bạn thực hiện cách tiếp cận này, bạn sẽ cần đặt từng tệp cho mục tiêu triển khai chính xác mà nó sẽ được sử dụng trên (iOS 11 hoặc trước đó) để Xcode không cung cấp cho bạn cảnh báo và cho phép bạn sử dụng hướng dẫn bố trí hoặc khu vực an toàn, tùy thuộc. Trong mã của bạn, hãy kiểm tra iOS 11 khi chạy và sau đó tải bảng phân cảnh/xibs thích hợp. Mặt khác của phương pháp này là bảo trì, (bạn sẽ có hai bộ điều khiển chế độ xem để duy trì và đồng bộ hóa), nhưng một khi ứng dụng của bạn chỉ hỗ trợ iOS 11+ hoặc Apple khắc phục thế hệ ràng buộc hướng dẫn bố cục tương thích ngược , bạn có thể loại bỏ các phiên bản trước 11 iOS.

Nhân tiện, bạn hiển thị bộ điều khiển mà bạn đang nhìn thấy bằng cách nào? Nó chỉ là bộ điều khiển xem gốc hay bạn trình bày nó, hay ..? Vấn đề tôi nhận thấy có liên quan đến việc đẩy bộ điều khiển xem, vì vậy bạn có thể gặp phải một trường hợp khác.

+0

Vấn đề cụ thể của tôi chỉ có trên các tệp XIB và dường như xảy ra cho cả bộ điều khiển được đẩy và trình bày. Cách giải quyết của bạn với nhiều ràng buộc giống như một bản sửa lỗi tốt cho hầu hết các tình huống. Cảm ơn! Tôi vẫn hy vọng họ sẽ giải quyết những vấn đề này trước khi iPhoneX đến. –

+0

Rất cảm ơn đề xuất ưu tiên! Bây giờ hoạt động như một nét duyên dáng trên iOS 9 và iOS 11 dưới iPhone X. –

+0

Tôi có thể nhận xét hỏi về điều này "Nếu bạn luôn hiển thị thanh trạng thái, điều đó sẽ khắc phục mọi thứ".? Tôi không thể thấy cách hiển thị thanh trạng thái trên trình mô phỏng iPhone X ở chế độ ngang. Sau đó, giải pháp được mô tả của "1000 priority> = 20.0 cho superview.top và 750 priority == safearea.top" sẽ có khoảng cách 20px trên đầu cho iPhone X trong cảnh quan. Giải pháp của tôi là để loại bỏ các ràng buộc của "1000 ưu tiên> = 20.0" trong viewDidLoad nếu iOS <11. Tôi có thiếu cách để buộc thanh trạng thái trong cảnh quan của iPhone X không? –

-3

Tìm thấy giải pháp đơn giản nhất - chỉ cần vô hiệu hóa safe area và sử dụng topLayoutGuidebottomLayoutGuide + thêm các bản sửa lỗi cho iPhone X. Có lẽ nó không phải là giải pháp tuyệt đẹp nhưng đòi hỏi sự nỗ lực ít càng tốt

0

tôi đã kết thúc xóa các hạn chế đối với khu vực an toàn mà tôi đã có trong tập tin xib của tôi. Thay vào đó, tôi đã tạo một lối thoát cho UIView được đề cập và từ mã tôi đã nối nó lên như thế này, trong viewDidLayoutSubviews.

let constraint = alert.viewContents.topAnchor.constraint(equalTo: self.topLayoutGuide.bottomAnchor, constant: 0) 
constraint.priority = 998 
constraint.isActive = true 

này gắn một "cảnh báo" nhỏ để trên màn hình nhưng đảm bảo rằng các nội dung xem trong thông báo phải lúc nào cũng bên dưới khu vực đầu an toàn (iOS11ish)/topLayoutGuide (iOS10ish)

đơn giản và một giải pháp một lần. Nếu có chuyện gì đó xảy ra, tôi sẽ quay lại.

1

Hiện tại, tính tương thích ngược không hoạt động tốt.

Giải pháp của tôi là tạo ra 2 khó khăn trong xây dựng giao diện và loại bỏ một tùy theo phiên bản ios bạn đang sử dụng:

  • cho ios 11: view.top == safe area.top
  • cho các phiên bản trước đó: view.top == superview.top + 20

Thêm cả hai cửa hàng dưới dạng myConstraintmyConstraintIOS10 tương ứng. Sau đó:

override func viewDidLoad() { 
    if #available(iOS 11.0, *) { 
     view.removeConstraint(myConstraintIOS10) 
    } else { 
     view.removeConstraint(myConstraint) 
    } 
} 
Các vấn đề liên quan