动手写的第一篇文章就是为了告诫大家,在UIPresentationController中的一个巨坑提出来,因为我在遇到这个问题的时候,为了解决这个问题真的是死了好多脑细胞,最后才发现居然是一个重写系统方法出错; 好了,废话不多说,直接上BUG
一 BUG重现
1.下图是程序正常启动,内存大写和模拟器显示页面
弹出控制器视图2.点击导航栏中间自定义按钮去,弹出控制器视图,内存有所上升,暂且我们认为是正常内存增加(这里就是自定义控制器继承UIPresentationController,然后在主控制器内设置转场代理为当前控制器)
// 实现这个代理方法目的:改变弹出View的尺寸
func presentationControllerForPresentedViewController(presented: UIViewController, presentingViewController presenting: UIViewController, sourceViewController source: UIViewController) -> UIPresentationController?
}
//然后在自定义控制器真正去改变view的尺寸
// MARK:- 系统回调函数 (提示:BUG就是这个方法造成的containerViewDidLayoutSubviews)
override func containerViewDidLayoutSubviews() {
super.containerViewDidLayoutSubviews()
//改变弹出页面的frame
presentedView()?.frame = CGRectMake(100, 50, 180, 250)
出现bug//程序中还有个功能,为控制器添加蒙版,并且设置点击手势,手势执行将弹出的view收回的动作; 但图中我点击蒙版之后,view不但没有收回,蒙版也没有移除,反而内存飙升,模拟器视图毫无反应
继续观察//内存继续飙升, 受不了了,果断终止检查程序
二 解决bug
由于经验缺少,碰到这样的问题真的是无从下手,一个一个方法排除,抱着试一试的想法,将这个containerViewDidLayoutSubviews 改为containerViewWillLayoutSubviews;重新运行程序,果然bug没有复现
小结一下本文的目的主要能给读者一些提示,在使用UIPresentationController做modal效果的窗口视图时,一定得注意这些细节,如果和小编一样的bug,那么恭喜你,你可以立马解决这个问题了......
另外:点击弹出按钮弹出小窗口的demo,需要的读者,可以留言......
小结
网友评论
布局子控件应该在View还没有显示(即将显示)的时候布局, 第一个方法布局的晚了