動機
關于自定義 TabBar,早就有過很多討論,開源網站上也有很多造好的輪子,多半是純代碼實現有個性的 TabBar,當然我們可以很方便的使用它。周末閑著沒事干,自己也寫了一下,模仿今日頭條的 TabBar 效果,實現方式是Storyboard + 代碼。
效果圖
實現步驟在 Storyborad 上搭建項目基礎結構
在界面上設置每個 TabBarItem 的相關屬性
需要自定義的 item 不需要在界面上設置。
自定義 UITabBarViewController
目的
替換默認的 UITabBar
處理 發布按鈕(中間那個加號按鈕)點擊事件
主要代碼
替換 UITabBar,監聽點擊事件
override func viewDidLoad() { super.viewDidLoad() // 替換 tabbar let _tabBar = TabBar() // 監聽按鈕點擊事件 _tabBar.handleBtnReleaseClick(self, action: #selector(btnReleaseClick)) setValue(_tabBar, forKey: "tabBar")}
自定義 UITabBar
目的
自定義 UITabBar,替換掉 Storyboard 上默認生成的 TabBarItem
處理 發布按鈕(中間那個加號按鈕)點擊事件
主要代碼
刪除占位“按鈕”,添加自定義按鈕
// MARK: 刪除占位“按鈕”,添加自定義按鈕override func layoutSubviews() { super.layoutSubviews() btnRelease.backgroundColor = UIColor.white // 過濾掉 _UIBarBackground 類型的對象,只保留 UITabBarButton 類型的對象 let tabbarButtonList = iews.filter{NSStringFromClass(type(of: $0)) == abBarButton"} // 取出需要刪除的“按鈕”(經測試,知道中間那個加號按鈕的下標是2) let tmpView = tabbarButtonList[safe: 2] // 把默認生成的從父容器中移除 tmpView?.removeFromSuperview() let x = (InnerConst.ScreenW - btnRelease.w) * 0.5 let y = InnerConst.ButtonOffsetY btnRelease.origin = CGPoint(x: x, y: y) addSubview(btnRelease)}
處理默認情況下,按鈕超出 TabBar 以外區域不能點擊問題
// MARK: 處理默認情況下,按鈕超出 TabBar 以外區域不能點擊問題override func hitTest(_ point: CGPoint, with event: UIEvent?) -View? { if isHidden == false { let newPoint = convert(point, to: btnRelease) if btnRelease.point(inside: newPoint, with: event) { return btnRelease } return super.hitTest(point, with: event) } return super.hitTest(point, with: event)}
按鈕點擊事件委托給調用方
func handleBtnReleaseClick(_ target: AnyObject?, action: Selector) { btnRelease.addTarget(target, action: action, for: .touchUpInside)}
代碼寫到這里,一個類似于今日頭條的 UITabBar(主要是中間那個按鈕)差不多造出來了。以上部分貼出來的是個人認為比較關鍵的代碼,有問題可以討論,目的是用最簡單的方式、最少的代碼實現需求。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。
新聞熱點
疑難解答