先上效果图
思路是个很重要的东西
--->第一、如何实现中间按钮的与众不同,怎样改变?
--->第二、实现完界面的处理之后,事件怎么处理相应?
首先来解决第一个问题,通过视图层级关系我们可以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,故不需要去处理多余的事件,完美解决