2016-01-19 14 views
7

Tôi có một bộ điều khiển xem trông giống như:kích thước khung hình không chính xác khi instantiating ViewController w/xib

class SpotViewController: UIViewController { 
    let spot: Spot 

    init(spot: Spot) { 
    self.spot = spot 
    super.init(nibName: "SpotViewController", bundle: nil) 
    } 

    override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 

    print("viewWillAppear: \(view.frame)") # => (0.0, 0.0, 600.0, 600.0) 
    } 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    print("viewDidLoad: \(view.frame)") # => (0.0, 0.0, 600.0, 600.0) 
    } 
} 

Khi tôi nhanh chóng điều khiển xem qua let spotViewController = SpotViewController(spot: spot) và đẩy nó vào bộ điều khiển chuyển hướng khung kết quả là không chính xác trong cả hai viewDidLoadviewWillAppear. Nó cho tôi (0.0, 0.0, 600.0, 600.0) là kích thước trong trình tạo giao diện.

Tại sao điều này xảy ra và cách chính xác để tạo nhanh trình điều khiển chế độ xem là gì/xib để đảm bảo rằng khung hình chính xác?

+0

How are you cho thấy bộ điều khiển (xem)? – Wain

+0

@Wain Tôi chỉ đang đẩy nó vào ngăn xếp 'navigationController' w /' navigationController! .pushViewController (spotViewController, animated: true) ' –

+0

Khung trong viewDidLayoutSubviews() là gì? –

Trả lời

0

Điều này sẽ khắc phục sự cố, UIViewController nạp từ xib, giữ kích thước xib trong viewDidLoad:

extension UIViewController { 
    public override class func initialize() { 
     struct Static { 
      static var token: dispatch_once_t = 0 
     } 
     if self !== UIViewController.self { 
      return 
     } 
     dispatch_once(&Static.token) { 
      pb_applyFixToViewFrameWhenLoadingFromNib() 
     } 
    } 

    @objc func pb_setView(view: UIView!) { 
     // View is loaded from xib file 
     if nibBundle != nil && storyboard == nil { 
      view.frame = UIScreen.mainScreen().bounds 
      view.layoutIfNeeded() 
     } 
     pb_setView(view) 
    } 

    private class func pb_applyFixToViewFrameWhenLoadingFromNib() { 
     UIViewController.swizzleMethodSelector(NSSelectorFromString("setView:"), withSelector: #selector(UIViewController.pb_setView(_:))) 
     UICollectionView.swizzleMethodSelector(#selector(UICollectionView.layoutSubviews), withSelector: #selector(UICollectionView.pb_layoutSubviews)) 
     UITableView.swizzleMethodSelector(#selector(UITableView.layoutSubviews), withSelector: #selector(UITableView.pb_layoutSubviews)) 
    } 
} 

extension UITableView { 
    @objc private func pb_layoutSubviews() { 
     if dataSource == nil { 
      super.layoutSubviews() 
     } else { 
      pb_layoutSubviews() 
     } 
    } 
} 

extension UICollectionView { 
    @objc private func pb_layoutSubviews() { 
     if dataSource == nil { 
      super.layoutSubviews() 
     } else { 
      pb_layoutSubviews() 
     } 
    } 
} 
Các vấn đề liên quan