19.原諒我還說iOS7,自定義轉場動畫與topLayoutGuide在iOS7中的bug

       最近在項目中有需求顯示一系列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。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章