2015-02-19 15 views
5

Tôi đang cố gắng tìm cách giải quyết cho trường hợp này:
Tôi có một bộ điều khiển UITabBarController được kết nối với bộ điều khiển xem bộ chứa (BannerViewController) mà tôi đang sử dụng để nhúng một UINavigationController, bộ điều khiển điều hướng đẩy bộ điều khiển xem container khác (EventListContainerviewController) mỗi điều này có chứa một bộ điều khiển tableview.
Đây là màn hình từ bảng câu chuyện của tôi enter image description here
Vấn đề là chế độ xem vùng chứa cuối cùng được hiển thị trong khung nhỏ hơn so với vùng chứa của chúng. Có vẻ như chúng làm mất không gian tabbar ở phía dưới. enter image description here
Tôi đã buộc tất cả bộ điều khiển chế độ xem, bộ điều khiển điều hướng và bộ điều khiển thanh tab để tránh không làm lệch các mép của chúng và điều chỉnh các inset.UINavigationController được nhúng trong chế độ xem vùng chứa, hiển thị Trình điều khiển Chế độ xem Bảng có kích thước sai

Màu nghĩa:

đỏ: giao diện chính của 0x7fcc6d38bb00
màu xanh nhạt BannerContainerViewController: quan điểm container của BannerContainerViewController 0x7fcc6d38b860

Blue: giao diện chính của EventListContainerViewController 0x7fcc6bd7b7c0
Orange : chế độ xem vùng chứa của EventListContainerViewController 0x7fcc6bd7b690

Dường như có điều gì đó thay đổi khi bộ điều hướng thêm khung nhìn vùng chứa màu xanh làm giảm kích thước của nó bằng cùng một lượng tabbar (49pt). Nó cũng có thể được nhìn thấy trong các mô tả đệ quy của hệ thống phân cấp xem:

<UIWindow: 0x7fcc6bd5af40; frame = (0 0; 320 568); gestureRecognizers = <NSArray: 0x7fcc6bd4dd80>; layer = <UIWindowLayer: 0x7fcc6bd317c0>> 
    | <UILayoutContainerView: 0x7fcc6bd671c0; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x7fcc6bd66de0>> 
    | | <UITransitionView: 0x7fcc6bd6a980; frame = (0 0; 320 568); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x7fcc6bd6ace0>> 
    | | | <UIViewControllerWrapperView: 0x7fcc6d3a7b20; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x7fcc6d3a7db0>> 
    | | | | <UIView: 0x7fcc6d38bb00; frame = (0 0; 320 519); autoresize = W+H; layer = <CALayer: 0x7fcc6d38bbd0>> 
    | | | | | <UIView: 0x7fcc6d38b860; frame = (0 0; 320 519); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x7fcc6d38b930>> 
    | | | | | | <UILayoutContainerView: 0x7fcc6d398000; frame = (0 0; 320 519); autoresize = W+H; gestureRecognizers = <NSArray: 0x7fcc6d3a4b50>; layer = <CALayer: 0x7fcc6d387670>> 
    | | | | | | | <UINavigationTransitionView: 0x7fcc6d39cfa0; frame = (0 0; 320 519); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x7fcc6d39cc40>> 
    | | | | | | | | <UIViewControllerWrapperView: 0x7fcc6bf31230; frame = (0 0; 320 519); autoresize = W+H; layer = <CALayer: 0x7fcc6bf31300>> 
    | | | | | | | | | <UIView: 0x7fcc6bd7b7c0; frame = (0 64; 320 406); autoresize = W+H; layer = <CALayer: 0x7fcc6bd7afe0>> 
    | | | | | | | | | | <UIView: 0x7fcc6bd7b690; frame = (0 0; 320 406); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x7fcc6bd7aac0>> 
    | | | | | | | | | | | <UITableView: 0x7fcc6f03c400; frame = (0 0; 320 406); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x7fcc6bf34aa0>; layer = <CALayer: 0x7fcc6bf30bc0>; contentOffset: {0, 0}; contentSize: {320, 170}> 
    | | | | | | | | | | | | <UITableViewWrapperView: 0x7fcc6bf35960; frame = (0 0; 320 406); gestureRecognizers = <NSArray: 0x7fcc6bf363e0>; layer = <CALayer: 0x7fcc6bf35ed0>; contentOffset: {0, 0}; contentSize: {320, 406}> 
    | | | | | | | | | | | | | <EventCell: 0x7fcc6bca2950; baseClass = UITableViewCell; frame = (0 85; 320 85); autoresize = W; layer = <CALayer: 0x7fcc6bca2ca0>> 

Tôi đã cố gắng để sử dụng tùy chỉnh Segue thay vì xem thùng chứa cố gắng để buộc bố trí, nhưng tôi đoán là một lỗi điều khiển chuyển hướng.
Như bạn có thể thấy biểu ngữ không chồng chéo chế độ xem như dự định.
enter image description here

Bất kỳ đề xuất nào?

+0

Bạn đã kiểm tra xem bộ điều khiển chế độ xem của mình đã chọn 'Mở rộng các cạnh được UnderBottomBars' chưa? – las

+0

chắc chắn như tôi đã viết trong câu hỏi – Andrea

+0

ops ... tất cả đều có Extended Edges không được kiểm tra – Andrea

Trả lời

3

Hóa ra đó là một lỗi UIKit, tôi đã đệ đơn radar 19996374. Dưới đây là lời giải thích:

Khi một bộ điều khiển chuyển hướng được đặt bên trong một bộ điều khiển thanh tab, trách nhiệm đặt ra bộ điều khiển xem nội dung (của bạn) là được cấp đầy đủ cho bộ điều khiển điều hướng. Bộ điều khiển thanh tab kích thước chế độ xem của bộ điều hướng để khớp với thanh tab giới hạn chế độ xem của bộ điều khiển. Đổi lại, tài khoản điều khiển điều hướng cho chiều cao thanh tab khi đặt bộ điều khiển chế độ xem nội dung. Mọi thứ xảy ra khi bạn bơm bộ điều khiển xem giữa thanh tab bộ điều khiển và bộ điều khiển điều hướng. Bộ điều khiển thanh tab thấy rằng selectedViewController không phải là UINavigationController và áp dụng các quy tắc bố cục thông thường.Nhưng có điều khiển điều hướng thấy rằng thuộc tính tabBarController của nó chứa một trường hợp hợp lệ UITabBarController và giả định rằng nó vẫn chịu trách nhiệm để xử lý chiều cao thanh tab khi đặt ra bộ điều khiển xem (của bạn) . Kết quả là bộ điều khiển xem nội dung được inset bởi chiều cao thanh tab gấp đôi, như bạn đã quan sát

Là một workaround

Bạn có thể làm việc xung quanh vấn đề này bằng cách thiết lập thuộc tính isTranslucent của thanh tab đến YES. Sau đó, trong AFBannerViewController, ghi đè -edgesForExtendedLayout để trả về UIRectEdgeAll. Bây giờ AFBannerViewController sẽ gạch dưới thanh tab (vì vậy hãy đặt màu nền thành màu gì đó không phải màu hồng) nhưng bộ điều hướng sẽ áp dụng phần chèn vào thích hợp cho bộ điều khiển chế độ xem nội dung.

+1

Cho đến ngày nay, lỗi này vẫn tồn tại (thử nghiệm với iOS 9, Xcode 7.3 và Swift 2) . Màu nền mờ + mờ trên chế độ xem của thanh Tab + cạnhĐược mở rộngThay đổi thành .Tất cả mọi thứ sẽ hoạt động trở lại. Cảm ơn bạn. –

+0

Thật không may lỗi của tôi là cho đến khi "yêu cầu thông tin thêm" ngay cả khi tôi đã gửi một dự án nhỏ cho thấy vấn đề. – Andrea

5

Vấn đề này vẫn tồn tại trong iOS 10. Một UINavigationController được nhúng trong khung nhìn vùng chứa, được chứa trong UITabBarController, sẽ bố trí tất cả các khung nhìn trong ngăn điều hướng có thêm không gian cho thanh tab "ma" ở phía dưới.

Giải pháp dễ nhất là phân lớp UINavigationController và trả về 'nil' từ tabBarController.

class MyNavigationController: UINavigationController { 

    override var tabBarController: UITabBarController? { 
     return nil 
    } 

} 

Điều này làm cho chế độ xem trong ngăn điều hướng nghĩ rằng chúng không có bộ điều khiển thanh tab, vì vậy chúng sẽ không có thêm khoảng trống cho bố cục trong khi bố cục. Tôi đã không nhận thấy bất kỳ tác dụng phụ tiêu cực từ sửa chữa này, nhưng rõ ràng là các quan điểm trong ngăn xếp của bộ điều khiển chuyển hướng này sẽ không còn có quyền truy cập vào bộ điều khiển thanh tab. Nếu đó là một vấn đề, bạn có thể sử dụng một phương pháp chung chung hơn để tìm bộ điều khiển thanh tab (hoặc bất kỳ bộ điều khiển xem "cha mẹ").

Ví dụ: nếu bộ điều khiển chế độ xem chính cho ứng dụng của bạn là UITabBarController có tên "MainViewController", bạn có thể mở rộng UIViewController bằng phương pháp tiện lợi để tìm nó.

extension UIViewController { 

    func mainViewController() -> MainViewController? { 
     var vc: UIViewController? = self 
     while !(vc is MainViewController) && vc != nil { 
      vc = vc?.parent ?? vc?.navigationController ?? vc?.presentingViewController 
     } 
     return vc as? MainViewController 
    } 

} 

Điều này hoạt động vì bộ điều khiển thanh tab là parent của bộ điều khiển chế độ xem con trực tiếp. Phương thức trên làm việc theo cách của nó lên chuỗi các bộ điều khiển cha, trình bày và điều hướng để cuối cùng đạt được một con của bộ điều khiển thanh tab, nó trả về bộ điều khiển thanh tab làm cha của nó.

+0

Đây là một cách tiếp cận thú vị, nhưng tôi rất thất vọng rằng Apple dường như không có bất kỳ quan tâm nào trong việc sửa chữa nó. Tôi đề nghị bạn để tập tin lỗi. – Andrea

+0

Vâng, vài giờ sau đó tôi đã quyết định tìm kiếm tràn ngăn xếp và bạn đã giải quyết nó trong một phút. Tôi ước tôi có thể cung cấp cho bạn tất cả các phiếu bầu. –

Các vấn đề liên quan