10
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

React NativeAdvent Calendar 2018

Day 9

【React Native】SafeAreaViewの色を上と下で違う色にする2つの方法

Last updated at Posted at 2018-12-05

初めに

どうも最近React Nativeでアプリを開発しているニーザです。
今日は、React NativeのSafeAreaViewのちょっとした技を紹介したいと思います。
おそらくiPhoneアプリを開発する上で、このように上の部分だけに色をつけてheaderとして、それ以外は違う色にしたい時がきっとありますよね?
通常何もせずにコンテンツをSafeAreaViewでラップするとこの様になってしまうと思います。

スクリーンショット 2018-12-05 19.01.11.png
App.js
import React, { Component } from 'react';
import { StyleSheet, Text, View, SafeAreaView } from 'react-native';

type Props = {};

export default class App extends Component<Props> {
  render() {
    return (
      <SafeAreaView style={styles.safeAreaView}>
        <View style={styles.container}>
          <Text>ほげほげ</Text>
        </View>
      </SafeAreaView>
    );
  }
}

const styles = StyleSheet.create({
  safeAreaView: {
    flex: 1,
    backgroundColor: '#1e90ff'
  },
  container: {
    flex: 1,
    backgroundColor: '#fff'
  },
});

この下の部分だけを白くするには2つ方法があります。

やり方1

下の部分にposition: absoluteを指定して隠す。

ステップ1. Viewを一つ、SafeAreaviewコンポーネントの子要素として作る。

App.js
export default class App extends Component<Props> {
  render() {
    return (
      <SafeAreaView style={styles.safeAreaView}>
        <View style={styles.container}>
          <Text>ほげほげ</Text>
        </View>
        <View style={styles.fixBottomColor} />
      </SafeAreaView>
    );
  }
}

ステップ2. 次のスタイルを指定する。

fixBottomColor: {
  backgroundColor: '#fff',
  position: 'absolute',
  bottom: 0,
  right: 0,
  left: 0,
  height: 100,
  zIndex: -10,
}

backgroundColorはcotainerと同じ色を指定しましょう!
これで完成です👏

これから追加したいコンポーネントと干渉を避けるために、z-indexに100を指定していますが、特には必要なくても隠せます。
簡単に実装できますが、追加したいコンポーネントと干渉するかもしれないところが少し傷ですね。

やり方2

SafeAreaViewを2つ作る。

ステップ1.外側をwrapするViewコンポーネントを用意する。

App.js
<View style={styles.outWrapper}>
  <SafeAreaView style={styles.safeAreaWrapper}>
    <View style={styles.container}>
      <Text>ほげほげ</Text>
    </View>
  </SafeAreaView>
</View>

ステップ2.SafeAreaViewをもう一つ作る。

App.js
<View style={styles.outWrapper}>
  <SafeAreaView style={styles.topSafeArea} />
  <SafeAreaView style={styles.safeAreaWrapper}>
    <View style={styles.container}>
      <Text>ほげほげ</Text>
    </View>
  </SafeAreaView>
</View>

ステップ3.Styleをそれぞれに当てる。

outWrapper: {
  flex: 1
},
topSafeArea: {
  backgroundColor: '#1e90ff'
},
safeAreaWrapper: {
  flex: 1,
  backgroundColor: '#fff'
},
container: {
  flex: 1,
  backgroundColor: '#fff'
},

表示したいコンポーネントをラップしているSafeAreaViewのスタイルに、cotainerと同じ色を指定しましょう!
これで完成です👏
このやり方は1番外側を更にラップしたり、SafeAreaを作ったりと手順が多く大変です。
ただ干渉する心配がないところがやり方1と比較して良いですね!

完成形

スクリーンショット 2018-12-05 19.40.12.png

終わりに

SafeAreaViewの色を上と下で違う色にする2つの方法を紹介しました。
どちらのやり方もメリットもデメリットもあるので甲乙つけがたいですね。
もっといいやり方を知っている場合は是非コメントで教えてください👍

10
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?