Site icon May's Notes

React Native 奇幻之旅(9)-狀態欄(Statusbar)

React Native logo

這是我在2023第十五屆 iThome 鐵人賽發表的系列文章。https://ithelp.ithome.com.tw/users/20136637/ironman/6408

這篇文章會介紹一些關於 StatusBar 的特性和使用方式。

Statusbar 的特性

基本用法

import React from 'react'
import { StatusBar, useColorScheme } from 'react-native'

import { Colors } from 'react-native/Libraries/NewAppScreen'

export const App = (): JSX.Element => {
  const isDarkMode = useColorScheme() === 'dark'

  const backgroundStyle = {
    backgroundColor: isDarkMode ? Colors.darker : Colors.lighter,
  }

  return (
    <>
      <StatusBar
        translucent={true}
        barStyle={isDarkMode ? 'light-content' : 'dark-content'}
        backgroundColor="transparent"
      />
      //...
    </>
  )
}

SafeAreaView

使用 SafeAreaView:

不使用 SafeAreaView:

import React from 'react'
import { StyleSheet, Text, SafeAreaView } from 'react-native'

const App = () => {
  return (
    <SafeAreaView style={styles.container}>
      <Text>Page content</Text>
    </SafeAreaView>
  )
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
  }
})

export default App

Android 內容跟 Statusbar 重疊

因為 Android 沒辦法使用 SafeAreaView,所以內容會和 Statusbar 重疊到:

對於這種情況,可以將 marginTop 設置為狀態欄的高度來避免組件渲染到狀態欄的位置。

import { StatusBar } from 'react-native'

const App = () => {
    return (
        <>
            <StatusBar
                barStyle="dark-content"
                translucent={true}
                backgroundColor="transparent"
            />
            <View style={{ marginTop: StatusBar.currentHeight ?? 0 }}>
                // ...
            </View>
        </>
    )
}

或者可以使用 react-native-safe-area-context 這個第三方庫提供的 SafeAreaView,支持 iOS 及 Android

參考資料

Exit mobile version