| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 | #import "UITabBar+utils.h"
#import <objc/runtime.h>
#define BADGE_OFFSET 0.2
#define IMAGE_VIEW_TAG 1
typedef void (*UITabBarButton_layoutSubviews__IMP)(void);
static UITabBarButton_layoutSubviews__IMP original_UITabBarButton_layoutSubviews;
@implementation UITabBar (utils)
- (void)centerTabItems {
	[self removeTabBarItemTitles];
	[self swizzleUITabBarButton];
}
- (void)removeTabBarItemTitles {
	for (UITabBarItem* item in self.items) {
		item.title = nil;
	}
}
- (void)swizzleUITabBarButton {
	static dispatch_once_t onceToken;
	dispatch_once(&onceToken, ^{
		[[self class] swizzleUITabBarButtonLayoutSubviews];
	});
}
+ (void)swizzleUITabBarButtonLayoutSubviews {
	Class UITabBarButtonClass = NSClassFromString(@"UITabBarButton");
	
	SEL layoutSubviewsSEL = @selector(layoutSubviews);
	Method layoutSubviewsMethod = class_getInstanceMethod(UITabBarButtonClass, layoutSubviewsSEL);
	IMP layoutSubviewsIMP = method_getImplementation(layoutSubviewsMethod);
	
	original_UITabBarButton_layoutSubviews = layoutSubviewsIMP;
	
	SEL swizzleUITabBarButton_layoutSubviewsSEL = @selector(swizzleUITabBarButton_layoutSubviews);
	Method swizzleUITabBarButton_layoutSubviewsMethod = class_getInstanceMethod(self, swizzleUITabBarButton_layoutSubviewsSEL);
	
	method_exchangeImplementations(layoutSubviewsMethod, swizzleUITabBarButton_layoutSubviewsMethod);
}
- (void)swizzleUITabBarButton_layoutSubviews {
	original_UITabBarButton_layoutSubviews();
	for (UIView *subView in self.subviews) {
		if ([subView isKindOfClass:NSClassFromString(@"UITabBarSwappableImageView")]) {
			subView.center = CGPointMake(subView.center.x, subView.superview.frame.size.height / 2);
			subView.tag = IMAGE_VIEW_TAG;
		}
		
		if ([subView isKindOfClass:NSClassFromString(@"_UIBadgeView")]) {
			UIView* imageView = [subView.superview viewWithTag:IMAGE_VIEW_TAG];
			subView.frame = CGRectMake(subView.frame.origin.x, (imageView.frame.origin.y + imageView.frame.size.height * BADGE_OFFSET) - subView.frame.size.height / 2, subView.frame.size.width, subView.frame.size.height);
		}
	}
}
@end
 |