轉屏主要分為兩種方式來實現(xiàn):
第一種是物理轉屏(強制轉屏),這種方式的優(yōu)點是子視圖無需再次更新位置布局示罗,能跟著父視圖適應了對應的位置,另外狀態(tài)欄也能跟著轉過來了。缺點是返回豎排模式時有種轉屏時的視覺沖擊感岖妄!還有某些其他的比如table自動位移的坑!用戶體驗不算完美寂祥。值得提醒的是:坐標系發(fā)生了改變荐虐,寬度的最大值變成了高度。
核心代碼如下:
?? //添加到Window上
? ? UIWindow *keyWindow = [UIApplication sharedApplication].delegate.window;
? ? [keyWindow addSubview:self];
? ? ? ? ? ? [[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIInterfaceOrientationLandscapeRight] forKey:@"orientation"];
? ? ? ? self.frame = CGRectMake(0, 0, MAX([UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height), MIN([UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height));
第二種動畫轉屏丸凭,使用仿射變換CGAffineTransform福扬,這種方式狀態(tài)欄不能轉過來腕铸,看新浪微博的做法是隱藏了狀態(tài)欄。
其優(yōu)點:沒有特別的副作用铛碑,不全局影響整個app的其他控制器狠裹,坐標系沒有發(fā)生變化。
缺點(痛點)1汽烦、轉屏后需要更新子視圖的的坐標位置(前提是使用Frame布局)涛菠,導致代碼量增加,恢復豎排又需要更新子視圖的的坐標位置撇吞;2俗冻、狀態(tài)欄還是處于豎排狀態(tài),方向不能改變牍颈,因為蘋果提供的相關方法setStatusBarOrientation已經(jīng)棄用了迄薄。
代碼實現(xiàn)如下:
#pragma mark全屏
- (void)fullScreen{
? ? //添加到Window上
? ? [_coverIV removeFromSuperview];
? ? UIWindow *keyWindow = [UIApplication sharedApplication].delegate.window;
? ? [keyWindow addSubview:_coverIV];
? ? CGFloat duration = [UIApplication sharedApplication].statusBarOrientationAnimationDuration;
? ? //? ? [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:YES];
? ? [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
? ? [UIView animateWithDuration:duration animations:^{
? ? ? ? self.coverIV.transform = CGAffineTransformMakeRotation(M_PI / 2);
? ? }];
? ? self.coverIV.frame=CGRectMake(0,0,MIN([UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height),MAX([UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height));
//接著修改coverIV的子視圖坐標位置
}
那可能某些朋友會問:你為什么不使用masonry自動布局?其實我一開始是使用Masonry布局視頻控件的煮岁,使用masonry自動布局的好處是:設置子視圖布局的代碼在layoutSubview中刷新可以復用子視圖的布局代碼讥蔽。
至少在ios12、13中運行沒有問題画机,但是偏偏ios10出了問題冶伞,我暫時沒解決,所以改成了Frame形式來兼容所有的系統(tǒng)步氏,這個自動布局蘋果還是有一些坑的碰缔。
或許還有第三種轉場動畫跳轉到一個新的控制器來轉屏實現(xiàn),甚至第四種等方案...戳护?
大家如果有完美的解決方式可以討論一下金抡!
最后轉屏給點重點提示:記得設置支持的方向
//支持的方向
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
? ? return UIInterfaceOrientationMaskAllButUpsideDown;//注意一定要使用這個枚舉
}
- (BOOL)shouldAutorotate{
? ? return YES;
}