- 如果有小伙伴也和我一样用了RDVTabBarController这个第三方,那么可能也会遇到类似的坑,RDVTabBarController这个第三方确实比较强大,横竖屏都支持了,但是,当自己的项目只需要默认几个页面支持横屏,其他页面不需要横屏的时候,那么这个框架就是一个隐形的炸弹了。那么这个时候,你得改他的源代码了,关于横竖屏的设置方法。它更新已经是8个月前的事情了,貌似不会更新了。所以,用的话,慎重。开发中,发现出莫名奇妙的bug,可能都是这个第三方弄的,建议,别用了。巨坑。补充了一下。
修改RDVTabBarController.m文件
// RDVTabBarController.m
// RDVTabBarController
//
// Copyright (c) 2013 Robert Dimitrov
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#import "RDVTabBarController.h"
#import "RDVTabBarItem.h"
#import
@interface UIViewController (RDVTabBarControllerItemInternal)
- (void)rdv_setTabBarController:(RDVTabBarController *)tabBarController;
@end
@interface RDVTabBarController () {
UIView *_contentView;
BOOL _isAutoRotation;
}
@property (nonatomic, readwrite) RDVTabBar *tabBar;
@end
@implementation RDVTabBarController
#pragma mark - View lifecycle
- (void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:[self contentView]];
[self.view addSubview:[self tabBar]];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(isRotation:) name:@"isAutoRotationKey" object:nil];
}
- (void)isRotation:(NSNotification *)noti {
_isAutoRotation = [[noti.object objectForKey:@"isAuto"] boolValue];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self setSelectedIndex:[self selectedIndex]];
[self setTabBarHidden:self.isTabBarHidden animated:NO];
}
- (UIStatusBarStyle)preferredStatusBarStyle {
return self.selectedViewController.preferredStatusBarStyle;
}
- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation {
return self.selectedViewController.preferredStatusBarUpdateAnimation;
}
- (BOOL)shouldAutorotate {
return _isAutoRotation;
}
- (NSUInteger)supportedInterfaceOrientations {
NSLog(@"111");
if (_isAutoRotation) {
NSLog(@"222");
return UIInterfaceOrientationMaskAll;
}
return UIInterfaceOrientationMaskPortrait;
}
//#if __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_9_0
//- (NSUInteger)supportedInterfaceOrientations
//#else
//- (UIInterfaceOrientationMask)supportedInterfaceOrientations
//#endif
//{
//
// if (_isAutoRotation) {
//
// return UIInterfaceOrientationMaskAll;
// }
// return UIInterfaceOrientationMaskPortrait;
//}
//- (NSUInteger)supportedInterfaceOrientations {
// UIInterfaceOrientationMask orientationMask = UIInterfaceOrientationMaskAll;
// for (UIViewController *viewController in [self viewControllers]) {
// if (![viewController respondsToSelector:@selector(supportedInterfaceOrientations)]) {
// return UIInterfaceOrientationMaskPortrait;
// }
//
// UIInterfaceOrientationMask supportedOrientations = [viewController supportedInterfaceOrientations];
//
// if (orientationMask > supportedOrientations) {
// orientationMask = supportedOrientations;
// }
// }
//
// return orientationMask;
//}
//
//- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
// for (UIViewController *viewCotroller in [self viewControllers]) {
// if (![viewCotroller respondsToSelector:@selector(shouldAutorotateToInterfaceOrientation:)] ||
// ![viewCotroller shouldAutorotateToInterfaceOrientation:toInterfaceOrientation]) {
// return NO;
// } else {
// return [viewCotroller shouldAutorotateToInterfaceOrientation:toInterfaceOrientation];
// }
// }
// return YES;
//}
#pragma mark - Methods
- (UIViewController *)selectedViewController {
return [[self viewControllers] objectAtIndex:[self selectedIndex]];
}
- (void)setSelectedIndex:(NSUInteger)selectedIndex {
if (selectedIndex >= self.viewControllers.count) {
return;
}
if ([self selectedViewController]) {
[[self selectedViewController] willMoveToParentViewController:nil];
[[[self selectedViewController] view] removeFromSuperview];
[[self selectedViewController] removeFromParentViewController];
}
_selectedIndex = selectedIndex;
[[self tabBar] setSelectedItem:[[self tabBar] items][selectedIndex]];
[self setSelectedViewController:[[self viewControllers] objectAtIndex:selectedIndex]];
[self addChildViewController:[self selectedViewController]];
[[[self selectedViewController] view] setFrame:[[self contentView] bounds]];
[[self contentView] addSubview:[[self selectedViewController] view]];
[[self selectedViewController] didMoveToParentViewController:self];
[self setNeedsStatusBarAppearanceUpdate];
}
- (void)setViewControllers:(NSArray *)viewControllers {
if (_viewControllers && _viewControllers.count) {
for (UIViewController *viewController in _viewControllers) {
[viewController willMoveToParentViewController:nil];
[viewController.view removeFromSuperview];
[viewController removeFromParentViewController];
}
}
if (viewControllers && [viewControllers isKindOfClass:[NSArray class]]) {
_viewControllers = [viewControllers copy];
NSMutableArray *tabBarItems = [[NSMutableArray alloc] init];
for (UIViewController *viewController in viewControllers) {
RDVTabBarItem *tabBarItem = [[RDVTabBarItem alloc] init];
[tabBarItem setTitle:viewController.title];
[tabBarItems addObject:tabBarItem];
[viewController rdv_setTabBarController:self];
}
[[self tabBar] setItems:tabBarItems];
} else {
for (UIViewController *viewController in _viewControllers) {
[viewController rdv_setTabBarController:nil];
}
_viewControllers = nil;
}
}
- (NSInteger)indexForViewController:(UIViewController *)viewController {
UIViewController *searchedController = viewController;
if ([searchedController navigationController]) {
searchedController = [searchedController navigationController];
}
return [[self viewControllers] indexOfObject:searchedController];
}
- (RDVTabBar *)tabBar {
if (!_tabBar) {
_tabBar = [[RDVTabBar alloc] init];
[_tabBar setBackgroundColor:[UIColor clearColor]];
[_tabBar setAutoresizingMask:(UIViewAutoresizingFlexibleWidth|
UIViewAutoresizingFlexibleTopMargin|
UIViewAutoresizingFlexibleLeftMargin|
UIViewAutoresizingFlexibleRightMargin|
UIViewAutoresizingFlexibleBottomMargin)];
[_tabBar setDelegate:self];
}
return _tabBar;
}
- (UIView *)contentView {
if (!_contentView) {
_contentView = [[UIView alloc] init];
[_contentView setBackgroundColor:[UIColor whiteColor]];
[_contentView setAutoresizingMask:(UIViewAutoresizingFlexibleWidth|
UIViewAutoresizingFlexibleHeight)];
}
return _contentView;
}
- (void)setTabBarHidden:(BOOL)hidden animated:(BOOL)animated {
_tabBarHidden = hidden;
__weak RDVTabBarController *weakSelf = self;
void (^block)() = ^{
CGSize viewSize = weakSelf.view.bounds.size;
CGFloat tabBarStartingY = viewSize.height;
CGFloat contentViewHeight = viewSize.height;
CGFloat tabBarHeight = CGRectGetHeight([[weakSelf tabBar] frame]);
if (!tabBarHeight) {
tabBarHeight = 49;
}
if (!hidden) {
tabBarStartingY = viewSize.height - tabBarHeight;
if (![[weakSelf tabBar] isTranslucent]) {
contentViewHeight -= ([[weakSelf tabBar] minimumContentHeight] ?: tabBarHeight);
}
[[weakSelf tabBar] setHidden:NO];
}
[[weakSelf tabBar] setFrame:CGRectMake(0, tabBarStartingY, viewSize.width, tabBarHeight)];
[[weakSelf contentView] setFrame:CGRectMake(0, 0, viewSize.width, contentViewHeight)];
};
void (^completion)(BOOL) = ^(BOOL finished){
if (hidden) {
[[weakSelf tabBar] setHidden:YES];
}
};
if (animated) {
[UIView animateWithDuration:0.24 animations:block completion:completion];
} else {
block();
completion(YES);
}
}
- (void)setTabBarHidden:(BOOL)hidden {
[self setTabBarHidden:hidden animated:NO];
}
#pragma mark - RDVTabBarDelegate
- (BOOL)tabBar:(RDVTabBar *)tabBar shouldSelectItemAtIndex:(NSInteger)index {
if ([[self delegate] respondsToSelector:@selector(tabBarController:shouldSelectViewController:)]) {
if (![[self delegate] tabBarController:self shouldSelectViewController:[self viewControllers][index]]) {
return NO;
}
}
if ([self selectedViewController] == [self viewControllers][index]) {
if ([[self selectedViewController] isKindOfClass:[UINavigationController class]]) {
UINavigationController *selectedController = (UINavigationController *)[self selectedViewController];
if ([selectedController topViewController] != [selectedController viewControllers][0]) {
[selectedController popToRootViewControllerAnimated:YES];
}
}
return NO;
}
return YES;
}
- (void)tabBar:(RDVTabBar *)tabBar didSelectItemAtIndex:(NSInteger)index {
if (index < 0 || index >= [[self viewControllers] count]) {
return;
}
[self setSelectedIndex:index];
if ([[self delegate] respondsToSelector:@selector(tabBarController:didSelectViewController:)]) {
[[self delegate] tabBarController:self didSelectViewController:[self viewControllers][index]];
}
}
@end
#pragma mark - UIViewController+RDVTabBarControllerItem
@implementation UIViewController (RDVTabBarControllerItemInternal)
- (void)rdv_setTabBarController:(RDVTabBarController *)tabBarController {
objc_setAssociatedObject(self, @selector(rdv_tabBarController), tabBarController, OBJC_ASSOCIATION_ASSIGN);
}
@end
@implementation UIViewController (RDVTabBarControllerItem)
- (RDVTabBarController *)rdv_tabBarController {
RDVTabBarController *tabBarController = objc_getAssociatedObject(self, @selector(rdv_tabBarController));
if (!tabBarController && self.parentViewController) {
tabBarController = [self.parentViewController rdv_tabBarController];
}
return tabBarController;
}
- (RDVTabBarItem *)rdv_tabBarItem {
RDVTabBarController *tabBarController = [self rdv_tabBarController];
NSInteger index = [tabBarController indexForViewController:self];
return [[[tabBarController tabBar] items] objectAtIndex:index];
}
- (void)rdv_setTabBarItem:(RDVTabBarItem *)tabBarItem {
RDVTabBarController *tabBarController = [self rdv_tabBarController];
if (!tabBarController) {
return;
}
RDVTabBar *tabBar = [tabBarController tabBar];
NSInteger index = [tabBarController indexForViewController:self];
NSMutableArray *tabBarItems = [[NSMutableArray alloc] initWithArray:[tabBar items]];
[tabBarItems replaceObjectAtIndex:index withObject:tabBarItem];
[tabBar setItems:tabBarItems];
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
@end
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] postNotificationName:@"isAutoRotationKey" object:@{@"isAuto":[NSNumber numberWithBool:YES]}];
}
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[[NSNotificationCenter defaultCenter] postNotificationName:@"isAutoRotationKey" object:@{@"isAuto":[NSNumber numberWithBool:NO]}];
}