最近在項目中有需求顯示一系列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。