ããã«ã¡ã¯ ïŒ
Androidã§å°ãåé¡ããããŸããGestureHandlerã³ã³ããŒãã³ããAndroidã®ã¢ãŒãã«äžã«ããå Žåã onGestureEvent
ã¯ããªã¬ãŒãããŸããã ã¢ãŒãã«ããã¥ãŒã«å€æŽãããšãå®å
šã«æ©èœããŸãð
iOSã§ã¯åé¡ãããŸãã
+1
åé¿çã¯ãããŸããïŒ
ä»ã®ãšããã¢ãŒãã«ã¯äœ¿çšããŠããŸããã絶察äœçœ®ã®ãã¥ãŒã§åäœæããã ãã§ãã
ä»ã®ãšããã¢ãŒãã«ã¹ã¯ãªãŒã³ã䜿çšããŠãã°ãŒã°ã«ãšãã£ããã®åŸãRNã®ã¢ãŒãã«ã¯ãã°ãå€ããããšèããŸãã
+1
ããã«ã¡ã¯ã @ martinezguillaume ã @ mordaha ã@ csto
ç§ã¯ãã®åé¡ã調ã¹ãŸããããããã¯ç§ãã¡ã®ã©ã€ãã©ãªã®åé¡ã§ã¯ãªããRNã³ã¢ã®åé¡ã ãšæããŸãã
@osdnkããã¯
+1ãžã§ã¹ãã£ã¯ã¢ãŒãã«ã§ã¯æ©èœããŸãã
ä»æ¥ããã®ãã°ã«ééããŸããã
åãåé¡ã ãžã§ã¹ãã£ãŒã¯Androidã®ã¢ãŒãã«ã§ã¯æ©èœããŸããã
ããšãã°äžå
ããããã ãã¹ãæžã¿ã®react-nativeã®ã¢ãŒãã«ã§ã®PanResponderãã³ãã©ãŒã¯æ£åžžã«åäœããŸãã
ç§ã¯ããã«ã€ããŠèããŠããŸãïŒãã®ã©ã€ãã©ãªãAndroidãããžã§ã¯ãã«ãªã³ã¯ãããšãã次ã®ã¹ããããå®è¡ããŠããŸã
<strong i="7">@Override</strong>
protected ReactRootView createRootView() {
return new RNGestureHandlerEnabledRootView(MainActivity.this);
}
ãããŠãã¢ãŒãã«ã¯å¥ã®ããã±ãŒãžã§ããããšãç§ãã¡ã¯ç¥ã£ãŠããŸãã ãããšåãããšãããæå³ãããã®ã§ããããïŒ
æšæºã®ReactNative Modal
ã䜿çšããŠããŠããã®åé¡ãçºçããŠããŸããã
æ°ããç»é¢ãäœæãããããã¢ãŒãã«ãšããŠè¡šç€ºããããšã§ããã®åé¡ãåé¿ããŸããã ç§ã¯react-native-navigationã䜿çšããŠããã®ã§ã次ã®ããã«ãªããŸãã
Navigation.showModal({
component: {
name: navRoutes.ImageModal,
passProps: { image },
},
})
ãžã§ã¹ãã£ã¯iOSãšAndroidã®äž¡æ¹ã§æåŸ ã©ããã«æ©èœããŸãããå ã®ã¢ãŒãã«ããå¿ èŠãªéæãªèæ¯ãåŸãããŸãã
ç§ã¯ãã°ãããããæãäžããŸããã
誰ãããããæãã§ããŠããããããæéãããã°ãç§ã¯ãããåãã§ã¬ãã¥ãŒãããããå®è¡å¯èœã§ããããŒãããªãã®ã§ããã°ããã«ããŒãžããŸãã
@martinezguillaume @mordaha @csto @ mars-lan @ParhamZare @ewendel @ Via-profit @Dmitrylolo @LaVielle
ãŸãã2ã¶æåã«è©ŠããŠã¿ãŸããã
å€åããã¯èª°ãã®ããã®ã€ã³ã¹ãã¬ãŒã·ã§ã³ãããããŸããð€·ââïž
ãã@osdnkã¢ããªã«ãã®æ©èœãå¿
èŠãªã®ã§ãè©ŠããŠã¿ãããšæã£ãŠããŸããããRNGestureHandlerãAndroidã®çµéšã¯ããŸããããŸããã ãããæ©èœãããããã«ç§ãäœãããå¿
èŠããããã«ã€ããŠãããå°ãæŽå¯ãããã ããŸããïŒ
ãŸããããªãã®ååã®è©Šã¿ãèŠãŠããŸãããããããå®æãããããã«äœãæ¬ ããŠããã®ãããããŠãããåºçºç¹ãšããŠäœ¿çšã§ãããã©ãããç¥ããããšæããŸãã
åããšã©ãŒã
@kmagiera @osdnkããã«é¢ããæŽæ°ã¯ãããŸããïŒ
Touchable*
ãããã¢ãŒãã«å
ã§ã¯æ©èœãããããã¯ã€ã©ã€ã©ããŸã
+1ã ç§ã¯ã¢ãŒãã«ã§èçãããããã ã·ãŒãã䜿çšããŸã
æŽæ°ã¯ãããŸããïŒ ãŸãã¯ãããããããã®åé¡ã«æ©ãŸãããŠããªãä»ã®ã¢ãŒãã«ã³ã³ããŒãã³ãã¯ãããŸããïŒ RNã®ã¢ãŒãã«ã¯æ£çŽãªãšããéåžžã«æªãããã«æ©èœãããã°ããããããããŸãïŒã¢ã©ãŒããšçµã¿åããããšã¹ã¿ãã¯ãããªã©ïŒ
@cristianoccazinspç§ã¯https://github.com/react-native-community/react-native-modalã䜿çšããããšã«ãªããŸãã
å¥åŠãªã ãã®ã³ã³ããŒãã³ãã¯ãå
éšã§reactã®ã¢ãŒãã«ã䜿çšããããšã«ãªã£ãŠããŸãã ããããã£ã
ããªãã«éãããããããŸããïŒ
ãšã«JUEãã30ãããšã2019ååŸ02æ38åãç«æã©ã³[email protected]
escribióïŒ
@cristianoccazinsphttps ïŒ//github.com/cristianoccazinspç§ã¯çµå±
https://github.com/react-native-community/react-native-modalã䜿çšããâ
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/kmagiera/react-native-gesture-handler/issues/139?email_source=notifications&email_token=ALU263ACF3LNSRSPFWR45ELPYAGJTA5CNFSM4EZ6UZL2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNM
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/ALU263GRH2KHBXUZBGHNKA3PYAGJTANCNFSM4EZ6UZLQ
ã
@cristianoccazinspç»é¢ãã«ããŒããããã«RNã®ã¢ãŒãã«ã®ã¿ã䜿çšããŸããããã¯ã coverScreen
ãfalse
èšå®ããããšã§ç¡å¹ã«ã§ããŸãã
@cristianoccazinspç»é¢ãã«ããŒããããã«RNã®ã¢ãŒãã«ã®ã¿ã䜿çšããŸããããã¯ã
coverScreen
ãfalse
èšå®ããããšã§ç¡å¹ã«ã§ããŸãã
ããããã¢ããªã®ã«ãŒãã³ã³ããŒãã³ãã§ã¬ã³ããªã³ã°ãããŠããªããã®å°éå ·ã§ãã«ã¹ã¯ãªãŒã³ã¢ãŒãã«ã衚瀺ããæ¹æ³ã¯ãããŸããïŒ
@jvaclavik https://github.com/callstack/react-native-paperãšçµã¿åãããŠäœ¿çšââããŸãããããã«ã¯ããã®ç®çã®ããã«ç¹å¥ã«èšèšãããããŒã¿ã«ãšåŒã°ããã³ã³ããŒãã³ãããããŸãã
ããã§ãã¹ãŠã®ãŠãŒã¹ã±ãŒã¹ã解決ãããããã§ã¯ãããŸããããprop propagateSwipe
ãtrueã«èšå®ãããšãReactNativeã¢ãŒãã«ã§ãžã§ã¹ãã£ãŒãæå¹ã«ã§ããŸãã
ãã®åé¡ã¯https://github.com/kmagiera/react-native-screens/issues/61ã«é¢é£ããŠããããã§ã
Androidã§ã¯reactNativeç»é¢ã䜿çšããªãã§ãã ããã 'reanimated-bottom-sheet'ã§ãã¹ããããæ£åžžã«åäœããŠããŸã
ifïŒPlatform.OS === 'ios'ïŒ{
useScreensïŒïŒ;
}
ééçãªbgã®ãã®Reactããã²ãŒã·ã§ã³ã¢ãŒãã«èšå®ã¯
ScreenOneïŒ{
ç»é¢ïŒScreenOneã
ããã²ãŒã·ã§ã³ãªãã·ã§ã³ïŒ{
ãžã§ã¹ãã£ãŒæå¹ïŒfalse
}ã
}
{{
ã¢ãŒãïŒ 'ã¢ãŒãã«'ã
éæã«ãŒãïŒtrueã
headerModeïŒ 'none'ã
cardStyleïŒ{
backgroundColorïŒ 'éæ'ã
äžéæ床ïŒ1
}ã
transitionConfigïŒïŒïŒ=>ïŒ{
containerStyleïŒ{
backgroundColorïŒ 'éæ'ã
}
}ïŒ
}
@osdnkã¯ãããä¿®æ£ããŸãããïŒ
ããã¯ãšãŠãèŠçã§ããã
ç§ã¯ãããã°ãŒã°ã«ã§è§£æ±ºããåã«ãã°ããæéãè²»ãããŸããããªãå°çäžã§åãã³ã³ããŒãã³ããiOSãšAndroidã§åäœããã®ããç解ããããšããŠããŸãããã¢ããªã±ãŒã·ã§ã³å
ã®ããã€ãã®å Žæã§ã®ã¿åäœããŸã
åãåé¡ããããŸã-ã¢ãŒãã«ã§ã¯æ©èœããŸããã
誰ããããã«åãçµãã§ããã®ããã¹ããŒã¿ã¹ã®æŽæ°ãç¥ã£ãŠããã®ã ãããïŒ
ãã®ã©ã€ãã©ãªãåé€ããŠRNãã³ãã³ãã©ãŒã«åãæ¿ããå¿
èŠããããŸããïŒ
ãªã«ãææ¡ã ïŒ
https://github.com/react-native-community/react-native-modalãæ©èœããŸãã
ãã£ã¡ãäžç·ã RectButtonã¯https://github.com/react-native-community/react-native-modalå ã§ã¯æ©èœããŸãã
@deflorilemarului @ kesha-antonov @fauker
ãã©ã¡ããããªãã«ããã€ãã®æéãæããŸãŸãModal
ããModal
ããããåºã¥ããŠãã-圌ãã¯ãã€ãã£ãã®äŸåé¢ä¿ããªã³ã¯ããå¿
èŠããªãå Žåã¯ãããŒã¹ã®ããã±ãŒãžïŒ react-native
ã®Modal
ïŒã圹ã«ç«ã¡ãŸãïŒåºæ¬çã«ã¯ãã¹ãŠè©ŠããŸããïŒã
gesture-
é¢é£ãããã¹ãŠã®ã³ã³ããŒãã³ãïŒããã ã·ãŒã-ç§ãã¡ã®åäœïŒã¯ãAndroidã®<Modal>...</Modal>
å
ã«ã¬ã³ããªã³ã°ããããšãã«ãã¿ãã/ã¹ã¯ã€ããªã©ãç»é²ããŸããã
ç§ãèããããšãã§ãã3ã€ã®è§£æ±ºçããããŸãïŒ
PanResponder
æžãçŽãå¿
èŠãããå ŽåããããŸãã ããã¯èŠçã§ãããããªãç°¡åã§ããportals
ã¢ãŒãã«ã䜿çšããŸãã ãããã¯å®éã«ã¯ããŒã¿ã«ã§ãã¢ãŒãã«ã§ããããŸãã-ããŒã¿ã«ã¯åäžã®ã¢ããªã±ãŒã·ã§ã³ãã¹ããããããreact-nativeã§ãµããŒããããŠããŸãã-ãããããã¹ãã³ã³ããŒãã³ããã¢ããªã±ãŒã·ã§ã³ã®ã©ããã«é
眮ããã¢ãŒãã«ã³ã³ãã³ããã¢ããªã¹ã¿ãã¯ã®äžã®çµ¶å¯Ÿãã¥ãŒã§ã¬ã³ããªã³ã°ããããšã§æ©èœããŸãã ããã¯æ©èœãããœãªã¥ãŒã·ã§ã³ã§ãããåãã³ã³ããã¹ããããã€ããŒã®äžã«ã¬ã³ããªã³ã°ãããããã useContext()
åŒã³åºãã倱ãããŸãã navigation
ã³ã³ããã¹ãã倱ããããããæ©èœããŸãããreact-navigation
ïŒ; ããã¯æ©èœããŸãããAPIã¯...è¯ããããŸãã-åäžã®ç»é¢ãã¢ãŒãã«ã«ããããšãã§ããªãã£ãå Žåãã¹ã¿ãã¯ã®ã¿ãã¢ãŒãã«ã¢ãŒãã«ããããšãã§ããŸãã ããã¯ç§ãåºå·ãã解決çã§ããããŠãæçµçãªè§£æ±ºçããããŸã-ãã€ãã£ãAndroidå®è£ ã«ããããé©çšãããïŒexpoã䜿çšããŠããå Žåã¯äžå¯èœïŒãã©ã€ãã©ãªã§ããããåŸ ã£ãŠããããããexpoã«ããŒãžããããŸã§åŸ ã¡ãŸãã
ps
誀解ããªãã§ãã ããããã®ã©ã€ãã©ãªã¯çŽ æŽãããã§ããããã«æ³šãããŠããäœæ¥ã«æè¬ãããšã³ããŠãŒã¶ãŒã®ãšã¯ã¹ããªãšã³ã¹ãã©ãã»ã©åªããŠãããã匷調ããããšã¯ã§ããŸãããããã®ãããªãã°ããããšã髪ã®æ¯ãæããããªããŸãã
ãã®å Žåããã€ãã£ãã³ã³ããã¹ããåŠçããå¿ èŠãããã©ã€ãã©ãªã¯ã»ãšãã©ãããŸããã
Androidã®å Žåã RNGHããã¥ã¡ã³ãã«èšèŒã
MainActivity.java
ãã¡ã€ã«ãæŽæ°ããŸã
ããã圹ã«ç«ãŠã°å¹žã
ãã®å Žåããã€ãã£ãã³ã³ããã¹ããåŠçããå¿ èŠãããã©ã€ãã©ãªã¯ã»ãšãã©ãããŸããã
Androidã®å Žåã RNGHããã¥ã¡ã³ãã«èšèŒã
MainActivity.java
ãã¡ã€ã«ãæŽæ°ããŸãããã圹ã«ç«ãŠã°å¹žã
ã¯ããããã¯ç§ã«ãšã£ãŠå®ç§ã«æ©èœããŸããã ç§ã¯èªåã®Androidã¢ããªãã¹ã¯ã€ãå¯èœã«ããããã®è§£æ±ºçãæ¢ãããšã«ã»ãšãã©ã€ã©ã€ã©ããŸããã
ãŸã åããªã
ã¢ãŒãã«ãå€æŽããŠãã¹ãŠã衚瀺ããå Žåã¯ãæ£åžžã«æ©èœããŸã...
ããã«ã¡ã¯@romanonthego ã
ããŠãæçµçãªè§£æ±ºçããããŸã-ãã€ãã£ãAndroidå®è£ ã«ããããé©çšãããïŒexpoã䜿çšããŠããå Žåã¯äžå¯èœïŒãã©ã€ãã©ãªã§ããããåŸ ã£ãŠããããããexpoã«ããŒãžããããŸã§åŸ ã¡ãŸãã
ãã€ãã£ãã®Androidã³ãŒãã«ããããé©çšããæ¹æ³ãæããŠãã ããã
@osdnkããã¯ãšããµã€ãã£ã³ã°ã§ãã DialogFragment
ã§ãæ©èœããŸããïŒ
ïŒ937ãè©ŠããåŸãããŸããããªãã£ãããšãããããŸãã...
å€åããã¯ç§ãwixã®react-native-navigationã䜿çšããŠããããã§ããïŒ ç§ã®ç¥ãéãããã¹ãŠã®ç»é¢ã¯gestureHandlerRootHOCã«ç»é²ãããŠããŸãïŒã©ã€ãã©ãªã¯éåžžã®éã¢ãŒãã«ãã¥ãŒã§å®å šã«æ©èœããŸãïŒã
ããã¯ãã¢ãŒãã«ã§RectButtonãè©Šããç»é¢ã®äžéšã§ãïŒåºæ¬çã«ã¯ãããã¥ã¡ã³ãã®æŽæ°ã«ãããŸãïŒã
renderSearchScreen = () => {
const { showSearchHistory } = this.state;
const ExampleWithHoc = gestureHandlerRootHOC(() => {
return (
<View style={genericStyles.container}>
<SearchScreen
searchBar={{
...this.searchBar,
searchQuery: this.props.searchQuery,
}}
onBackPress={() => {
this.setState({ showSearchHistory: false });
}}
/>
</View>
);
});
if (showSearchHistory) {
return (
<RNModal
animationType="fade"
transparent
visible={this.state.showSearchHistory}
onRequestClose={() => {}}>
<ExampleWithHoc />
</RNModal>
);
}
return null;
};
ã¢ãŒãã«ã¯æ³å®ã©ããã«ããŒããããŸãããRectButtonã¯onPressã€ãã³ããçºçãããŸããã ãŸã£ããæ°ããã¢ããªã§åçŸæ§ã®ããæå°éã®ãã¢ãäœæããããšããŸããããïŒ848ïŒ676ïŒ835ïŒäºãã«éè€ããŠããå¯èœæ§ããããŸãïŒã«ééããŸããã
whopïŒ937
ãããïŒ ãã ãã react-native-modal
ã§ã¯ãŸã æ©èœããŸããã
_ //ç·šéïŒå®éã«ã¯ãããã©ã«ãã®ã¢ãŒãã«ãæ©èœããŸããããééãããªããã°1.6.0ããæ©èœããã¯ãã§ããïŒ äœãããŸããããªãã®ã調ã¹ãããšããŸã_
ç§ã¯å°ãéãã§ãåé¡ãèŠã€ããããšãã§ããŸããã ãã ããåå ãšä¿®æ£æ¹æ³ãããããŸããã
ç§ã®å Žåã®åé¡ã¯ãç§ãããããšãã§ããreact-native-gesture-handler
ã®å
éšåäœããŸãã@react-navigation/stack
ã¢ãŒãã«å
éšã«é
眮ãããå Žåã«ã¯ããåºæ¬çã«ïŒã Stack.Navigator
> SomeScreenComponent
> Modal
> gestureHandlerRootHOC(PanGestureHandler)
倱æããŸãïŒã
Stack Navigatorãåãåã£ããã代ããã«Tab Navigatorã䜿çšããããããšãããã¯é åã®ããã«æ©èœããã®ã§ãStackNavigatorã®ããã§ãããšç¢ºä¿¡ããŠããŸãã
é¢é£ããããã±ãŒãžããŒãžã§ã³ïŒ
[email protected]
@react-navigation/[email protected]
@react-navigation/[email protected]
ã§ããã ãæ©ããã¢ãªããžããªãèšå®ããããšããŸããããã«åœ¹ç«ã€æ å ±ãæäŸã§ãããã©ãããç¥ãããã ããã
ãããïŒ npx react-native init
ããã»ãšãã©ç©ºçœïŒã®ãã¢ã¢ããªã§ãåé¡ã衚瀺ãããŸãã ã¢ããªå
ã®ã¹ã¿ãã¯ããã²ãŒã¿ãŒãåãæ¿ããŠã PanGestureHandler
ãã©ã®ããã«æ©èœãããæ©èœããªããã確èªã§ããŸãã
åæ§ã®åé¡ããããŸãã Stack.Navigatorã¯Androidã§ã¯ããŸãæ©èœããªãããã§ãã mode = "modal"ãš "card"ã®ã©ã¡ãã䜿çšããŠãããŸããŸããã
ã ããç§ã¯éãã§ããŠã次ã®ã³ãŒããæã£ãŠããŸãã
import { SafeAreaView, Button } from 'react-native';
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack'
import { enableScreens } from 'react-native-screens';
enableScreens(); // <-- this fucked it up
const Screen1 = ({ navigation }) => {
return (
<SafeAreaView style={{ flex: 1 }}>
<Button title="Open Modal" onPress={() => navigation.push('Modal')} />
</SafeAreaView>
)
}
const Screen2 = ({ navigation }) => {
return (
<SafeAreaView style={{ flex: 1 }}>
<Button title="Close Modal" onPress={() => navigation.goBack()} />
</SafeAreaView>
)
}
const App = () => {
return (
<NavigationContainer>
<Stack.Navigator headerMode="none">
<Stack.Screen name="Main" component={Screen1} />
<Stack.Screen name="Modal" component={Screen2} />
</Stack.Navigator>
</NavigationContainer>
)
}
次ã«ããã®è¡ãåé€ããŸããã
enableScreens();
ãããŠããã¯Androidäžã§æ£ããåäœããŸããã
ã¢ãŒãã«å ã§ããã解決ããããã®ã¡ãã£ãšããããªãã¯ïŒ
import { TouchableWithoutFeedback } from 'react-native';
import { RectButton } from 'react-native-gesture-handler';
<TouchableWithoutFeedback onPress={...}
<RectButton>
...
</RectButton>
</TouchableWithoutFeedback>
åæ§ã®åé¡ãçºçããŠããŸãã åé¿çã¯ãããŸããïŒ
ã¢ãŒãã«å ã§https://github.com/osdnk/react-native-reanimated-bottom-sheetã䜿çšããããšããŸããããããã¯äžå¯èœã§ãããæçµçã«ãreact-navigationç»é¢ã¢ãã¡ãŒã·ã§ã³ã§è§£æ±ºããŸããã
https://github.com/osdnk/react-native-reanimated-bottom-sheet/issues/143#issuecomment -614300015
ã¢ãŒãã«å ã§ããã解決ããããã®ã¡ãã£ãšããããªãã¯ïŒ
import { TouchableWithoutFeedback } from 'react-native'; import { RectButton } from 'react-native-gesture-handler';
<TouchableWithoutFeedback onPress={...} <RectButton> ... </RectButton> </TouchableWithoutFeedback>
ãã@gideaoms ã ããªãã®ã³ã¡ã³ãã¯ã©ããã£ãŠããã§èŠéããããã®ã ãããã ããã¯ééããªãããªãã¯ãè¡ããŸãã ããããšãïŒ
ãããïŒ
npx react-native init
ããã»ãšãã©ç©ºçœïŒã®ãã¢ã¢ããªã§ãåé¡ã衚瀺ãããŸãã ã¢ããªå ã®ã¹ã¿ãã¯ããã²ãŒã¿ãŒãåãæ¿ããŠãPanGestureHandler
ãã©ã®ããã«æ©èœãããæ©èœããªããã確èªã§ããŸãã
ããã§ã¯ã解決çã¯äœã§ããïŒ
ç§ã¯ãŸã åãåé¡ãæ±ããŠããŸã...
解決çã¯ãŸã ãããŸãããïŒ
ããã¯1.6.0ã§ããŸã åé¡ã§ã
äžèšã®ãã¹ãŠã®ææ¡ãè©ŠããŸãããããŸã éããããŸããã ãã®æ¬åœã«ã€ã©ã€ã©ããã®ãå©ããŠãã ããã
0.62.2ã®ç§ã®reactnativeããŒãžã§ã³ã¯ã/ react-native-gesture-handler1.5.6ãš1.6.0ã®äž¡æ¹ã§è©ŠããŸããã
ãŸã ^1.7.0
ãŸã æ©èœããŠããŸããïŒ-1ïŒ
wix-navigationã䜿çšããŸãã å€åäœãé¢é£ããããŸããïŒ
ãŸããç§ã¯å¯èœãªåé¿çãèŠã€ããŸãããããã¯ç§ãã¡ãæãã§ããããšãæ£ç¢ºã«å®è¡ããiOSãšAndroidã®äž¡æ¹ã§æ©èœããŸãã
@steniowagnerã¯ã«ã¹ã¿ã ã¢ãŒãã«ã®ãããªãã®ã§ããïŒ ç§ã¯ããããå§ãããŸãã
react-navigationsãŸãã¯native-stackmodalã䜿çšããã ãã§ãåé¡ãªãåäœããŸãã
ããŒããreact-navigationsã§ãã¹ãããŸããã§ããïŒç§ã®å Žåã¯å€ãããããã«èãããŸãïŒããçŸæç¹ã§ã¯ãããããããæåã®æ¹æ³ã§ãã
ããããšã@ a-eidïŒ
ããã¥ã¡ã³ãã«ãããš
https://docs.swmansion.com/react-native-gesture-handler/docs/#usage -with-modals-on-android
ããããããã§ãç§ã«ã¯ããŸããããŸããã§ããã
@gideaomsã¯ãããªãã¯ããã¿ã³ã«å¯ŸããŠæ©èœããå¯èœæ§ããããŸãããç§ã®ãŠãŒã¹ã±ãŒã¹ã¯ãã¢ãŒãã«å
ã§PinchGestureHandler
ã䜿çšããããšã§ãã
ã¢ãŒãã«å ã§ããã解決ããããã®ã¡ãã£ãšããããªãã¯ïŒ
import { TouchableWithoutFeedback } from 'react-native'; import { RectButton } from 'react-native-gesture-handler';
<TouchableWithoutFeedback onPress={...} <RectButton> ... </RectButton> </TouchableWithoutFeedback>
ãã®åé¡ã¯2幎以äžåã®ãã®ã§ããããããä¿®æ£ããäºå®ã¯ãããŸããïŒ
ã¢ããªã®ã«ã¹ã¿ã ã¹ã©ã€ããŒã³ã³ããŒãã³ããäœæããŸããããã¢ããªã®ãã¥ãŒã®å€ããã¢ãŒãã«ã§ãããããAndroidã§ã¯ãŸã£ãã䜿çšã§ããŸããã
ãã¹ãŠã®ç»é¢ãšã¢ãŒãã«ã³ã³ããŒãã³ããgestureHandlerRootHoC
ã©ããããŸããïŒwix / react-native-navigationã䜿çšïŒ
ç»é¢ãšã³ã³ããŒãã³ãã®äž¡æ¹ãgestureHandlerRootHoc
ã©ããããããšããŸããããããŸããããŸããã§ããã ã¢ãŒãã«ã§äžã«ã¹ã¯ã€ãããŠéããåäœãå®è£
ããã«ã¯PanGestureHandler
ãå¿
èŠãªããã RectButton
ã¢ãããŒããè©ŠããŸããã§ããã iOSã§å®å
šã«åäœããã®ã§ã€ã©ã€ã©ããŸãããŸãã react-native-modal
ã䜿çšããŠããã®ã§ãå®éã«ã¯ã¹ã¯ã€ãããŠããã«éããããšãã§ããã®ã§ã代ããã«ãã®ã¢ãããŒãã䜿çšããŠã¿ãŸãããã¢ãŒãã«å
ã«ã¹ã¯ããŒã«å¯èœãªã³ã³ãã³ãããªãéãæ©èœããŸããiOSãšAndroidã®äž¡æ¹ã§ãã°ããããããç§ã¯ã¡ãã£ãšç«ã¡åŸçããŠããŸã...
ç·æ¬ããïŒ
react-native
ã®<Modal>
ã³ã³ããŒãã³ãã§ã¯æ©èœããŸããïŒã³ã³ããŒãã³ããgestureHandlerRootHOC
ã©ãããããŠããå Žåã§ãïŒNavigation.showModal
ã䜿çšããŠè¡šç€ºãããwix/react-native-navigation
ã®ç»é¢ã§æ©èœããŸãïŒç»é¢ãgestureHandlerRootHOC
ã©ãããããŠããå Žåã§ãïŒreact-navigation
ã®ããã·ã¥é¢æ°ãmodal: true
ã§äœ¿çšããŠè¡šç€ºãããå Žåã«æ©èœããããã§ããããã€ãã£ãã¹ã¿ãã¯ïŒ enableScreens()
/ createNativeStackNavigator()
ïŒã䜿çšããŠããªãå Žåã«éããŸããå¿ èŠã«å¿ããŠè©³çŽ°ããç¥ããããŸãã
react-native-modal-animatedã¯react-native-gesture-handlerãšé£æºããŸããããã¯ãreact-native-modal-animatedããã¥ãŒã䜿çšããã ãã§ã¢ãŒãã«ãäœæããããã§ãã
@flyskyãªãreact-native-modal-animatedãreact-native-modalã®ãããªåå¥ã®ã¢ã¯ãã£ããã£ã䜿çšããªãå Žåãããããã¹ãŠã®äžã«ã©ã®ããã«ã¬ã³ããªã³ã°ãããã®ã§ããïŒ çµ¶å¯Ÿäœçœ®ã䜿çšããŠããå Žåã¯ãåé¡ãçºçããå¯èœæ§ããããŸãã
@ waheedakhtar694 ãabsoluteã䜿çšããŠããŸãã å°ãªããšãç§ã®å Žåãåé¡ãããŸããïŒstuck_out_tongue_closed_eyesïŒ
@jvaclavik https://github.com/callstack/react-native-paperãšçµã¿åãããŠäœ¿çšââããŸãããããã«ã¯ããã®ç®çã®ããã«ç¹å¥ã«èšèšãããããŒã¿ã«ãšåŒã°ããã³ã³ããŒãã³ãããããŸãã
@jvaclavikãèšã£ãããã«ãreact-native-paperããPortalã䜿çšããŠè§£æ±ºããŸããã
ã¢ããªãPaperProviderã§ã©ããããŠãããã¢ãŒãã«ããã¥ãŒã«å€æŽãã gestureHandlerRootHOCãšããŒã¿ã«ã§ã©ããããŸãã
ããã ã·ãŒããAndroidã§åäœããããã«ãªããŸããð
_EDITïŒäœããã®çç±ã§ããã³ãžã§ã¹ãã£ã¯æ©èœããŠããŸãããonPressã€ãã³ãã¯æ©èœããŠããŸããïŒãã ãããªããã«ã衚瀺ãããŸãïŒã
ç·šé2ïŒããã¯ç§ã䜿çšããã©ã€ãã©ãªã®åé¡ã§ãããã¿ããå¯èœãªã€ã³ããŒãããreact-nativeããããreact-native-gesture-handlerãã«å€æŽããããšãä¿®æ£ããŸããã
ãããããªããè©Šãããšãã§ããããã€ãã®ã³ãŒãã§ã
/*
App.js:
- import { Provider as PaperProvider } from "react-native-paper";
- wrap your App with PaperProvider
*/
// ModalFixed.js
import { Portal } from 'react-native-paper';
import { gestureHandlerRootHOC } from 'react-native-gesture-handler';
const ModalFixed = (props) => {
<View style={styles.modal}>
<View style={styles.shadow} />
{/* MODAL CONTENT HERE, you can put props.children to reuse this component */}
</View>
}
const styles = StyleSheet.create({
modal: {
width: "100%",
height: "100%"
},
shadow: {
position: "absolute",
width: "100%",
height: "100%",
backgroundColor: "rgba(0,0,0,0.3)",
}
})
const _ModalFixed = gestureHandlerRootHOC(SheetPopup)
export default (props) => {
return (
<Portal>
<_ModalFixed {...props} />
</Portal>
)
}
ããã¯ç§ã®ããã«åããŠããŸãïŒ
<TouchableWithoutFeedback
onPress={() => {
console.log("press");
}}
>
<Text>
<RectButton>
...
</RectButton>
</Text>
</TouchableWithoutFeedback>
ããã«é¢ããæŽæ°ã¯ãããŸããïŒ iOSãæåŸ ã©ããã«æ©èœããŠããããAndroidã¢ãŒãã«ãé çã®çš®ãšãªã£ãŠãã2ã€ã®ãããžã§ã¯ãããããŸãã ãããžã§ã¯ãããã¢ãŒãã«ãåé€ããå¿ èŠã¯ãããŸãã...ããã¯èšèšã®å€§å¹ ãªèŠçŽãã§ãã ïŒ/
@DavidAPearsã¯ãã¢ãŒãã«ãgestureHandlerRootHOC
ã§ã©ããããŠã¿ãŸãããïŒ
ãã®ãããªãã® ïŒ
const ModalInner = gestureHandlerRootHOC(function GestureExample() {
return (
<View>
{ RNGH components . }
</View>
);
});
export default function ModalForX() {
return (
<Modal animationType="slide" transparent={false}>
<ModalInner />
</Modal>
);
}
Portal
ããã®react-native-portalize
ãšgestureHandlerRootHOC
çµã¿åããã¯ç§ã«ãšã£ãŠ
<Portal>
<Modal>
<GestureHandlerRootHOCWrappedComponent />
</Modal>
</Portal>
ã¢ãŒãã«ã¯ãŒã¯ã§coverSreen = {false}ãèšå®ããŸãã ããããç§ã®ã¢ãŒãã«ãç»é¢ãã«ããŒããå¿ èŠããããŸã
import {PlatformãModal} from'react-native ';
import {gestureHandlerRootHOC} from'react-native-gesture-handler ';
'../AnimatedBottomSheet'ãã{AnimatedBottomSheet}ãã€ã³ããŒãããŸãã
const AnimatedBottomSheetWrapper = Platform.OS === 'android'ïŒ ãžã§ã¹ãã£ãã³ãã©ã«ãŒãHOCïŒAnimatedBottomSheetïŒïŒAnimatedBottomSheet;
ããã誰ããå©ãããã©ããã¯ããããŸããããreact-native-modalã§ãã®ã©ã€ãã©ãªã䜿çšããéã«ãåé¡ããããŸããããã¢ãŒãã«gestureHandlerRootHOCã®åãã©ãããã以å€ã«ïŒããã¯ãã¿ã³ã§ã¯æ£åžžã«æ©èœããŸãããã¢ãŒãã«+ avoidKeyboardã§ã®ããã¹ãå ¥åã«åé¡ããããŸãã= trueã§ãããŒãæŒããã³ã«ããŒããŒããéããŠããŸããïŒã ãããç§ãããããšã ããã次ã®ãããªã¢ãŒãã«åã©ãããŒã«ãªããŸãã
import Modal from 'react-native-modal';
import { gestureHandlerRootHOC } from 'react-native-gesture-handler';
const GestureHandlerWrapper = gestureHandlerRootHOC(
({ children }) => <View>{children}</View>,
{ flex: 0 }
);
export const CustomModal: React.FC<Props> = ({
children,
...rest
}) => {
return (
<Modal
{...rest}
>
<GestureHandlerWrapper>
{children}
</GestureHandlerWrapper>
</Modal>
);
};
æãåèã«ãªãã³ã¡ã³ã
ã¢ãŒãã«å ã§ããã解決ããããã®ã¡ãã£ãšããããªãã¯ïŒ