2016-01-19 16 views
7

Ho un controller della vista che assomiglia:telaio corretto quando un'istanza 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) 
    } 
} 

Quando istanziata controller della vista tramite let spotViewController = SpotViewController(spot: spot) e spingerlo sul controller di navigazione il frame risultante è corretto in entrambi viewDidLoad e viewWillAppear. Mi dà (0.0, 0.0, 600.0, 600.0) che è la dimensione nel generatore di interfaccia.

Perché sta succedendo questo e qual è il modo corretto di istanziare un controller di visualizzazione w/a xib per garantire che il frame sia corretto?

+0

Come stai mostrando il controller (vista)? – Wain

+0

@Wain Lo sto semplicemente spingendo sullo stack 'navigationController' con' navigationController! .pushViewController (spotViewController, animato: true) ' –

+0

Qual è il frame in viewDidLayoutSubviews()? –

risposta

0

Ciò risolverà il problema, UIViewController caricati da XI ter, mantenere le dimensioni xib durante 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() 
     } 
    } 
} 
Problemi correlati