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,600.0) }}
当我通过让spotVIEwController = SpotVIEwController(spot:spot)实例化视图控制器并将其推送到导航控制器时,结果框架在vIEwDIDLoad和vIEwWillAppear中都是不正确的.它给了我(0.0,600.0)这是界面构建器中的大小.
为什么会发生这种情况以及使用xib实例化视图控制器以确保帧正确的正确方法是什么?
解决方法 这将解决您的问题,UIVIEwController从xib加载,在vIEwDIDLoad期间保持xib大小: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() } }}总结
以上是内存溢出为你收集整理的ios – 实例化ViewController w / xib时的帧大小不正确全部内容,希望文章能够帮你解决ios – 实例化ViewController w / xib时的帧大小不正确所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)