2016-01-19 9 views
7

ich einen View-Controller haben, die wie folgt aussieht:falsche Rahmengröße, wenn Viewcontroller Instanziieren 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) 
    } 
} 

Wenn ich die View-Controller über let spotViewController = SpotViewController(spot: spot) instanziiert und auf die Navigationssteuerung drücken ist der resultierende Rahmen falsch in beide viewDidLoad und viewWillAppear. Es gibt mir (0.0, 0.0, 600.0, 600.0), die die Größe in der Schnittstelle Builder ist.

Warum passiert das und was ist der richtige Weg, um einen View-Controller mit einem xib zu instanziieren, um sicherzustellen, dass der Frame korrekt ist?

+0

Wie zeigen Sie den Controller (Ansicht)? – Wain

+0

@Wain Ich schiebe es einfach auf den 'navigationController' Stack mit' navigationController! .pushViewController (spotViewController, animiert: true) ' –

+0

Was ist der Frame in viewDidLayoutSubviews()? –

Antwort

0

Dies wird Ihr Problem beheben, UIViewController aus xib geladen, halten xib Größe während 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() 
     } 
    } 
}