IOS स्थिति पट्टी के साथ ओवरलैपिंग से लेआउट को कैसे रोकें


81

मैं रिएक्टिव नेटिव नेविगेशन के लिए ट्यूटोरियल पर काम कर रहा हूं । मुझे पता चला कि सभी लेआउट स्टेटस बार के नीचे स्क्रीन के ऊपर से लोड होने लगते हैं। यह अधिकांश लेआउट को स्टेटस बार के साथ ओवरलैप करने का कारण बनता है। मैं उन्हें लोड करते समय दृश्य में एक पैडिंग जोड़कर इसे ठीक कर सकता हूं। क्या ऐसा करने का वास्तविक तरीका है? मुझे नहीं लगता कि मैन्युअल रूप से पैडिंग जोड़ना इसे हल करने का एक वास्तविक तरीका है। क्या इसे ठीक करने का अधिक सुरुचिपूर्ण तरीका है?

import React, { Component } from 'react';
import { View, Text, Navigator } from 'react-native';

export default class MyScene extends Component {
    static get defaultProps() {
            return {
                    title : 'MyScene'    
            };  
    }   
    render() {
            return (
                    <View style={{padding: 20}}> //padding to prevent overlap
                            <Text>Hi! My name is {this.props.title}.</Text>
                    </View> 
            )   
    }    
}

नीचे पैडिंग जोड़े जाने से पहले और बाद के स्क्रीनशॉट दिखाए जाते हैं। यहाँ छवि विवरण दर्ज करें


13
अच्छा सवाल है, लेकिन शायद आप छवियों को ट्रिम कर सकते हैं।
Quv

stackoverflow.com/a/39300715/1540350 <- यह उत्तर न केवल यहां बताई गई समस्या को ठीक करेगा, बल्कि आपको आईओएस और एंड्रॉइड में स्टेटस बार की पृष्ठभूमि को रंग देने की संभावना भी देगा।
मार्टिन ब्रौन

जवाबों:


36

इसे ठीक करने का एक बहुत ही सरल तरीका है। एक घटक बनाओ।

आप एक StatusBar घटक बना सकते हैं और इसे अपने मूल घटकों में पहले दृश्य आवरण के बाद कॉल कर सकते हैं।

यहाँ मैं उपयोग करने वाले के लिए कोड है:

'use strict'
import React, {Component} from 'react';
import {View, Text, StyleSheet, Platform} from 'react-native';

class StatusBarBackground extends Component{
  render(){
    return(
      <View style={[styles.statusBarBackground, this.props.style || {}]}> //This part is just so you can change the color of the status bar from the parents by passing it as a prop
      </View>
    );
  }
}

const styles = StyleSheet.create({
  statusBarBackground: {
    height: (Platform.OS === 'ios') ? 18 : 0, //this is just to test if the platform is iOS to give it a height of 18, else, no height (Android apps have their own status bar)
    backgroundColor: "white",
  }

})

module.exports= StatusBarBackground

ऐसा करने के बाद और इसे अपने मुख्य घटक पर निर्यात करें, इसे इस तरह से कॉल करें:

import StatusBarBackground from './YourPath/StatusBarBackground'

export default class MyScene extends Component {
  render(){
    return(
      <View>
        <StatusBarBackground style={{backgroundColor:'midnightblue'}}/>
      </View>
    )
  }
}

 


MidnightBlueगैरकानूनी है, जिसे रिएक्टिव नेटिव द्वारा बताया गया है: चेतावनी: विफल प्रोप प्रकार: अमान्य प्रोपर backgroundColorसप्लाई
रैप्टर

2
यह होना चाहिए midnightblue
bblincoe

19
IOS स्टेटस बार एक फिक्स आकार नहीं है। यह वाईफ़ाई साझा करते समय या कॉल में बड़ा हो सकता है।
edA-qa mort-ora-y

1
Redux के साथ रिएक्ट नेविगेशन हुकअप का उपयोग करते समय मैं इसका उपयोग कैसे करता हूं, सभी पृष्ठ या तो स्टैक नेविगेटर या टैब नेविगेटर (नेस्टेड) ​​में होते हैं और हुक के साथ redux
यासिर

5
यदि आप प्रतिक्रिया मूल घटक "StatusBar" आयात करते हैं और फिर उपयोग करते हैं: तो height: (Platform.OS === 'ios') ? 20 : StatusBar.currentHeight,इसके बजाय ? 20 : 0,आपको एंड्रॉइड पर एक ही परिणाम मिलता है।
mrroot5

60

अब आप उपयोग कर सकते हैं SafeAreaViewजो रिएक्ट नेविगेशन में शामिल है:

<SafeAreaView>
    ... your content ...
</SafeAreaView>

3
यह नोट करना अच्छा होगा कि यह घटक react-navigationअब डिफ़ॉल्ट रूप से शामिल है ।
Aᴄʜᴇʀᴏɴғᴀɪʟ

15
यह स्टेटस बार ओवरलैप के मुद्दे को हल नहीं करता है - मैंने अपने ऐप को SafeAreaView में लपेटा है और मेरा ऐप अभी भी स्टेटसबार को ओवरलैप करता है। यह iPhone X पायदान / गोल कोनों की स्थिति के लिए तैयार किया गया लगता है
izikandrw

आप इसमें अपना ऐप नहीं लपेटते हैं, आप इसमें स्क्रीन लपेटते हैं।
ग्रेग एनिस

ओह, यह अच्छा है! मुझे वो वाला पसंद आया।
आसफ काटज़

1
@AndreFigueiredo सही नहीं है। सभी iPhone उपकरणों पर ठीक काम करता है, जब तक कि यह iOS 11 है
फेलो स्ट्रेंजर

20

मैंने इसके लिए और सरल तरीका आजमाया।

हम एंड्रॉइड पर स्टेटस बार की ऊंचाई प्राप्त कर सकते हैं और दोनों प्लेटफार्मों पर कोड काम करने के लिए इसके साथ SafeAreaView का उपयोग कर सकते हैं।

import { SafeAreaView, StatusBar, Platform } from 'react-native';

यदि हम लॉग आउट करते हैं Platform.OSऔर StatusBar.currentHeightहमें लॉग मिलते हैं,

console.log('Height on: ', Platform.OS, StatusBar.currentHeight);

ऊँचाई: Android 24 और ऊँचाई: Android 24

अब हम वैकल्पिक रूप से अपने कंटेनर दृश्य का उपयोग करके मार्जिन / पैडिंग जोड़ सकते हैं

paddingTop: Platform.OS === "android" ? StatusBar.currentHeight : 0

App.js में अंतिम कोड नीचे है:

export default class App extends React.Component {
  render() {
    return (
      <SafeAreaView style={{ flex: 1, backgroundColor: "#fff" }}>
        <View style={styles.container}>
          <Text>Hello World</Text>
        </View>
      </SafeAreaView>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: "#fff",
    paddingTop: Platform.OS === "android" ? StatusBar.currentHeight : 0
  }
});

1
मैंने इसे एंड्रॉइड पर आज़माया और यह काम कर रहा है। मैं अभी तक iOS पर इसका परीक्षण नहीं कर सकता, लेकिन जैसा कि मुझे पता है कि iOS पर SafeArea क्या है, मुझे पूरा यकीन है कि इसे भी काम करना चाहिए।
मैनुअलविल्डनर

1
*** इसे स्वीकृत उत्तर पर सेट किया जाना चाहिए *** यहां अन्य समाधान अपनी स्वयं की एकल परीक्षण स्थिति के आधार पर मनमानी निश्चित ऊंचाइयां प्रदान करते हैं
mcmonkeys1

एक सही जवाब लेकिन SafeAreaView iPhone उपकरणों के लिए 11 से नीचे के संस्करण के साथ लागू नहीं है
प्रदीप

ठीक काम किया। धन्यवाद!
bruxo00

16

@philipheinser समाधान वास्तव में काम करता है।

हालाँकि, मुझे उम्मीद है कि रिएक्ट नेटिव के स्टेटसबार घटक को हमारे लिए संभाल लेंगे।

यह दुर्भाग्य से नहीं है, लेकिन हम इसे आसानी से दूर कर सकते हैं कि इसके चारों ओर अपना खुद का घटक बनाकर आसानी से:

./StatusBar.js

import React from 'react';
import { View, StatusBar, Platform } from 'react-native';

// here, we add the spacing for iOS
// and pass the rest of the props to React Native's StatusBar

export default function (props) {
    const height = (Platform.OS === 'ios') ? 20 : 0;
    const { backgroundColor } = props;

    return (
        <View style={{ height, backgroundColor }}>
            <StatusBar { ...props } />
        </View>
    );
}

./index.js

import React from 'react';
import { View } from 'react-native';

import StatusBar from './StatusBar';

export default function App () {
    return (
      <View>
        <StatusBar backgroundColor="#2EBD6B" barStyle="light-content" />
        { /* rest of our app */ }
      </View>
    )
}
इससे पहले:

उपरांत:


4

react-navigationडॉक्स इस के लिए एक महान समाधान है। सबसे पहले, वे प्रतिक्रियाशील मूल के साथ शामिल का उपयोग करने की सलाह देते हैंSafeAreaView क्योंकि:

जबकि रिएक्टिव नेटिव एक सेफअरेव्यू घटक का निर्यात करता है, इसके कुछ अंतर्निहित मुद्दे हैं, अर्थात यदि सुरक्षित क्षेत्र वाली स्क्रीन एनिमेटेड है, तो यह उछल-कूद का कारण बनता है। इसके अलावा, यह घटक पुराने iOS संस्करणों या Android के लिए बिना किसी समर्थन के केवल iOS 10+ का समर्थन करता है। हम सुरक्षित क्षेत्रों को अधिक विश्वसनीय तरीके से संभालने के लिए प्रतिक्रिया-देशी-सुरक्षित-क्षेत्र-संदर्भ पुस्तकालय का उपयोग करने की सलाह देते हैं।

इसके बजाय, वे प्रतिक्रिया-मूल-सुरक्षित-क्षेत्र-संदर्भ की अनुशंसा करते हैं - जिसके साथ यह इस तरह दिखेगा:

import React, { Component } from 'react';
import { View, Text, Navigator } from 'react-native';
import { useSafeArea } from 'react-native-safe-area-context';

export default function MyScene({title = 'MyScene'}) {
    const insets = useSafeArea();

    return (
        <View style={{paddingTop: insets.top}}>
            <Text>Hi! My name is {title}.</Text>
        </View> 
    )   
}

मैं यह नोट करना चाहूंगा SafeAreaViewकि यह लाइब्रेरी का उपयोग करने के लिए शायद यह एक बेहतर विचार है कि हालांकि, इन दिनों फोन में नीचे के तत्व भी हो सकते हैं जो UI तत्वों को ओवरलैप कर सकते हैं। यह सब आपके ऐप के पाठ्यक्रम पर निर्भर करता है। (उस पर अधिक विवरण के लिए, react-navigationडॉक्स मैं शुरुआत में जुड़ा हुआ देखें ।)


2

यहाँ एक तरीका है जो iOS के लिए काम करता है :

<View style={{height: 20, backgroundColor: 'white', marginTop: -20, zIndex: 2}}>
   <StatusBar barStyle="dark-content"/></View>

1

आप इसे नेविगेशन बार घटक में एक पैडिंग जोड़कर संभाल सकते हैं या बस एक दृश्य को देख सकते हैं जिसमें आपके दृश्य पेड़ के शीर्ष पर स्थित स्थिति पट्टी के समान हाइट है, जैसे कि बैकग्राउंडर के साथ फेसबुक ऐप ऐसा करता है।


6
क्या वह ऊँचाई मूल्य निश्चित है और इससे कोई फर्क नहीं पड़ता कि आपके पास क्या फोन है? यदि हां, तो मुझे iOS / Android के लिए सही विशिष्ट मूल्य के बारे में जानकारी कहां मिल सकती है?
nbkhope

0

इस सरलता को प्राप्त करने के लिए सिंपल यूजर रिएक्ट देशी डिफ़ॉल्ट स्टेटसबार।

<View style={styles.container}>
    <StatusBar backgroundColor={Color.TRANSPARENT} translucent={true} />
    <MapView
      provider={PROVIDER_GOOGLE} // remove if not using Google Maps
      style={styles.map}
      region={{
        latitude: 37.78825,
        longitude: -122.4324,
        latitudeDelta: 0.015,
        longitudeDelta: 0.0121,
      }}
    />
  </View>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.