Full screen background image on loginscreen in React Native app - ios

I'm currently trying to set a full background image on my login view.
I've used the following code to do so but noticed that Iphone 11 have like a white bar at the bottom and top of the phone. Is this something that can't be overlapped since it's like the navigation?
const Background = styled.ImageBackground`
padding:20px;
justify-content:center;
width:100%;
height:100%;
`
const styles = StyleSheet.create({
container: {
flex: 1,
},
});
enter image description here
return <SafeAreaView style={styles.container}><Background source={require('../../assets/images/background-cover.jpg')}>
<CoverLogo width={100} height={100} color={Colors.White} />
<Introduction loop={false}>
<TextHeading text={`#test`} />
<TextPage text={`Btest2`} />
<TextPage text={`Ttest3`} />
<TextPage text={`test4 Sign up !`} />
</Background>
</SafeAreaView>

I'm not sure if this will help with the bottom of the screen, but for the top you can try and set your header style in navigationOptions like so if using react navigation
headerStyle: {
backgroundColor: 'transparent',
position: 'absolute',
top: 0,
left: 0,
right: 0,
borderBottomWidth: 0 // removes the border on the bottom
}
If you follow the SafeArea advice also given in the other answer, then this may be of help too https://reactnavigation.org/docs/handling-safe-area/

Try using :
SafeArea as a parent view, with flex:1
Or maybe have a function to check for iPhone 11/ iPhoneX like that:
isIphoneX: () => {
const dimen = Dimensions.get('window');
const deviceModel = DeviceInfo.getModel();
return (
deviceModel === 'iPhone X' ||
(Platform.OS === 'ios' &&
!Platform.isPad &&
!Platform.isTVOS &&
(dimen.height === 812 ||
dimen.width === 812 ||
dimen.height === 896 ||
dimen.width === 896))
);
},
iPhones Specs

your issue lies in your use of
<SafeAreaView> tag which limits the use of the screen space in ios devices below the notch and just above the lower edge of the screen. The use of SafeAreaView is only visible in the effects only on ios devices.
To resolve your issue I would suggest using the tag <View> instead of <SafeAreaView>

Related

#capacitor-community/barcode-scanner wrongly calculate height on different iphones

I want to build BarCode scanner with #capacitor-community/barcode-scanner, On Android it looks totally fine, it calculate proper height of the screen and put overlay button on the bottom of the page. With Iphones it doesn't work like that, each iphone shows button in other place, I tested it on iphone 8,11 and 13. On Iphone 8 button is visible on the bottom but you can see that it is cut and it is possible to scroll down, on iphone11 it is barely visible and on iphone13 it is not visible at all. Anybody knows how to set overlay button to be totally on the bottom of the page without need to scroll down?
{isScanningInProgress ? (
<>
<StyledStopScanBox>
<Button color="primary" variant="contained" size="large" onClick={stopScan}>
Stop Scan
</Button>
</StyledStopScanBox>
</>
) : (
...
)
const StyledStopScanBox = styled(Box)(({ theme }) => ({
display: 'flex',
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'center',
position: 'absolute',
width: '100%',
top: 'calc(100vh - 75px)',
zIndex: 3,
height: 75,
backgroundColor: theme.palette.background.default
}));

How to stretch component to fullscreen, even notch in reactnative

https://imgur.com/a/c6wxosN
Hi, can somebody help me, how to stretch component all over iPhone screen, even notch? If you look at that image, I would like to have it even, where clock and battery icons are.
I've already tried to use SafeAreaView, but it didn't work.
const { isLoading, loadingError } = this.state;
return (
<View style={styles.container}>
{isLoading && this.renderLoading()}
{
loadingError
? this.renderLoadingError()
: <WebView
style={styles.radar}
onLoad={this.onLoaded}
onLoadStart={this.loadingStarted}
onLoadEnd={this.onLoadFinished}
onError={this.onError}
source={{ uri: this.props.radarUrl }}
/>
}
</View>
);
}
Thank you in advice!

React native disable auto rotate [duplicate]

This question already has answers here:
how to disable rotation in React Native?
(12 answers)
Closed 3 years ago.
I need to disable auto rotation feature in react-native application.
The application should support portrait and landscape orientation but the user should can`t rotation screen. Now I have used react-native-orientation but this module only checked orientation and change it to necessary value.
So I need rotate screen only programmatically.
RN Version: 0.33
You can set your Xcode Device Orientation
Set in your android manifest file:
android:screenOrientation="portrait"
Or You can set it using Dimensions. Something like this:
Dimensions.addEventListener('change', ({ window: { width, height } }) => {
const orientation = width > height ? 'LANDSCAPE' : 'PORTRAIT';
}
Or you can use react-native-orientation to lock the screen on portrait or landscape just as you need. I have a working example in my github: https://github.com/soutot/react-native-orientation-test
class App extends Component {
componentDidMount() {
Orientation.lockToLandscape();
}
render() {
return(
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center'}}>
<Text>This is my content</Text>
</View>
);
}
}
Hope it helps

How to prevent layout from overlapping with iOS status bar

I am working on tutorial for React Native navigation. I found out that all layout starts loading from top of screen instead of below of the status bar. This causes most layouts to overlap with the status bar. I can fix this by adding a padding to the view when loading them. Is this the actual way to do it? I don' think manually adding padding is an actual way to solve it. Is there a more elegant way to fix this?
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>
)
}
}
Below shows the screenshots before and after the padding is added.
Now you can use SafeAreaView which is included in React Navigation:
<SafeAreaView>
... your content ...
</SafeAreaView>
There is a very simple way to fix this. Make a component.
You can create a StatusBar component and call it first after the first view wrapper in your parent components.
Here is the code for the one I use:
'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
After doing this and exporting it to your main component, call it like this:
import StatusBarBackground from './YourPath/StatusBarBackground'
export default class MyScene extends Component {
render(){
return(
<View>
<StatusBarBackground style={{backgroundColor:'midnightblue'}}/>
</View>
)
}
}
I tried a more simple way for this.
We can get the height of Status Bar on android and use SafeAreaView along with it to make the code work on both platforms.
import { SafeAreaView, StatusBar, Platform } from 'react-native';
If we log out Platform.OS and StatusBar.currentHeight we get the logs,
console.log('Height on: ', Platform.OS, StatusBar.currentHeight);
Height on: android 24 and
Height on: android 24
We can now optionally add margin/padding to our container view using
paddingTop: Platform.OS === "android" ? StatusBar.currentHeight : 0
The final code in App.js is below:
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
}
});
#philipheinser solution does work indeed.
However, I would expect that React Native's StatusBar component will handle that for us.
It doesn't, unfortunately, but we can abstract that away quite easily by creating our own component around it:
./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>
)
}
Before:
After:
The react-navigation docs have a great solution for this. First off, they recommend not to use the SafeAreaView included with React Native because:
While React Native exports a SafeAreaView component, it has some
inherent issues, i.e. if a screen containing safe area is animating,
it causes jumpy behavior. In addition, this component only supports
iOS 10+ with no support for older iOS versions or Android. We
recommend to use the react-native-safe-area-context library to handle
safe areas in a more reliable way.
Instead, they recommend react-native-safe-area-context - with which it would look like this:
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>
)
}
I would like to note that it's probably a better idea to use the SafeAreaView that this library offers though, since phones these days may also have elements at the bottom that can overlap UI elements. It all depends on your app of course. (For more detail on that, see the react-navigation docs I linked to in the beginning.)
Here is a way that works for iOS:
<View style={{height: 20, backgroundColor: 'white', marginTop: -20, zIndex: 2}}>
<StatusBar barStyle="dark-content"/></View>
You can handle this by adding a padding to you navigation bar component or just ad a view that has the same hight as the statusbar at the top of your view tree with a backgroundcolor like the facebook app does this.
Just Simple User React native Default StatusBar to achieve this funcationality.
<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>
If you combine SaveAreaView and StatusBar, you get it.
https://reactnative.dev/docs/statusbar
https://reactnative.dev/docs/safeareaview
Just do this:
<SafeAreaView>
<View style={{flex: 1}}>
<StatusBar translucent={false} backgroundColor="#fff" />
// Your dark magic here
</View>
</SafeAreaView>
[This answer is applicable to Android emulators]
Hi, I have imported status bar from "react-native" and called it at the end of block with status bar style set to auto and it worked for me, the code below is for reference:
import { SafeAreaView,Button, StyleSheet, Text, TextInput, View } from 'react-native';
import { StatusBar } from 'react-native';
export default function App() {
return (
<SafeAreaView style={styles.appContainer}>
<View >
<TextInput placeholder='Add your course goal' />
<Button title="Add Goals" />
</View>
<View>
<Text>List of goals..</Text>
</View>
<StatusBar style="auto" />
</SafeAreaView>
);
}

how to flip from bottom an iOS view with appcelerator

I have an application which displays a view inside another view with appcelerator 5.1.2.
I want to animate the view to appear from bottom when opened, but could not figure out how to do it.
I have already done the exact opposite which is to make it disappear to bottom. Here is the code :
function closeViewFromBottom(animationView) {
var newtop = Ti.Platform.displayCaps.platformHeight + 20;
animationView.animate({
top:newtop,
duration:1000,
autoreverse: false
});
};
You can set the start top value to platformHeight and then animate top to 0. Also set the height of that view to platformHeight. For iOS you can also set the outer-view clipMode to Titanium.UI.iOS.CLIP_MODE_ENABLED
Edit: full example
index.tss
"Window": {
backgroundColor: "#fff"
}
"#view":{
backgroundColor: "red",
width:Ti.UI.FILL,
height:Ti.UI.FILL,
}
index.xml
<Alloy>
<Window >
<View id="view"/>
<Button id="btn" title="show view"/>
</Window>
</Alloy>
index.js
$.view.top = Ti.Platform.displayCaps.platformHeight;
function openViewFromBottom(animationView) {
animationView.top = Ti.Platform.displayCaps.platformHeight;
animationView.animate({
top:0,
duration:1000
});
};
function onClickButton(e){
openViewFromBottom($.view);
}
$.btn.addEventListener("click",onClickButton);
$.index.open();

Resources