1. 防閑魚app
效果圖如下:
實現(xiàn)思路:
- 此時的tabbar的話也是遵循主流梨水,自定義一個繼承自系統(tǒng)UITabbar的LJTabbar规脸,然后用KVC和系統(tǒng)的進行替換耻矮。
- 中間的凸起按鈕和tabbar內(nèi)部的子控件不是同一類型助隧,中間的按鈕是一個自定義的button。
- 最后給tabbar弄一個代理,添加一個點擊中間凸起按鈕的代理方法引几,讓LJTabBarController成為它的代理芭毙,實現(xiàn)對應(yīng)代理方法即可實現(xiàn)按鈕點擊。
核心方法:
- 動態(tài)添加button 后荤西,重新布局子控件代碼
int btnIndex = 0;
for (UIView *btn in self.subviews) {//遍歷tabbar的子控件
if ([btn isKindOfClass:class]) {
btn.lj_width = self.lj_width / 5;
btn.lj_x = btn.lj_width * btnIndex;
btnIndex++;
if (btnIndex == 2) {
btnIndex++;
}
}
}
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
if (self.isHidden == NO) {
//將當(dāng)前tabbar的觸摸點轉(zhuǎn)換坐標(biāo)系澜搅,轉(zhuǎn)換到發(fā)布按鈕的身上,生成一個新的點
CGPoint newP = [self convertPoint:point toView:self.plusBtn];
//判斷如果這個新的點是在發(fā)布按鈕身上邪锌,那么處理點擊事件最合適的view就是發(fā)布按鈕
if ( [self.plusBtn pointInside:newP withEvent:event]) {
return self.plusBtn;
}else{//如果點不在發(fā)布按鈕身上勉躺,直接讓系統(tǒng)處理就可以了
return [super hitTest:point withEvent:event];
}
}
else {//tabbar隱藏了,那么說明已經(jīng)push到其他的頁面了觅丰,這個時候還是讓系統(tǒng)去判斷最合適的view處理就好了
return [super hitTest:point withEvent:event];
}
}
2. 防金琉璃app(一款醫(yī)療軟件)
這個實現(xiàn)思路比較推薦饵溅,特色點是“選中對應(yīng) tabbarItem 不僅有動畫效果, 而且tabbar上的按鈕都為tabbarItem , 沒有使用自定義的button舶胀, 點擊順序非常好控制概说, 不需要再次處理中的凸出按鈕的點擊事件了”
效果圖如下:
實現(xiàn)思路:
- 此時的tabbar也是一個繼承自系統(tǒng)UITabbar的LJTabbar碧注,用KVC和系統(tǒng)的進行替換,這樣方便為tabbar 增加一個中間按鈕的背景圖片糖赔, 使其凸出來萍丐!代碼如下:
- (void)layoutSubviews{
[super layoutSubviews];
Class class = NSClassFromString(@"UITabBarButton");
int btnIndex = 0;
for (UIView *btn in self.subviews){
if ([btn isKindOfClass:class]) {
if (btnIndex == 2) { // btnIndex == 2 的時候, 為中間按鈕放典, 添加一個背景圖片
self.imageView.frame = CGRectMake(5, -17, btn.lj_width - 10, btn.lj_height + 17);
[btn insertSubview:self.imageView atIndex:0];
self.btn = btn;
}
btnIndex++;
}
}
}
- 為了使突出來的按鈕也有點擊事件逝变, 也需要重寫hitTest方法, 但此時要計算轉(zhuǎn)換背景按鈕的坐標(biāo)系奋构, 以便計算出來壳影, 點擊按鈕 的響應(yīng)區(qū)域。
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {}
if (self.isHidden == NO) {
CGPoint newP = [self convertPoint:point toView:self.imageView];
//判斷如果這個新的點是在發(fā)布按鈕身上弥臼,那么處理點擊事件最合適的view就是發(fā)布按鈕
if ( [self.imageView pointInside:newP withEvent:event]) {
return self.btn;
}else{ //如果點不在發(fā)布按鈕身上宴咧,直接讓系統(tǒng)處理就可以了
return [super hitTest:point withEvent:event];
}
}
else { //tabbar隱藏了,那么說明已經(jīng)push到其他的頁面了径缅,這個時候還是讓系統(tǒng)去判斷最合適的view處理就好了
return [super hitTest:point withEvent:event];
}
}
- 動畫效果的實現(xiàn)掺栅, 是實現(xiàn)TabBarController 的 tabBarController:shouldSelectViewController: 這個代理方法, 并且添加一個選中的item 動態(tài)添加一個動畫組纳猪, 如下代碼:
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController{
NSInteger index = [tabBarController.childViewControllers indexOfObject:viewController]; // 獲取當(dāng)前選中的控制器位置
UIButton *tabBarBtn = tabBarController.tabBar.subviews[index+1];
Class clase = NSClassFromString(@"UITabBarSwappableImageView");
UIImageView *imageView = nil; // 獲取對應(yīng)的ImageView氧卧,添加動畫。
for (UIView *view in tabBarBtn.subviews) {
if ([view isKindOfClass:clase]) {
imageView = (UIImageView *)view;
}
}
imageView.animationImages = self.allImages[index];
imageView.animationRepeatCount = 1;
imageView.animationDuration = ImageCount * 0.08;
[imageView startAnimating];
return YES;
}
這樣就能實現(xiàn)上述的效果了氏堤,選擇對應(yīng)的按鈕沙绝, 有動畫、 選中顏色也有對應(yīng)的色彩鼠锈,tabbar順序也不會更改闪檬。