iOS 中間凸出Item的方法-原生UITabBar制作

鑒于評論中的問題,本人又寫已一遍demo,暫時沒有發(fā)現(xiàn)大家提出item順序錯誤與圖片變大等問題.
現(xiàn)已將demo上傳,大家可下載查看.demo鏈接
若有其他問題,可提供demo鏈接供我查看.

------- 前言 ------

現(xiàn)在制作TabBar中間凸出按鈕的方法一般都是自定義一個tabBar,然后在進行其他處理,這方面的文章很多,就不多說.

今天我們介紹一種使用原生UITabBar制作中間凸出Item的方法,個人感覺方便快捷.

先看效果

QQ20180829-153018.gif
第一步:

和普通tabbar一樣,設(shè)置UITabBarViewController的viewControllers和tabBarItem的樣式;


image.png
第二步:

在TabBarViewVController中重寫viewDidLayoutSubviews方法,在此方法中,調(diào)整中間item的imageInsets,這是系統(tǒng)自帶的.


image.png
第二步(修改)

因為發(fā)現(xiàn)在來回切換tabbarItem的時候,Item地址存在變化,原因未明(估計是系統(tǒng)內(nèi)部淺拷貝的原因),故而修改手勢添加的位置.修改為在TabBarViewVController的delegate協(xié)議中的- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController中添加,避免系統(tǒng)內(nèi)部每次拷貝導致手勢響應(yīng)丟失,看下圖;

image.png
第三步:

創(chuàng)建UIBarItem的Category文件,使用KVC獲取View


image.png
image.png
第四步:

創(chuàng)建UITabBarItem的Category文件,獲取系統(tǒng)展示item展示圖片的UIImageView,此處可運行時綁定Item的雙擊事件


image.png
image.png
第五步:

創(chuàng)建UITabBar的Category文件,重寫響應(yīng)鏈


image.png
拓展:

可在手勢響應(yīng)方法中制作旋轉(zhuǎn)等動畫,因為重寫了響應(yīng)鏈,手勢的tap.view就是UIImageView;或者直接使用UITabBarItem的Category定義的方法獲取UIImageView.

附代碼,直接拷貝拿去用吧,代碼少,就不上傳Demo了

  • *** UIBarItem的Category文件 ***

 - (UIView *)gs_view {
    return [self valueForKey:@"view"];
}

  • *** UITabBarItem的Category文件 ***

/**
 *  雙擊 tabBarItem 時的回調(diào),默認為 nil箕憾。
 *  @arg tabBarItem 被雙擊的 UITabBarItem
 *  @arg index      被雙擊的 UITabBarItem 的序號
 */
@property(nonatomic, copy) void (^gs_doubleTapBlock)(UITabBarItem *tabBarItem, NSInteger index);

/**
 * 獲取一個UITabBarItem內(nèi)顯示圖標的UIImageView铝宵,如果找不到則返回nil
 * @warning 需要對nil的返回值做保護
 */
- (UIImageView *)gs_imageView;

+ (UIImageView *)gs_imageViewInTabBarButton:(UIView *)tabBarButton;


- (UIImageView *)gs_imageView {
    return [self.class gs_imageViewInTabBarButton:self.gs_view];
}

+ (UIImageView *)gs_imageViewInTabBarButton:(UIView *)tabBarButton {
    
    if (!tabBarButton) {
        return nil;
    }
    
    for (UIView *subview in tabBarButton.subviews) {
        // iOS10及以后竹习,imageView都是用UITabBarSwappableImageView實現(xiàn)的蝇摸,所以遇到這個class就直接拿
        if ([NSStringFromClass([subview class]) isEqualToString:@"UITabBarSwappableImageView"]) {
            return (UIImageView *)subview;
        }
        
        if (IOS_VERSION < 10) {
            // iOS10以前,選中的item的高亮是用UITabBarSelectionIndicatorView實現(xiàn)的校哎,所以要屏蔽掉
            if ([subview isKindOfClass:[UIImageView class]] && ![NSStringFromClass([subview class]) isEqualToString:@"UITabBarSelectionIndicatorView"]) {
                return (UIImageView *)subview;
            }
        }
    }
    return nil;
}

static char kAssociatedObjectKey_doubleTapBlock;

- (void)setGs_doubleTapBlock:(void (^)(UITabBarItem *, NSInteger))gs_doubleTapBlock {
    objc_setAssociatedObject(self, &kAssociatedObjectKey_doubleTapBlock, gs_doubleTapBlock, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (void (^)(UITabBarItem *, NSInteger))gs_doubleTapBlock {
    return (void (^)(UITabBarItem *, NSInteger))objc_getAssociatedObject(self, &kAssociatedObjectKey_doubleTapBlock);
}

  • *** UITabBar的Category文件 ***

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    if (!self.isUserInteractionEnabled || self.isHidden || self.alpha <= 0.01) {
        return nil;
    }
    
    if (self.items.count < 2) {
        return [super hitTest:point withEvent:event];
    }
    
    UITabBarItem *item = self.items[2];
    UIImageView *itemImageView  = [item gs_imageView];
    
    if (!itemImageView) {
        return [super hitTest:point withEvent:event];
    }
    
    UIView *view = [super hitTest:point withEvent:event];
    if (view == nil){
        //轉(zhuǎn)換坐標
        CGPoint tempPoint = [itemImageView convertPoint:point fromView:self];
        //判斷點擊的點是否在按鈕區(qū)域內(nèi)
        if (CGRectContainsPoint(itemImageView.bounds, tempPoint)){
            //返回按鈕
            return itemImageView;
        }
        
        //******************    或者使用這個方法     ****************
        
        //判斷如果這個新的點是在發(fā)布按鈕身上薄辅,那么處理點擊事件最合適的view就是發(fā)布按鈕
        if ([itemImageView pointInside:point withEvent:event]) {
            return itemImageView;
        }else{//如果點不在發(fā)布按鈕身上,直接讓系統(tǒng)處理就可以了
            return [super hitTest:point withEvent:event];
        }
    }
    return view;
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末巴比,一起剝皮案震驚了整個濱河市术奖,隨后出現(xiàn)的幾起案子礁遵,更是在濱河造成了極大的恐慌,老刑警劉巖采记,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件佣耐,死亡現(xiàn)場離奇詭異,居然都是意外死亡唧龄,警方通過查閱死者的電腦和手機兼砖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來既棺,“玉大人掖鱼,你說我怎么就攤上這事∠返玻” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵晨仑,是天一觀的道長褐墅。 經(jīng)常有香客問我,道長洪己,這世上最難降的妖魔是什么妥凳? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮答捕,結(jié)果婚禮上逝钥,老公的妹妹穿的比我還像新娘。我一直安慰自己拱镐,他們只是感情好艘款,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著沃琅,像睡著了一般哗咆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上益眉,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天晌柬,我揣著相機與錄音,去河邊找鬼郭脂。 笑死年碘,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的展鸡。 我是一名探鬼主播屿衅,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼娱颊!你這毒婦竟也來了傲诵?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤箱硕,失蹤者是張志新(化名)和其女友劉穎拴竹,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體剧罩,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡栓拜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了惠昔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幕与。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖镇防,靈堂內(nèi)的尸體忽然破棺而出啦鸣,到底是詐尸還是另有隱情,我是刑警寧澤来氧,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布诫给,位于F島的核電站,受9級特大地震影響啦扬,放射性物質(zhì)發(fā)生泄漏中狂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一扑毡、第九天 我趴在偏房一處隱蔽的房頂上張望胃榕。 院中可真熱鬧,春花似錦瞄摊、人聲如沸勋又。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赐写。三九已至,卻和暖如春膜赃,著一層夾襖步出監(jiān)牢的瞬間挺邀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工跳座, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留端铛,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓疲眷,卻偏偏與公主長得像禾蚕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子狂丝,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1换淆、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,969評論 3 119
  • 住房公積金的用法 住房公積金,是指國家機關(guān)县习、國有企業(yè)涮母、城鎮(zhèn)集體企業(yè)、外商投資企業(yè)躁愿、城鎮(zhèn)私營企業(yè)及其他城鎮(zhèn)企業(yè)叛本、事業(yè)...
    假裝很自戀閱讀 227評論 0 0
  • 再美好的過去了也只是回憶。 在那個清爽的日子彤钟,我的心也跟著是清爽的来候,帥氣的那個男孩騎著新買的雅迪,我小心翼翼的坐在...
    王二丫的半生閱讀 103評論 5 3
  • 1逸雹、志愿者時間總開銷:2045分鐘吠勘。 2、具體:作業(yè)相關(guān):805分鐘;活動相關(guān):1240分鐘(含7.5交接活動)峡眶。...
    愛米兒007閱讀 445評論 3 1
  • 01 26歲的小辰入產(chǎn)房待產(chǎn)剧防,痛得忍不下去了,提出要無痛分娩辫樱。丈夫卻拒絕在同意書上簽字峭拘,他說“上麻醉對小孩子有影響...
    貝多星光營閱讀 1,319評論 2 5