完美自定义一个tabBar

先上效果图


完美自定义一个tabBar_第1张图片

思路是个很重要的东西

--->第一、如何实现中间按钮的与众不同,怎样改变?

--->第二、实现完界面的处理之后,事件怎么处理相应?

        首先来解决第一个问题,通过视图层级关系我们可以tabBar上面一个一个的item是UITabBarButton,而UITabBarButton子视图是UITabBarSwappableImageView和UITabBarButtonLabel,分别用来显示图片和文字。label我们是不需要去处理的,主要就是改变imageView的frame。通过各种姿势发现修改不了这个frame,所以我们用一种投机取巧的方式来解决之,自定义一个ImageView放在UITabBarButton上(然后直接把UITabBarSwappableImageView)隐藏掉即可。代码如下:

-  (instancetype)initWithImage:(UIImage *)image{

if (self = [super init]) {

_imageView = [[UIImageView alloc] initWithImage:image];

}

return self;

}

-(void)layoutSubviews

{

[super layoutSubviews];

NSInteger btnIndex = 0;

Class class = NSClassFromString(@"UITabBarButton");

for (UIView *btn in self.subviews) {

if ([btn isKindOfClass:class]) {

if (btnIndex == 2) {

UIImageView *view = btn.subviews.firstObject;

view.center = CGPointMake(btn.size.width/2.0, 0);

_imageView.frame = view.frame;

[btn addSubview:_imageView];

view.hidden = YES;

_imageView.hidden = NO;

}

btnIndex ++;

}

}

}

        经过上面的处理,界面达到了我们想要的效果,不完美的是中间按钮突出部分点击没反应,各个tabbar切换自如,但是中间的图片不能自主切换。首先解决第一个问题,相应超出父视图部分,代码如下:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {

if (self.isHidden == NO)

{

CGPoint newA = [self convertPoint:point toView:self.imageView];

if ( [self.imageView pointInside:newA withEvent:event])

{

return self.imageView.superview;

}

else

{

return [super hitTest:point withEvent:event];

}

}

else

{

return [super hitTest:point withEvent:event];

}

}

然后再解决点击中间bar选中图片切换的问题,只需要实现tabbarViewController代理方法即可,代码如下:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController{

if ([self.viewControllers[2] isEqual:viewController]) {

_TABBAR.imageView.image = [UIImage imageNamed:@"按压-邂逅"];

}else{

_TABBAR.imageView.image = [UIImage imageNamed:@"邂逅"];

}

}

由于barItem还是原来的barItem,故不需要去处理多余的事件,完美解决

你可能感兴趣的:(完美自定义一个tabBar)