React Native 之TabBarIOS

来源:http://www.cnblogs.com/miaomiaoshen/archive/2016/11/21/6085266.html
-Advertisement-
Play Games

前言 學習本系列內容需要具備一定 HTML 開發基礎,沒有基礎的朋友可以先轉至 "HTML快速入門(一)" 學習 本人接觸 React Native 時間並不是特別長,所以對其中的內容和性質瞭解可能會有所偏差,在學習中如果有錯會及時修改內容,也歡迎萬能的朋友們批評指出,謝謝 文章第一版出自簡書,如果 ...


前言

  • 學習本系列內容需要具備一定 HTML 開發基礎,沒有基礎的朋友可以先轉至 HTML快速入門(一) 學習

  • 本人接觸 React Native 時間並不是特別長,所以對其中的內容和性質瞭解可能會有所偏差,在學習中如果有錯會及時修改內容,也歡迎萬能的朋友們批評指出,謝謝

  • 文章第一版出自簡書,如果出現圖片或頁面顯示問題,煩請轉至 簡書 查看 也希望喜歡的朋友可以點贊,謝謝

TabBarIOS 組件簡介


  • 目前的APP內,大部分都是選項與選項之間切換,比如:微信、微博、QQ空間…,在iOS中,我們可以通過TabItem類進行實現,那麼,在React Native中,我們可以通過TabBarIOS和TabBarIOS.Item組件來實現選項卡切換效果,大家可以看到後面帶有IOS,所以這個組件不支持Android,當然後面我們會通過自定義該組件來滿足實際開發需求
  • 當然,本章涉及到了 TabBarIOS組件 ,那麼必不可少的,肯定需要與 TabBarIOS.Item 來搭配使用,廢話不多說,先來看它們各自都擁有哪些屬性

TabBarIOS 常見屬性


  • 繼承了View的所有屬性

  • barTintColor:標簽欄的背景顏色

  • tintColor:當前被選中的標簽圖標顏色

  • translucent:bool值,決定標簽欄是否需要半透明化

TabBarIOS.Item 常見屬性


  • 繼承了View的所有屬性

  • badge:圖標右上角顯示的紅色角標

  • icon:給當前標簽指定一個自定義圖標(如果定義了 systemIcon屬性 這個屬性會被忽略)

  • onPress:點此標簽被選中時調用,你應該修改過組件的狀態使 selected={true}

  • selected:這個屬性決定了子視圖是否可見,如果你看到一個空白的頁面,很可能是沒有選中任何一個標簽

  • selectedIcon:當標簽被選中的時候顯示的自定義圖標(如果定義了systemIcon屬性,這個屬性會被忽略,如果定義了icon而沒定義這個屬性,在選中的時候圖標會被染上藍色)

  • systemIcom:一些預定義的系統圖標(如果使用了此屬性,標題和自定義圖標都會被覆蓋為系統定義的值)
    • 預設值:'bookmarks', 'contacts', 'downloads', 'favorites', 'featured', 'history', 'more', 'most-recent', 'most-viewed', 'recents', 'search', 'top-rated'
  • title:在圖標下麵顯示的標題文字(如果定義了 systemIcon屬性,這個屬性會被忽略)

TabBarIOS 初體驗


  • 先簡單來看下怎麼使用TabBarIOS
    • 首先我們需要引入TabBarIOS


        import {
            TabBarIOS
        } from 'react-native';
    
    • 使用 TabBarIOS 很簡單,但是需要配合 TabBarIOS.Item 使用,(需要註意的是我們必須給TabBarIOS設置尺寸,不然可能會造成實例化卻無法看到的問題)


        render() {
            return (
                <View style={styles.container}>
                    <TabBarIOS
                        style={{height:49, width: width}}
                    >
                    </TabBarIOS>
                </View>
            );
        }
    

    效果:
    TabBarIOS實例化效果

    • 接著我們來給它添加 Item(TabBarIOS最多只能包含5個Item,超出的部分會用 more圖標 代替)


        render() {
            return (
                <View style={styles.container}>
                    <TabBarIOS
                        style={{height:49, width: width}}
                    >
                        <TabBarIOS.Item
                            systemIcon="bookmarks"  // 系統圖標(bookmarks)
                        >
                        </TabBarIOS.Item>
                        <TabBarIOS.Item
                            systemIcon="contacts"  // 系統圖標(contacts)
                        >
                        </TabBarIOS.Item>
                        <TabBarIOS.Item
                            systemIcon="downloads"  // 系統圖標(downloads)
                        >
                        </TabBarIOS.Item>
                        <TabBarIOS.Item
                            systemIcon="favorites"  // 系統圖標(favorites)
                        >
                        </TabBarIOS.Item>
                        <TabBarIOS.Item
                            systemIcon="history"  // 系統圖標(history)
                        >
                        </TabBarIOS.Item>
                    </TabBarIOS>
                </View>
            );
        }
    

    效果:
    TabBarIOS.Item效果

  • 是不是很簡單,接下來我們試著修改一下 TabBarIOS 的屬性,看看效果怎樣樣
    • 當前被選中標簽顏色


        <TabBarIOS
            style={{height:49, width: width}}
            tintColor="green"   // 被選中標簽顏色
        >
        </TabBarIOS>
    

    效果:
    被選中標簽顏色

    • 背景色


        <TabBarIOS
            style={{height:49, width: width}}
            tintColor="green"
            barTintColor="black"    // TabBarIOS背景色
        >
        </TabBarIOS>
    

    效果:
    背景色效果

    • 是否有半透明效果


        <TabBarIOS
            style={{height:49, width: width}}
            tintColor="green"
            barTintColor="black"
            translucent={false}     // TabBarIOS不需要半透明效果
        >
        </TabBarIOS>
    

    效果:
    沒有半透明效果

  • 這邊再來試試 TabBarIOS.Item 的屬性
    • 系統自帶圖標
      • bookmarks


          <TabBarIOS.Item
              systemIcon="bookmarks"  // 系統圖標(bookmarks)
          >
          </TabBarIOS.Item>
      

      效果:
      bookmarks

      • contacts


          <TabBarIOS.Item
              systemIcon="contacts"  // 系統圖標(contacts)
          >
          </TabBarIOS.Item>
      

      效果:
      contacts

      • downloads


          <TabBarIOS.Item
              systemIcon="downloads"  // 系統圖標(downloads)
          >
          </TabBarIOS.Item>
      

      效果:
      downloads

      • favorites


          <TabBarIOS.Item
              systemIcon="favorites"  // 系統圖標(favorites)
          >
          </TabBarIOS.Item>
      

      效果:
      favorites

      • featured


          <TabBarIOS.Item
              systemIcon="featured"  // 系統圖標(featured)
          >
          </TabBarIOS.Item>
      

      效果:
      featured

      • history


          <TabBarIOS.Item
              systemIcon="history"  // 系統圖標(history)
          >
          </TabBarIOS.Item>
      

      效果:
      history

      • more


          <TabBarIOS.Item
              systemIcon="more"  // 系統圖標(more)
          >
          </TabBarIOS.Item>
      

      效果:
      more

      • most-recent


          <TabBarIOS.Item
              systemIcon="most-recent"  // 系統圖標(most-recent)
          >
          </TabBarIOS.Item>
      

      效果:
      most-recent

      • most-viewed


          <TabBarIOS.Item
              systemIcon="most-viewed"  // 系統圖標(most-viewed)
          >
          </TabBarIOS.Item>
      

      效果:
      most-viewed

      • recents


          <TabBarIOS.Item
              systemIcon="recents"  // 系統圖標(recents)
          >
          </TabBarIOS.Item>
      

      效果:
      recents

      • search


          <TabBarIOS.Item
              systemIcon="search"  // 系統圖標(search)
          >
          </TabBarIOS.Item>
      

      效果:
      search

      • top-rated


          <TabBarIOS.Item
              systemIcon="top-rated"  // 系統圖標(top-rated)
          >
          </TabBarIOS.Item>
      

      效果:
      top-rated

    • 角標(角標的位置會受到TabBarIOS右邊空間音效,當位置不夠時,會自動往左移動,以保證顯示完整性)


        <TabBarIOS
            style={{height:49, width: width}}
            tintColor="green"
            barTintColor="black"
            translucent={false}
        >
            <TabBarIOS.Item
                systemIcon="bookmarks"  // 系統圖標(bookmarks)
                badge="99999999"
            >
            </TabBarIOS.Item>
            <TabBarIOS.Item
                systemIcon="contacts"  // 系統圖標(contacts)
                badge="15"
            >
            </TabBarIOS.Item>
            <TabBarIOS.Item
                systemIcon="downloads"  // 系統圖標(downloads)
                badge="@$!@"
            >
            </TabBarIOS.Item>
            <TabBarIOS.Item
                systemIcon="favorites"  // 系統圖標(favorites)
                badge="aBBc"
            >
            </TabBarIOS.Item>
            <TabBarIOS.Item
                systemIcon="history"  // 系統圖標(history)
                badge="99+"
            >
            </TabBarIOS.Item>
        </TabBarIOS>
    
    效果:
    角標效果
    • 自定義圖標(目前只支持本地圖片)


        <TabBarIOS.Item
            renderAsOriginal={true} // 如果為false,只會顯示純色圖片
            icon={require('image!home')}
        >
        </TabBarIOS.Item>
    

    效果:
    自定義圖標

    • 自定義高亮圖標(目前只支持本地圖片,如果沒有設置,則會顯示選中顏色圖標)


        selectedIcon={require('image!baker')}
    

    效果:
    高亮圖片效果.gif

    • 文字(如果設置了系統圖標,那麼這個屬性會被忽略)


        title="首頁"
    

    效果:
    文字效果

TabBarIOS.Item點擊


  • 到這裡肯定有人會說,為什麼我的 TabBarIOS.Item 不能接收點擊事件,無法切換界面,這邊就來講解怎麼去實現頁面的切換,它涉及到 TabBarIOS.Item 的兩個屬性 —— selectedonPress
    • 首先,要實現頁面之間的切換,那麼首先它們自己要有對應的頁面,這邊先來給各個 Item 設置屬於自己的頁面


        render() {
          return (
            <View style={styles.container}>
                <TabBarIOS
                    style={{height:49, width: width}}
                    tintColor="green"
                    barTintColor="black"
                    translucent={false}
                >
                    <TabBarIOS.Item
                        systemIcon="bookmarks"  // 系統圖標(bookmarks)
                    >
                        <View style={[styles.childViewStyle, {backgroundColor:'yellow'}]}>
    
                        </View>
                    </TabBarIOS.Item>
                    <TabBarIOS.Item
                        systemIcon="contacts"  // 系統圖標(contacts)
                    >
                        <View style={[styles.childViewStyle, {backgroundColor:'blue'}]}>
    
                        </View>
                    </TabBarIOS.Item>
                    <TabBarIOS.Item
                        systemIcon="downloads"  // 系統圖標(downloads)
                    >
                        <View style={[styles.childViewStyle, {backgroundColor:'red'}]}>
    
                        </View>
                    </TabBarIOS.Item>
                    <TabBarIOS.Item
                        systemIcon="favorites"  // 系統圖標(favorites)
                    >
                        <View style={[styles.childViewStyle, {backgroundColor:'green'}]}>
    
                        </View>
                    </TabBarIOS.Item>
                    <TabBarIOS.Item
                        systemIcon="history"  // 系統圖標(history)
                    >
                        <View style={[styles.childViewStyle, {backgroundColor:'gray'}]}>
    
                        </View>
                    </TabBarIOS.Item>
                </TabBarIOS>
            </View>
        );
    }
    
    • 頁面之間的切換其實就是根據 selected 是否為 ture,以此決定是否重新渲染界面,涉及到重新渲染,所以肯定需要使用到 getInitialState(狀態機) ,具體操作如下
      • 首先我們定義一個初始化變數來確定要顯示的頁面


          getInitialState(){
              return{
                  selectedTabItem:0   // 預設變數,記錄當前點擊的item
              }
          },
      
      • 當我們點擊相應標簽的時候,系統就會調用 onPress 屬性來進行反饋
        • 首先點擊onPress的時候我們需要更新 狀態機 中預設變數的值


            onPress={() => {this.setState({selectedTabItem:0})}}
        
        • 接著我們要根據 預設變數 來判斷跳轉到哪個頁面(當預設變數的值改變後,狀態機會再次調用 render 函數進行渲染,也就會調用 TabBarIOS.Item 內的 selected 屬性)


            selected={this.state.selectedTabItem == 0}
        
        • 視圖部分完整代碼


            var TabBarIOSDemo = React.createClass({
        
                getInitialState(){
                    return{
                        selectedTabItem:0
                    }
                },
        
                render() {
                    return (
                        <View style={styles.container}>
                            <TabBarIOS
                                style={{height:49, width: width}}
                                tintColor="green"
                                barTintColor="black"
                                translucent={false}
                            >
                                <TabBarIOS.Item
                                    systemIcon="bookmarks"  // 系統圖標(bookmarks)
                                    onPress={() => {this.setState({selectedTabItem:0})}}
                                    selected={this.state.selectedTabItem == 0}
                                >
                                    <View style={[styles.childViewStyle, {backgroundColor:'yellow'}]}>
        
                                    </View>
                                </TabBarIOS.Item>
                                <TabBarIOS.Item
                                    systemIcon="contacts"  // 系統圖標(contacts)
                                    onPress={() => {this.setState({selectedTabItem:1})}}
                                    selected={this.state.selectedTabItem == 1}
                                >
                                    <View style={[styles.childViewStyle, {backgroundColor:'blue'}]}>
        
                                    </View>
                                </TabBarIOS.Item>
                                <TabBarIOS.Item
                                    systemIcon="downloads"  // 系統圖標(downloads)
                                    onPress={() => {this.setState({selectedTabItem:2})}}
                                    selected={this.state.selectedTabItem == 2}
                                >
                                    <View style={[styles.childViewStyle, {backgroundColor:'red'}]}>
        
                                    </View>
                                </TabBarIOS.Item>
                                <TabBarIOS.Item
                                    systemIcon="favorites"  // 系統圖標(favorites)
                                    onPress={() => {this.setState({selectedTabItem:3})}}
                                    selected={this.state.selectedTabItem == 3}
                                >
                                    <View style={[styles.childViewStyle, {backgroundColor:'green'}]}>
        
                                    </View>
                                </TabBarIOS.Item>
                                <TabBarIOS.Item
                                    systemIcon="history"  // 系統圖標(history)
                                    onPress={() => {this.setState({selectedTabItem:4})}}
                                    selected={this.state.selectedTabItem == 4}
                                >
                                    <View style={[styles.childViewStyle, {backgroundColor:'gray'}]}>
        
                                    </View>
                                </TabBarIOS.Item>
                            </TabBarIOS>
                        </View>
                    );
                }
            });
        
        效果:
        TabBarIOS頁面切換效果.gif
  • 到這裡,TabBarIOS頁面切換就完成了,當然實際開發中我們會抽取代碼,使代碼看起來不會這麼雜亂,這在後面會通過綜合項目進行講解

補充


  • 上面出現這樣的代碼,可能很多初學者不知道什麼意思,這邊就補充說明一下,在JS中是允許多個樣式通過數組的形式傳遞的,它會根據數組內容自動去解析需要的值,並根據優先順序去選擇優先選擇使用哪個屬性

    補充


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, mi ...
  • <!-- ////////////////////////// 請款列表模板 開始--><div id="rtlist-temple"> <div class="list-box m-top-20"> <div class="list-title font-size-26 clearfix"> <s ...
  • 優美整潔的代碼,基本都需要遵循以下的幾大基本原則. 1.單一職責原則SRP (Single Responsibility Principle) 類,模塊,方法應該有且僅有一條修改的理由.也就是說,其僅僅負責一個功能,只有這個功能發生變化時,才需要修改它. 舉個慄子:人類 有 吃飯的方法,那麼這個方法 ...
  • 說到RecyclerView,相信大家都不陌生,它是我們經典級ListView的升級版,升級後的RecyclerView展現了極大的靈活性。同時內部直接封裝了ViewHolder,不用我們自己定義ViewHolder就能實現item的回收和復用功能。當然它肯定不止這些好處,比如我們可以自定義分割線,... ...
  • 1、打開CornerStone,找到偏號設置,找到Subversion選項 2、去看“Use default global ignores”前面的“勾”,刪除".a" 3、github上搜索“gitignore”,找到"Objective-C.gitignore",打開,對照著添加 4、添加以下幾項 ...
  • 一、寫在最前面 本次,來介紹一下安卓中為控制項--Button綁定事件的五種方式。 二、具體的實現 第一種:直接綁定在Button控制項上: 步驟1.在Button控制項上設置android:onClick=",其中這個屬性的屬性值對應的是MainActivity類中的方法名字(自己創建的方法): 步驟2 ...
  • 項目中經常需要底部彈出框,這裡我整理一下其中我用的比較順手的一個方式(底部彈出一個橫向滿屏的dialog)。 效果圖如下所示(只顯示關鍵部分): 步驟如下所示: 1.定義一個dialog的佈局(lay_share.xml) 1 <?xml version="1.0" encoding="utf-8" ...
  • 多線程學習 每一個iOS應用(進程)運行都會有一個主線程(UI線程),UI上的更新推薦在主線程中去完成。多線程本身並不複雜,難點在於多個線程在其生命周期的管理,如線程的執行順序、線程間的數據共用以及資源競爭等問題。 本文主要記錄開發中常用的3種多線程模式: NSThread NSOperation ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...