iOS技术资料iOS高阶UI相关iOS学习笔记

关于UIPresentationController转场动画的坑

2016-04-06  本文已影响1323人  LeafRead

  动手写的第一篇文章就是为了告诫大家,在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,需要的读者,可以留言......

小结

上一篇下一篇

猜你喜欢

热点阅读