UITabBar items jumping on back navigation on iOS 12.1

后端 未结 12 1011
北恋
北恋 2020-11-29 18:28

I have an iOS app with UITabBarController on a master screen, navigating to a detail screen hiding the UITabBarController with setting hidesB

12条回答
  •  青春惊慌失措
    2020-11-29 19:07

    Thanks for the idea of @ElonChan, I just changed the c inline function to OC static method, since I won't use this overrideImplementation too much. And also, this snippet was adjusted to iPhoneX now.

    static CGFloat const kIPhoneXTabbarButtonErrorHeight = 33;
    static CGFloat const kIPhoneXTabbarButtonHeight = 48;
    
    
    @implementation FixedTabBar
    
    
    typedef void(^NewTabBarButtonFrameSetter)(UIView *, CGRect);
    typedef NewTabBarButtonFrameSetter (^ImpBlock)(Class originClass, SEL originCMD, IMP originIMP);
    
    
    + (BOOL)overrideImplementationWithTargetClass:(Class)targetClass targetSelector:(SEL)targetSelector implementBlock:(ImpBlock)implementationBlock {
        Method originMethod = class_getInstanceMethod(targetClass, targetSelector);
        if (!originMethod) {
            return NO;
        }
        IMP originIMP = method_getImplementation(originMethod);
        method_setImplementation(originMethod, imp_implementationWithBlock(implementationBlock(targetClass, targetSelector, originIMP)));
        return YES;
    }
    
    
    + (void)load {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            if (@available(iOS 12.1, *)) {
                [self overrideImplementationWithTargetClass:NSClassFromString(@"UITabBarButton")
                                             targetSelector:@selector(setFrame:)
                                             implementBlock:^NewTabBarButtonFrameSetter(__unsafe_unretained Class originClass, SEL originCMD, IMP originIMP) {
                    return ^(UIView *selfObject, CGRect firstArgv) {
                        if ([selfObject isKindOfClass:originClass]) {
                            if (!CGRectIsEmpty(selfObject.frame) && CGRectIsEmpty(firstArgv)) {
                                return;
                            }
                            if (firstArgv.size.height == kIPhoneXTabbarButtonErrorHeight) {
                                firstArgv.size.height = kIPhoneXTabbarButtonHeight;
                            }
                        }
                        void (*originSelectorIMP)(id, SEL, CGRect);
                        originSelectorIMP = (void (*)(id, SEL, CGRect))originIMP;
                        originSelectorIMP(selfObject, originCMD, firstArgv);
                    };
                }];
            }
        });
    }
    
    @end
    

提交回复
热议问题