Icon Ekleme-TabBar

React Native'de icon deyince akla gelen ilk kütüphane, react-native-vector-icons. Gerçekten harikulade bir kütüphane. react-native-navigation ile nasıl kullanılıyor bir bakalım.

Aşağıdaki komut ile indirelim.

npm install react-native-vector-icons --save

Sonra react-native link ile linkleme yapalım.

react-native link react-native-vector-icons

android/app/src/main/java/com/projenizin_ismi/MainApplication.java dosyasına gidelim ve VectorIconsPackage'i aşağıdaki set edelim.

...
import com.oblador.vectoricons.VectorIconsPackage;
...
public List<ReactPackage> createAdditionalReactPackages() {
return Arrays.<ReactPackage>asList(
  new VectorIconsPackage()
);
}
...

Bizim arkadaş listesini göreceğimiz bir FriendList.js isimli bir ekranımız ve mesajları görebieceğimiz ProfileScreen.js isimli bir componentimiz olsun.Ve aşağıdaki gibi register edelim.

// ./src/screen.js

import { Navigation } from 'react-native-navigation';
import FirstScreen from './FirstScreen';
import SecondScreen from './SecondScreen';
import FriendListScreen from './FriendListScreen';
import ProfileScreen from './ProfileScreen';

export function registerScreens() {
  Navigation.registerComponent('chatapp.FirstScreen', () => FirstScreen);
  Navigation.registerComponent('chatapp.SecondScreen', () => SecondScreen);
  Navigation.registerComponent('chatapp.FriendListScreen', () => FriendListScreen);
  Navigation.registerComponent('chatapp.ProfileScreen', () => ProfileScreen);
}

./src/index.ios.js dosyasına dönelim ve uygulamamızın başlangıç sayfasını bir tabBar'a dönüştürelim. Bunun için react-native-navigation'da Navigation.startTabBasedApp api'sini kullanacağız. Ama daha önce icon belirleyelim.FriendList için, IonicIcons'daki ios-people ve profil sayfası için ios-person iconlarını kullanalım. ./src/index.ios.js 'de App class'ımıza bir method ekleyelim adı populateIcons olsun.Bu bize Promise dönsün, Iconların yüklemesi tamamlandığında uygulamamız belirlediğimiz ilk ekrandan çalışmaya başlasın. Bunları yaptığımız aşğaıdaki kodu dikkatle lütfen inceleyin.

// ./src/index.ios.js

import { Navigation } from "react-native-navigation";
import { registerScreens } from "./screen";
import Icon from "react-native-vector-icons/Ionicons";

registerScreens();

export default class App {
  constructor() {
    this.populateIcons().then(() => {
      this.startApp();
    }).catch((error) => {
      console.error(error);
    });
  }

  populateIcons = function() {
    return new Promise(function(resolve, reject) {
      Promise.all([
        Icon.getImageSource("ios-people", 30),
        Icon.getImageSource("ios-people-outline", 30),
        Icon.getImageSource("ios-person", 30),
        Icon.getImageSource("ios-person-outline", 30)
      ])
        .then(values => {
          friendListIcon = values[0];
          friendListOutlineIcon = values[1];
          profileIcon = values[2];
          profileOutlineIcon = values[3];
          resolve(true);
        })
        .catch(error => {
          console.log(error);
          reject(error);
        })
        .done();
    });
  };

  startApp() {
    Navigation.startSingleScreenApp({
      screen: {
        screen: "chatapp.FirstScreen",
        title: "Chat App"
      }
    });
  }
}

Şimdi bir tek ekran olarak çalışan uygulamamızı, aşağıdaki gibi tabBar'a dönüştürelim.

// ./src/index.ios.js
...
  startApp() {
    Navigation.startTabBasedApp({
        tabs: [
          {
            label: 'Arkadaşlar',
            screen: 'chatapp.FriendListScreen',
            icon: friendListIcon,
            selectedIcon: friendListOutlineIcon,
            title: 'Arkadaşlarım'
          },
          {
            label: 'Profil',
            screen: 'chatapp.ProfileScreen',
            icon: profileIcon,
            selectedIcon: profileOutlineIcon,
            title: 'Profilim'
          }
        ]
      });;
  }
  ...

index.ios.js'de yazdığımız kodu index.android.js'e de kopyalayalım ve uygulamayı tekrardan iki emulatorde de çalıştıralım.

Android kullanıcıları çok ekranın altındaki tabBar'a alışkın değil o yüzden bunu TopTabBar yapalım. Bunun için index.android.js startApp fonksiyonunun aşağıdaki değiştirelim.

 // ./src/index.android.js

 startApp() {
    Navigation.startSingleScreenApp({
    screen: {
    screen: 'chatapp.FirstScreen',
    title:'Chat App',
    topTabs: [
      {
        screenId: 'chatapp.FriendListScreen',
        icon: friendListIcon,
      },
      {
        screenId: 'chatapp.ProfileScreen',
        icon: profileIcon,
      }
    ]
   }});
  }

Burada react-native-navigation yaratıcılarının hoşuna gitmeyen durum, topTabs kullanırken aslında chatapp.FirstScreen çok işe yaramaz halde fazladan yer alması. Bunu değiştirmeyi planlıyorlar ama şimdilik bun componenti biz tabBar'a style vermek için kullanabiliriz. O yüzden FirstScreen componentine aşağıdaki static style'ı tanımlayarak son hale bir bakalım.

// ./src/FirstScreen.js
import React, { Component } from "react";
import { View, Text, StyleSheet, TouchableOpacity,PixelRatio } from "react-native";

class FirstScreen extends Component {
  static navigatorStyle = {
    statusBarColor: '#1d84d6',

    navBarBackgroundColor: '#2196f3', // Top color
    navigationBarColor: '#1d84d6', // Bottom color
    navBarTextColor: '#ffffff', // Title color

    // Text
    topTabTextColor: 'rgba(255, 255, 255, 0.7)',
    selectedTopTabTextColor: '#ffffff',

    // Icons
    selectedTopTabIconColor: '#ffffff',
    topTabIconColor: 'rgba(255, 255, 255, 0.7)',

    selectedTopTabIndicatorColor: 'orange',
    selectedTopTabIndicatorHeight: PixelRatio.get() * 2,

    topTabScrollable: true,
  }
...

results matching ""

    No results matching ""