自定义 tabbar

系统定义的tabbar有时无法满足需求,需要自己定义。比如中间加一个按钮之类。

自定义一个tabbar,继承UITabBar。

在PXTabBar中我们可以在中间加一个按钮

UIButton *plusBtn = [[UIButton alloc] init];
[plusBtn setBackgroundImage:[UIImage imageNamed:@"ic_home_add"] forState:UIControlStateNormal];
plusBtn.size = plusBtn.currentBackgroundImage.size;
[plusBtn addTarget:self action:@selector(plusClick) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:plusBtn];
self.plusBtn = plusBtn;

然后将原来的四个按钮重新布局

-(void)layoutSubviews {
    [super layoutSubviews];

    self.plusBtn.centerX = self.width * 0.5;
    self.plusBtn.centerY = self.height * 0.5;

    //设置其他tabbarButton的位置和尺寸
    CGFloat tabBarButtonW  = self.width / 5;
    CGFloat tabbarButtonIndex = 0;

    for (UIView *child in self.subviews) {
        Class class = NSClassFromString(@"UITabBarButton");
        if ([child isKindOfClass:class]) {

            if (tabbarButtonIndex == 2) {
                tabbarButtonIndex = 3;
            }

            child.x = tabbarButtonIndex *tabBarButtonW;
            child.width = tabBarButtonW;

            tabbarButtonIndex ++;
        }
    }
}

KVC

UITabBarController 中有一个属性叫 UITabBar *tabBar, UITabBar 实际是一个 UIView

@property(nonatomic,readonly) UITabBar *tabBar NS_AVAILABLE_IOS(3_0); // Provided for -[UIActionSheet showFromTabBar:]. Attempting to modify the contents of the tab bar directly will throw an exception.

但是这个属性是只读的,想要更换这个tabbar就需要使用 KVC.

KVC就是Key-value coding,大意是允许通过一个Key来读写一个value。
最最常见就是

[id setValue: forKey:]
[id valueforKey:]

这两个方法允许你指定一个Key,然后通过这个Key去访问指定对象中的value。

最后在自定义的 TabBarViewController 中使用KVC来替换掉系统的 tabbar。

PXTabBar *tab = [[PXTabBar alloc]init];
tab.pxDelegate = self;
[self setValue:tab forKey:@"tabBar"];