19.原谅我还说iOS7,自定义转场动画与topLayoutGuide在iOS7中的bug
2016-03-08 21:15
381 查看
最近在项目中有需求显示一系列Help界面,用以引导用户操作,经过分析我决定用present一个视图控制器的方式来完成,但是系统的present动画又不能满足要求,那怎么办呢?
那自然是自定义转场动画了,关于自定义转场动画的内容,有不懂的可以自行搜索(百度足矣),顺便说一下,如果presented控制器是半透明效果,需要设置modalPresentationStyle。
下面来说一下问题,为了方便适配各种iPhone,我在这些help视图控制器都使用了AutoLayout。那么问题来了,当我present之后,iOS8及其以上系统都没有问题,唯独在iOS7上所有以topLayoutGuide为基准的控件位置都不对,(话说就这个原因我都查了好久才查出来,心累……)那么到底发生了什么呢,原来iOS7在自定义转场动画后,ViewController的topLayoutGuide就失效了,即获取到的length是0,所以即使该ViewController有状态栏亦或导航栏,topLayoutGuide的length依然是0。所以后面所有依赖topLayoutGuide的控件肯定位置就都悲剧了。这个问题,已经在iOS8上解决了,但是如果依然要适配iOS7应该怎么办呢?stackoverflow上有很多脑洞大开的解决办法,这里我说一个比较靠谱的解决方案,手动设置topLayoutGuide的constraint,下面给出代码:
在自定义转场动画时可以获取到destinationViewController,在这里面进行手动设置,具体代码如下:
- (void)pushTransitionFrom:(UIViewController *)fromVC to:(UIViewController *)toVC withContext:(id<UIViewControllerContextTransitioning>)transitionContext{
AdjustPageController *toViewController = (AdjustPageController*)[transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
if ([[[UIDevice currentDevice] systemVersion]floatValue]<=8.0) {
CGFloat navigationBarHeight = toViewController.navigationController.navigationBar.frame.size.height;
for (NSLayoutConstraint *constraint in toViewController.view.constraints){
if (constraint.firstItem == toViewController.topLayoutGuide&& constraint.firstAttribute == NSLayoutAttributeHeight&&constraint.secondItem == nil&& constraint.constant < navigationBarHeight) {
constraint.constant += navigationBarHeight;
}
}
}
//do your animation
}
以上代码应该很容易看懂,我就不做解释了。虽然iOS7有点out,但是新技能get,very good。
那自然是自定义转场动画了,关于自定义转场动画的内容,有不懂的可以自行搜索(百度足矣),顺便说一下,如果presented控制器是半透明效果,需要设置modalPresentationStyle。
下面来说一下问题,为了方便适配各种iPhone,我在这些help视图控制器都使用了AutoLayout。那么问题来了,当我present之后,iOS8及其以上系统都没有问题,唯独在iOS7上所有以topLayoutGuide为基准的控件位置都不对,(话说就这个原因我都查了好久才查出来,心累……)那么到底发生了什么呢,原来iOS7在自定义转场动画后,ViewController的topLayoutGuide就失效了,即获取到的length是0,所以即使该ViewController有状态栏亦或导航栏,topLayoutGuide的length依然是0。所以后面所有依赖topLayoutGuide的控件肯定位置就都悲剧了。这个问题,已经在iOS8上解决了,但是如果依然要适配iOS7应该怎么办呢?stackoverflow上有很多脑洞大开的解决办法,这里我说一个比较靠谱的解决方案,手动设置topLayoutGuide的constraint,下面给出代码:
在自定义转场动画时可以获取到destinationViewController,在这里面进行手动设置,具体代码如下:
- (void)pushTransitionFrom:(UIViewController *)fromVC to:(UIViewController *)toVC withContext:(id<UIViewControllerContextTransitioning>)transitionContext{
AdjustPageController *toViewController = (AdjustPageController*)[transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
if ([[[UIDevice currentDevice] systemVersion]floatValue]<=8.0) {
CGFloat navigationBarHeight = toViewController.navigationController.navigationBar.frame.size.height;
for (NSLayoutConstraint *constraint in toViewController.view.constraints){
if (constraint.firstItem == toViewController.topLayoutGuide&& constraint.firstAttribute == NSLayoutAttributeHeight&&constraint.secondItem == nil&& constraint.constant < navigationBarHeight) {
constraint.constant += navigationBarHeight;
}
}
}
//do your animation
}
以上代码应该很容易看懂,我就不做解释了。虽然iOS7有点out,但是新技能get,very good。
相关文章推荐
- SourceProvider.getJniDirectories
- Trac 中文语言安装
- 软件 bug 的生命周期
- Gifski:一个跨平台的高质量 GIF 编码器
- Firefox2中输入框丢失光标bug的解决方法
- 模仿动画的放大缩小容器
- for命令的一些bug分析
- 修正IE下使用CSS属性overflow的bug
- 解决IE6 3像素Bug的css写法
- jQuery 1.9.1源码分析系列(十五)动画处理之缓动动画核心Tween
- Android实现定制返回按钮动画效果的方法
- Android中ViewFlipper的使用及设置动画效果实例详解
- jQuery实现美观的多级动画效果菜单代码
- php判断GIF图片是否为动画的方法
- 跟我学习JScript的Bug与内存管理
- jQuery实现动画效果circle实例
- HTML5游戏引擎LTweenLite实现的超帅动画效果(附demo源码下载)
- JS注释所产生的bug 即使注释也会执行
- 浅析JavaScript动画
- js排序动画模拟-插入排序