以前都是將知識點寫在 《iOS - 小常識知識點這篇文章》 ,但是后來累積的太多儒鹿,所以還是決定抽時間按功能模塊抽分出來化撕!
0.點項目 - Targets - General - Deployment Info ,如圖
C70563D6-8465-4F95-A2BA-B26519663417.png
第一约炎、默認所有豎屏之強制橫屏版 -- UIDevice 和 Animation 版 (無需解鎖即可強制橫豎屏)
1.項目名稱 - TARGETS - General - Deployment Info - Device Orientation , 勾選Portrait 植阴!
2.創(chuàng)建按鈕,并實現(xiàn)點擊按鈕圾浅,強制橫屏
UIView *navView = [[UIView alloc] initWithFrame:CGRectMake(10, 64+10, WIDTH-20, 200)];
navView.backgroundColor = [UIColor clearColor];
[self.view addSubview:navView];
UIButton *testBtn = [UIButton buttonWithType:UIButtonTypeCustom];
testBtn.backgroundColor = SLIVERYCOLOR;
testBtn.frame = CGRectMake(0, 170, 50, 30);
[navView addSubview:testBtn];
[testBtn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
- (void)btnClick:(UIButton *)sender{
sender.selected = !sender.selected;
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceOrientationDidChange) name:UIDeviceOrientationDidChangeNotification object:nil];
if (sender.selected) {
[self interfaceOrientation:UIInterfaceOrientationLandscapeRight];
}else{
[self interfaceOrientation:UIInterfaceOrientationPortrait];
}
}
- (void)interfaceOrientation:(UIInterfaceOrientation)orientation
{
if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) {
SEL selector = NSSelectorFromString(@"setOrientation:");
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]];
[invocation setSelector:selector];
[invocation setTarget:[UIDevice currentDevice]];
int val = orientation;
// 從2開始是因為0 1 兩個參數(shù)已經(jīng)被selector和target占用
[invocation setArgument:&val atIndex:2];
[invocation invoke];
}
}
- (void)deviceOrientationDidChange
{
NSLog(@"NAV deviceOrientationDidChange:%ld",(long)[UIDevice currentDevice].orientation);
if([UIDevice currentDevice].orientation == UIDeviceOrientationPortrait) {
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:YES];
[self orientationChange:NO];
//注意: UIDeviceOrientationLandscapeLeft 與 UIInterfaceOrientationLandscapeRight
} else if ([UIDevice currentDevice].orientation == UIDeviceOrientationLandscapeLeft) {
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:YES];
[self orientationChange:YES];
}
}
- (void)orientationChange:(BOOL)landscapeRight
{
if (landscapeRight) {
[UIView animateWithDuration:0.2f animations:^{
self.view.transform = CGAffineTransformMakeRotation(M_PI_2);
self.view.bounds = CGRectMake(0, 0, WIDTH, HEIGHT);
}];
} else {
[UIView animateWithDuration:0.2f animations:^{
self.view.transform = CGAffineTransformMakeRotation(0);
self.view.bounds = CGRectMake(0, 0, WIDTH, HEIGHT);
}];
}
}
- (BOOL)shouldAutorotate
{
return NO;
}
3.如果該橫屏控制器為根控制器墙贱,此步忽視!如果該橫屏控制器為導航控制器下的子控制器贱傀,或者是tabbar控制器下的導航控制器下的子控制器惨撇,則需要重寫 父控制器的 shouldAutorotate 方法直到跟控制器未知!
#pragma mark - 注意點:必須重寫父類控制器直至根控制器府寒!在重寫方法的 shouldAutorotate 方法里面?zhèn)魅胄枰獧M屏的控制器魁衙!
#pragma mark - 旋轉相關 (tabbar控制器下的子控制器需要旋轉需要重寫此方法报腔,且需要旋轉哪個控制器就傳入哪個)
- (BOOL)shouldAutorotate
{
//在viewControllers中返回需要改變的NavigationController
//由于此處項目中只有一個基類導航控制器,所以五個控制器名稱相同剖淀,就取 要橫屏的第四個導航控制器 - self.viewControllers[3]
return [self.viewControllers[3] shouldAutorotate];
}
#pragma mark - 旋轉相關 (導航控制器下的子控制器需要旋轉需要重寫此方法纯蛾,且需要旋轉哪個控制器就傳入哪個)
- (BOOL)shouldAutorotate
{
//在viewControllers中返回需要改變的viewController
for (id obj in self.viewControllers) {
if ([obj isKindOfClass:[MSUPlayerController class]]) {
return [obj shouldAutorotate];
}
}
return 0;
}
第二、默認所有豎屏之強制橫屏版 -- AppDelegate BOOL版 (需手動解鎖鎖屏按鈕方可橫豎屏)
0.項目名稱 - TARGETS - General - Deployment Info - Device Orientation , 勾選Portrait 纵隔!
1.在 appdelegate 頭文件中添加屬性
/// 判斷是否橫豎屏
@property (nonatomic,assign)BOOL allowRotation;
2.在 appdelegate.m 文件中實現(xiàn)方法
/* 橫豎屏 */
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
if (self.allowRotation) {
return UIInterfaceOrientationMaskAllButUpsideDown;
}
return UIInterfaceOrientationMaskPortrait;
}
3.在需要橫屏的文件中翻诉,導入頭文件 #import "AppDelegate.h" ,添加如此代碼
/// 橫豎屏相關
AppDelegate *app =(AppDelegate *)[[UIApplication sharedApplication] delegate];
app.allowRotation = YES;
第三捌刮、UI適配版
1.控制器中橫豎屏如何分寫
1).在控制器中的 viewWillLayoutSubviews 中分橫豎屏情況寫控件 frame
- (void)viewWillLayoutSubviews {
[super viewWillLayoutSubviews];
// 通過狀態(tài)欄電池圖標來判斷屏幕方向
if ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) {
// 豎屏 balabala
} else {
// 橫屏 balabala
}
}
2).在控制器中的 viewWillTransitionToSize 中分橫豎屏情況寫控件 frame
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
if (size.width > size.height) { // 橫屏
// 橫屏布局 balabala
} else {
// 豎屏布局 balabala
}
}
2.UIView 中橫豎屏如何分寫
- (void)layoutSubviews{
[super layoutSubviews];
if ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) {
// 豎屏 balabala
} else {
// 橫屏 balabala
}
}