国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > iOS > 正文

iOS自定義UITabBar仿今日頭條效果

2019-10-21 18:44:42
字體:
供稿:網(wǎng)友

動(dòng)機(jī)

關(guān)于自定義 TabBar,早就有過很多討論,開源網(wǎng)站上也有很多造好的輪子,多半是純代碼實(shí)現(xiàn)有個(gè)性的 TabBar,當(dāng)然我們可以很方便的使用它。周末閑著沒事干,自己也寫了一下,模仿今日頭條的 TabBar 效果,實(shí)現(xiàn)方式是Storyboard + 代碼。

效果圖

iOS,UITabBar,今日頭條

實(shí)現(xiàn)步驟在 Storyborad 上搭建項(xiàng)目基礎(chǔ)結(jié)構(gòu)

iOS,UITabBar,今日頭條

在界面上設(shè)置每個(gè) TabBarItem 的相關(guān)屬性

iOS,UITabBar,今日頭條

需要自定義的 item 不需要在界面上設(shè)置。

自定義 UITabBarViewController

目的

替換默認(rèn)的 UITabBar
處理 發(fā)布按鈕(中間那個(gè)加號(hào)按鈕)點(diǎn)擊事件

主要代碼

替換 UITabBar,監(jiān)聽點(diǎn)擊事件

override func viewDidLoad() {  super.viewDidLoad()  // 替換 tabbar  let _tabBar = TabBar()  // 監(jiān)聽按鈕點(diǎn)擊事件  _tabBar.handleBtnReleaseClick(self, action: #selector(btnReleaseClick))  setValue(_tabBar, forKey: "tabBar")}

自定義 UITabBar

目的

自定義 UITabBar,替換掉 Storyboard 上默認(rèn)生成的 TabBarItem
處理 發(fā)布按鈕(中間那個(gè)加號(hào)按鈕)點(diǎn)擊事件

主要代碼

刪除占位“按鈕”,添加自定義按鈕

// MARK: 刪除占位“按鈕”,添加自定義按鈕override func layoutSubviews() {  super.layoutSubviews()  btnRelease.backgroundColor = UIColor.white  // 過濾掉 _UIBarBackground 類型的對(duì)象,只保留 UITabBarButton 類型的對(duì)象  let tabbarButtonList = iews.filter{NSStringFromClass(type(of: $0)) == abBarButton"}  // 取出需要?jiǎng)h除的“按鈕”(經(jīng)測(cè)試,知道中間那個(gè)加號(hào)按鈕的下標(biāo)是2)  let tmpView = tabbarButtonList[safe: 2]  // 把默認(rèn)生成的從父容器中移除  tmpView?.removeFromSuperview()  let x = (InnerConst.ScreenW - btnRelease.w) * 0.5  let y = InnerConst.ButtonOffsetY  btnRelease.origin = CGPoint(x: x, y: y)  addSubview(btnRelease)}

處理默認(rèn)情況下,按鈕超出 TabBar 以外區(qū)域不能點(diǎn)擊問題

// MARK: 處理默認(rèn)情況下,按鈕超出 TabBar 以外區(qū)域不能點(diǎn)擊問題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)}

按鈕點(diǎn)擊事件委托給調(diào)用方

func handleBtnReleaseClick(_ target: AnyObject?, action: Selector) {  btnRelease.addTarget(target, action: action, for: .touchUpInside)}

代碼寫到這里,一個(gè)類似于今日頭條的 UITabBar(主要是中間那個(gè)按鈕)差不多造出來了。以上部分貼出來的是個(gè)人認(rèn)為比較關(guān)鍵的代碼,有問題可以討論,目的是用最簡單的方式、最少的代碼實(shí)現(xiàn)需求。

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到IOS開發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 墨脱县| 肃宁县| 庆安县| 黎川县| 莲花县| 邓州市| 丁青县| 广昌县| 扬州市| 庆阳市| 荔波县| 元氏县| 瑞昌市| 宁海县| 余姚市| 百色市| 香格里拉县| 山东| 闻喜县| 河北省| 洛川县| 京山县| 乾安县| 山阴县| 乾安县| 民丰县| 襄汾县| 梅州市| 神木县| 寻乌县| 襄樊市| 新安县| 勃利县| 铜梁县| 富锦市| 牡丹江市| 文成县| 苏尼特左旗| 离岛区| 蛟河市| 阿克陶县|