-
前言
項(xiàng)目中遇到一個(gè)頁(yè)面翻轉(zhuǎn)的需求,完成之后寫出來(lái)希望能幫助到需要的人。 - 說(shuō)說(shuō)思路
- 首先我們需要翻轉(zhuǎn)的是整個(gè)window,而不是某個(gè)控制器。因?yàn)?,如果只翻轉(zhuǎn)控制器。那么你下一層的控制器在你翻轉(zhuǎn)的時(shí)候回顯示出來(lái)。
- 翻轉(zhuǎn)多少呢?180度。然后你就錯(cuò)了。當(dāng)翻轉(zhuǎn)到180 度的時(shí)候你會(huì)發(fā)現(xiàn)vc中的所有空間都反了。。所以要轉(zhuǎn)個(gè)圈,也就是360度。
- 然后翻轉(zhuǎn)的時(shí)候在什么時(shí)候加載下個(gè)vc 呢?我這邊是在第一個(gè)控制器翻轉(zhuǎn)到90度的時(shí)候,初始化。然后設(shè)置alpha。
- 最后翻轉(zhuǎn)到90度之后,顯示下一個(gè)控制器。
廢話不多說(shuō)直接上代碼,比較簡(jiǎn)單。
// 來(lái)吧旋轉(zhuǎn)動(dòng)畫
__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); // 當(dāng)前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];
}];
在第二個(gè)界面中
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[UIView animateWithDuration:0 animations:^{
self.view.layer.transform = CATransform3DMakeRotation(3*M_PI/2, 0, 1, 0);// 先將頁(yè)面翻轉(zhuǎn)270度。此時(shí)是你看不見(jiàn)這個(gè)控制器的,設(shè)置了alpha
} completion:^(BOOL finished) {
self.view.alpha = 1;
[UIView animateWithDuration:0.5 animations:^{
// 先將window 翻轉(zhuǎn)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, 就這樣搞定了需求。不要的有沒(méi)有小伙伴還有更好的解決辦法。希望小伙伴給點(diǎn)建議。
這里主要用到了 CATransform3DRotate 和 CATransform3DMakeRotation這2個(gè)方法。對(duì)x.y.z軸的翻轉(zhuǎn)。
希望能幫助到需要的人。。
---來(lái)自濤胖子的工作筆記