iOS頁面翻轉

weixin_34107955發表於2018-02-03
  • 前言

    專案中遇到一個頁面翻轉的需求,完成之後寫出來希望能幫助到需要的人。
  • 說說思路
    1. 首先我們需要翻轉的是整個window,而不是某個控制器。因為,如果只翻轉控制器。那麼你下一層的控制器在你翻轉的時候回顯示出來。
    2. 翻轉多少呢?180度。然後你就錯了。當翻轉到180 度的時候你會發現vc中的所有空間都反了。。所以要轉個圈,也就是360度。
    3. 然後翻轉的時候在什麼時候載入下個vc 呢?我這邊是在第一個控制器翻轉到90度的時候,初始化。然後設定alpha。
    4. 最後翻轉到90度之後,顯示下一個控制器。
      廢話不多說直接上程式碼,比較簡單。
    //  來吧旋轉動畫
    __weak typeof(self) weakSelf = self;
    [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
        weakSelf.view.layer.transform = CATransform3DMakeRotation(M_PI/2.0, 0, 1, 0);  // 當前view,這句程式碼可以不要。這是我的需求
        UIWindow *window = [UIApplication sharedApplication].keyWindow;  
        window.layer.transform = CATransform3DMakeRotation(M_PI/2.0, 0, 1, 0);
    } completion:^(BOOL finished) {
        NewInfoViewController *newVC =[NewInfoViewController new];
        [weakSelf presentViewController:newVC animated:NO completion:nil];
    }];

在第二個介面中

- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
        [UIView animateWithDuration:0 animations:^{
            self.view.layer.transform = CATransform3DMakeRotation(3*M_PI/2, 0, 1, 0);// 先將頁面翻轉270度。此時是你看不見這個控制器的,設定了alpha
        } completion:^(BOOL finished) {
            self.view.alpha = 1;
            [UIView animateWithDuration:0.5 animations:^{
                // 先將window 翻轉270.
                UIWindow *window = [UIApplication sharedApplication].keyWindow;
                window.layer.transform = CATransform3DRotate(window.layer.transform,M_PI*3/2.0, 0, 1, 0);
                self.view.layer.transform = CATransform3DRotate(self.view.layer.transform, M_PI/2, 0, 1, 0);
            } completion:^(BOOL finished) {
            }];
        }];
    }
}

OK, 就這樣搞定了需求。不要的有沒有小夥伴還有更好的解決辦法。希望小夥伴給點建議。
這裡主要用到了 CATransform3DRotate 和 CATransform3DMakeRotation這2個方法。對x.y.z軸的翻轉。
希望能幫助到需要的人。。

---來自濤胖子的工作筆記

相關文章