RDVTabBarController这个第三方的坑

作者: Z了个L | 来源:发表于2016-10-28 14:04 被阅读1719次
    • 如果有小伙伴也和我一样用了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 <objc/runtime.h>
    
    @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]}];
    }
    
    

    相关文章

      网友评论

        本文标题:RDVTabBarController这个第三方的坑

        本文链接:https://www.haomeiwen.com/subject/gsheuttx.html