您的位置:首页 > 产品设计 > UI/UE

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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息