背景
最近在擼播放器的代碼魁瞪,在做播放器全屏切換時(shí)為了讓播放器在項(xiàng)目不支持橫屏的情況下依然能夠橫屏顯示,需要將播放器放在一個(gè)單獨(dú)的控制器中涩嚣,并且設(shè)置這個(gè)控制器支持橫豎屏赃梧。
在這種情況下,需要將創(chuàng)建的控制器通過(guò)模態(tài)的方式展現(xiàn)墩虹,此時(shí)我們需要知道屏幕上正在展示的控制器嘱巾。
思路
能夠改變當(dāng)前顯示的控制器的方式無(wú)非幾種:
UITabBarController 切換選中的控制器。
UINavigationController pop或者push诫钓。
UIViewController 通過(guò)模態(tài)彈出另一個(gè)控制器旬昭。
在了解了以上之后,我們還需要一個(gè)查詢的入口菌湃。
App啟動(dòng)后顯示的第一個(gè)控制器一定是根控制器问拘。
因此我們可以通過(guò)app根控制器來(lái)一級(jí)一級(jí)向上查詢。
代碼
+ (UIViewController *)topViewController {
//找到根視圖
UIViewController * rootVC = [UIApplication sharedApplication].keyWindow.rootViewController;
return [rootVC see_topViewController];
}
- (UIViewController *)see_topViewController {
//首先查詢當(dāng)前控制器是否模態(tài)出了另一個(gè)控制器惧所,如果有則使用模態(tài)出的控制器查詢
if (self.presentedViewController) {
return [self.presentedViewController see_topViewController];
}
//如果當(dāng)前控制器是TabBarController則使用當(dāng)前選中的控制器查詢
else if ([self isKindOfClass:[UITabBarController class]]) {
return [((UITabBarController *)self).selectedViewController see_topViewController];
}
//如果當(dāng)前控制器是NavigationController則使用棧頂?shù)目刂破鱽?lái)查詢
else if ([self isKindOfClass:[UINavigationController class]]) {
/*關(guān)于visibleViewController和topViewController
visibleViewcontroller 當(dāng)前可見的控制器骤坐,可能是由topViewController模態(tài)出的控制器
topViewController 棧頂控制器
*/
return [((UINavigationController *)self).topViewController see_topViewController];
}
else {
return self;
}
}
需要注意的是,UINavigationController和UITabBarController同樣可以模態(tài)別的控制器纯路,所以在查詢的時(shí)候首先要查是否有模態(tài)出的控制器或油,否則如果使用UINavigationController或者UITabBarController模態(tài)出了別的控制器會(huì)造成查詢結(jié)果錯(cuò)誤。