React-native-gesture-handler: ๋ชจ๋‹ฌ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2018๋…„ 04์›” 11์ผ  ยท  71์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: software-mansion/react-native-gesture-handler

์•ˆ๋…•ํ•˜์„ธ์š” !
Android์—์„œ ์•ฝ๊ฐ„์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. GestureHandler ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ Android์˜ ๋ชจ๋‹ฌ์—์žˆ์„ ๋•Œ onGestureEvent ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋‹ฌ์„ View๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค ๐Ÿ‘Œ

iOS์—์„œ ๋ฌธ์ œ ์—†์Œ

Android Bug Can repro Important

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋ชจ๋‹ฌ ๋‚ด์—์„œ ๊ทธ๊ฒƒ์„ ํ•ด๊ฒฐํ•˜๋Š” ์•ฝ๊ฐ„์˜ ํŠธ๋ฆญ :

import { TouchableWithoutFeedback } from 'react-native';
import { RectButton } from 'react-native-gesture-handler';
<TouchableWithoutFeedback onPress={...}
    <RectButton>
         ...
    </RectButton>
</TouchableWithoutFeedback>

๋ชจ๋“  71 ๋Œ“๊ธ€

+1
ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ง€๊ธˆ์€ ๋ชจ๋‹ฌ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ทฐ๋ฅผ ์ ˆ๋Œ€ ์œ„์น˜๋กœ ๋‹ค์‹œ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ ๋ชจ๋‹ฌ ํ™”๋ฉด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธํ„ฐ๋„ท ๊ฒ€์ƒ‰ ๋ฐ ์ฑ„ํŒ… ํ›„ RN์˜ ๋ชจ๋‹ฌ์€ ๋ฒ„๊ทธ๊ฐ€ ๋งŽ์€ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ–ˆ์Šต๋‹ˆ๋‹ค.

+1

์•ˆ๋…•ํ•˜์„ธ์š”, @martinezguillaume , @mordaha , @csto
๋‚˜๋Š”์ด ๋ฌธ์ œ๋ฅผ ์‚ดํŽด ๋ดค๊ณ  ์šฐ๋ฆฌ ๋„์„œ๊ด€์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ RN Core์˜ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@osdnk ๋Š”์ด ๋ฌธ์ œ๋ฅผ

+1 ์ œ์Šค์ฒ˜๋Š” ๋ชจ๋‹ฌ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜๋„์ด ๋ฒ„๊ทธ๋ฅผ ๋งŒ๋‚ฌ์Šต๋‹ˆ๋‹ค.

๊ฐ™์€ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ œ์Šค์ฒ˜๋Š” Android์˜ ๋ชจ๋‹ฌ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ์—‘์Šคํฌ

์ €๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๋ชจ๋‹ฌ์—์„œ ํ…Œ์ŠคํŠธ ๋œ react-native์˜ PanResponder ํ•ธ๋“ค๋Ÿฌ-์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•œ ์ƒ๊ฐ์ด ์žˆ์Šต๋‹ˆ๋‹ค.์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์•ˆ๋“œ๋กœ์ด๋“œ ํ”„๋กœ์ ํŠธ์— ์—ฐ๊ฒฐํ•  ๋•Œ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

<strong i="7">@Override</strong>
            protected ReactRootView createRootView() {
                return new RNGestureHandlerEnabledRootView(MainActivity.this);
            }

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ๋ชจ๋‹ฌ์ด ๋ณ„๋„์˜ ํŒจํ‚ค์ง€๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์œผ๋กœ ๋˜‘๊ฐ™์€ ์ผ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํ‘œ์ค€ React Native Modal ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๊ณ ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
์ƒˆ ํ™”๋ฉด์„ ๋งŒ๋“ค๊ณ  ๋ชจ๋‹ฌ๋กœ ํ‘œ์‹œํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. react-native-navigation ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Navigation.showModal({
    component: {
      name: navRoutes.ImageModal,
      passProps: { image },
    },
  })

์ œ์Šค์ฒ˜๋Š” iOS์™€ Android ๋ชจ๋‘์—์„œ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜๋ฉฐ ์›๋ž˜ ๋ชจ๋‹ฌ์—์„œ ์›ํ•˜๋Š” ํˆฌ๋ช…ํ•œ ๋ฐฐ๊ฒฝ์„ ์—ฌ์ „ํžˆ ์–ป์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ํ•œ๋™์•ˆ ํŒŒ๊ณ  ๋“ค์—ˆ๋‹ค.

  1. RNGH์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜’
  2. bc ๋ชจ๋‹ฌ์ด RN ๋ฃจํŠธ ๋ทฐ ์•„๋ž˜์— ๋ Œ๋”๋ง๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  3. RNRootView์™€ ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ชจ๋‹ฌ์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ผ๋ถ€ ์ถ”๊ฐ€ ๋กœ์ง์œผ๋กœ ๋ž˜ํ•‘ํ•˜์—ฌ ๊ต์ฒดํ•˜์—ฌ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/kmagiera/react-native-gesture-handler/blob/master/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootViewManager.java ์ฐธ์กฐ
  4. ์ง€๊ธˆ์€ ํ•  ์‹œ๊ฐ„์ด ์—†์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฌ๊ณ  Android ๋„ค์ดํ‹ฐ๋ธŒ ์ธก์˜ RNGH ์ฝ”์–ด์— ์ผ๋ถ€ ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์›ํ•˜๊ณ  ํ•  ์‹œ๊ฐ„์ด ์žˆ๋‹ค๋ฉด ๊ธฐ๊บผ์ด ๊ฒ€ํ† ํ•˜๊ณ  ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๊ณ  ๋„ˆ๋ฌด ์—‰๋ง์ด ์•„๋‹Œ ๊ฒฝ์šฐ ์ฆ‰์‹œ ๋ณ‘ํ•ฉ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ mars-lan @ mars-lan @ParhamZare @ewendel @ Via-profit @Dmitrylolo @ LaVielle @ martinezguillaume @mordaha @csto @ mars-lan @ParhamZare @ewendel @ Via-profit @Dmitrylolo @LaVielle

๋˜ํ•œ ๋‘ ๋‹ฌ ์ „์— ์‹œ๋„ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

https://github.com/kmagiera/react-native-gesture-handler/commit/139da18039683bed3c439c991c7eaf802086bf86

๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ์˜๊ฐ์ด ๋  ์ˆ˜๋„ ์žˆ๊ฒ  ๋„ค์š” ๐Ÿคทโ€โ™‚๏ธ

์•ˆ๋…•ํ•˜์„ธ์š” @osdnk ์ €๋Š” ์ œ ์•ฑ์—์ด ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•ด์„œ ์‹œ๋„ํ•ด ๋ณผ ์ˆ˜์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ RNGestureHandler ๋˜๋Š” Android์— ๋Œ€ํ•œ ๊ฒฝํ—˜์ด ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•ดํ•ด์•ผ โ€‹โ€‹ํ•  ์ผ์— ๋Œ€ํ•ด ์ข€ ๋” ํ†ต์ฐฐ๋ ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
๋˜ํ•œ ์ด์ „ ์‹œ๋„๋ฅผ๋ณด๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ์™„๋ฃŒํ•˜๊ธฐ ์œ„ํ•ด ๋น ์ง„ ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€, ๊ทธ๋ฆฌ๊ณ  ์‹œ์ž‘์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๊ฐ™์€ ์˜ค๋ฅ˜.

@kmagiera @osdnk ์ด๊ฒƒ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?
Touchable* ์กฐ์ฐจ๋„ ๋ชจ๋‹ฌ ๋‚ด๋ถ€์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ด๊ฒƒ์€ ์‹ค๋ง ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

+1. ๋ชจ๋‹ฌ๊ณผ ํ•จ๊ป˜ reanimated-bottom-sheet๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ๋ชจ๋‹ฌ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? RN์˜ ๋ชจ๋‹ฌ์€ ์ •์งํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋ฉฐ ๋ฒ„๊ทธ๋กœ ๊ฐ€๋“ ์ฐจ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ : ๊ฒฝ๊ณ ์™€ ๊ฒฐํ•ฉํ•˜๋ฉด ๋ฉˆ์ถค).

@cristianoccazinsp https://github.com/react-native-community/react-native-modal ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค.

์ด์ƒํ•œ. ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ react์˜ ๋ชจ๋‹ฌ์„ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ํ–ˆ๋‹ค
๋‹น์‹ ์—๊ฒŒ ์ฐจ์ด๋ฅผ ๋งŒ๋“ค์–ด?

El jue., 2019 ๋…„ 5 ์›” 30 ์ผ 14:38, Mars Lan [email protected]
escribiรณ :

@cristianoccazinsp https://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=ALU263ACF3LNSRSPFWR45ELPYAGJTA5CNFSM4EZ6UZL2YY3PNVWWK3TUL52HSTDN5VRWEXGOD4506XHKissue4DFVRWEXGOD4506ZLOPWS#comment
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ALU263GRH2KHBXUZBGHNKA3PYAGJTANCNFSM4EZ6UZLQ
.

@cristianoccazinsp ํ™”๋ฉด์„ ๊ฐ€๋ฆฌ๊ธฐ ์œ„ํ•ด RN์˜ ๋ชจ๋‹ฌ ๋งŒ ์‚ฌ์šฉํ•˜๋ฉฐ, coverScreen ๋ฅผ false ๋กœ ์„ค์ •ํ•˜์—ฌ ๋น„ํ™œ์„ฑํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@cristianoccazinsp ํ™”๋ฉด์„ ๊ฐ€๋ฆฌ๊ธฐ ์œ„ํ•ด RN์˜ ๋ชจ๋‹ฌ ๋งŒ ์‚ฌ์šฉํ•˜๋ฉฐ, coverScreen ๋ฅผ false ๋กœ ์„ค์ •ํ•˜์—ฌ ๋น„ํ™œ์„ฑํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์•ฑ์˜ ๋ฃจํŠธ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ๋ Œ๋”๋ง๋˜์ง€ ์•Š๋Š”์ด ์†Œํ’ˆ์œผ๋กœ ์ „์ฒด ํ™”๋ฉด ๋ชจ๋‹ฌ์„ ํ‘œ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@jvaclavik https://github.com/callstack/react-native-paper ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ ํ–ˆ๋Š”๋ฐ์ด ๋ชฉ์ ์„ ์œ„ํ•ด ํŠน๋ณ„ํžˆ ์„ค๊ณ„๋œ Portal ์ด๋ผ๋Š” ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ชจ๋“  ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์ง€๋งŒ prop propagateSwipe ๋ฅผ true๋กœ ์„ค์ •ํ•  ๋•Œ ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋‹ฌ์—์„œ ์ œ์Šค์ฒ˜๋ฅผ ํ™œ์„ฑํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” https://github.com/kmagiera/react-native-screens/issues/61 ๊ณผ ๊ด€๋ จ๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

Android์—์„œ ๋ฐ˜์‘ ๊ธฐ๋ณธ ํ™”๋ฉด์„ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. '์žฌ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋œ ํ•˜๋‹จ ์‹œํŠธ'๋กœ ํ…Œ์ŠคํŠธ ๋ฐ ์ œ๋Œ€๋กœ ์ž‘๋™

if (Platform.OS === 'ios') {
useScreens ();
}

ํˆฌ๋ช…ํ•œ bg์— ๋Œ€ํ•œ์ด React Navigation Modal ๊ตฌ์„ฑ์€

ScreenOne : {
ํ™”๋ฉด : ScreenOne,
navigationOptions : {
gesturesEnabled : false
},
}
{
๋ชจ๋“œ : '๋ชจ๋‹ฌ',
transparentCard : true,
headerMode : '์—†์Œ',
cardStyle : {
backgroundColor : 'ํˆฌ๋ช…',
๋ถˆํˆฌ๋ช…๋„ : 1
},
transitionConfig : () => ({
containerStyle : {
backgroundColor : 'ํˆฌ๋ช…',
}
})
}

@osdnk๊ฐ€ ์ˆ˜์ • ํ–ˆ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ๋„ˆ๋ฌด ๋งŽ์€ ๊ณ ํ†ต์ด์—ˆ์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” ๊ตฌ๊ธ€๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ ์ „์— ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ๊ณ , ์ง€๊ตฌ์ƒ์—์„œ ๋™์ผํ•œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ iOS์™€ ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ์ž‘๋™ํ•˜์ง€๋งŒ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋‚ด๋ถ€์˜ ์ผ๋ถ€์—์„œ๋งŒ ์ž‘๋™ํ•˜๋Š” ์ด์œ ๋ฅผ ์•Œ์•„ ๋‚ด๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค-๊ทธ๊ฒƒ์€ ๋ชจ๋‹ฌ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋ˆ„๊ตฌ๋“ ์ง€์ด ์ž‘์—…์„ํ•˜๊ณ  ์žˆ๊ฑฐ๋‚˜ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ์•Œ๊ณ  ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ญ์ œํ•˜๊ณ  RN ํŒฌ ํ•ธ๋“ค๋Ÿฌ๋กœ ์ „ํ™˜ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?
์–ด๋– ํ•œ ์ œ์•ˆ ?

https://github.com/react-native-community/react-native-modal ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. RectButton์€ https://github.com/react-native-community/react-native-modal ๋‚ด์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํŠธ์œ— ๋‹ด์•„ ๊ฐ€๊ธฐ
Modal ๋˜๋Š” Modal ๊ธฐ๋ฐ˜ ํŒจํ‚ค์ง€ (๊ธฐ๋ณธ ์ข…์†์„ฑ์„ ์—ฐ๊ฒฐํ•  ํ•„์š”๊ฐ€์—†๋Š” ๊ฒฝ์šฐ react-native ์˜ Modal )๊ฐ€ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค (๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋‘ ์‹œ๋„ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค).
๋ชจ๋“  gesture- ๊ด€๋ จ ๊ตฌ์„ฑ ์š”์†Œ (์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ํ•˜๋‹จ ์‹œํŠธ ๋™์ž‘)๋Š” android์—์„œ <Modal>...</Modal> ๋‚ด๋ถ€์—์„œ ๋ Œ๋”๋ง ๋  ๋•Œ ํ„ฐ์น˜ / ์Šค ์™€์ดํ”„ ๋“ฑ์„ ๋“ฑ๋กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ œ๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜์žˆ๋Š” 3 ๊ฐ€์ง€ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ชจ๋‹ฌ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ์ผ๋ถ€ ์Šค ์™€์ดํ”„ ๊ธฐ๋ฐ˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ PanResponder ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ณ ํ†ต์ด์ง€๋งŒ ๊ฝค ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.
  2. portals ๋ชจ๋‹ฌ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ์‹ค์ œ๋กœ ํฌํ„ธ์ด๋‚˜ ๋ชจ๋‹ฌ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‹จ์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ˜ธ์ŠคํŠธ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํฌํ„ธ์€ react-native์—์„œ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ํ˜ธ์ŠคํŠธ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์–ด๋”˜๊ฐ€์— ๋ฐฐ์น˜ํ•˜์—ฌ ์ž‘๋™ํ•˜๊ณ  ์•ฑ ์Šคํƒ ์œ„์˜ ์ ˆ๋Œ€๋ณด๊ธฐ์—์„œ ๋ชจ๋‹ฌ ์ฝ˜ํ…์ธ ๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž‘๋™ํ•˜๋Š” ์†”๋ฃจ์…˜์ด์ง€๋งŒ ์ปจํ…์ŠคํŠธ ๊ณต๊ธ‰์ž ์œ„์— ๋ Œ๋”๋ง๋˜๋Š” ์ž์‹์œผ๋กœ ์ธํ•ด useContext() ํ˜ธ์ถœ์ด ์†์‹ค๋ฉ๋‹ˆ๋‹ค. navigation ์ปจํ…์ŠคํŠธ๊ฐ€ ์†์‹ค๋˜์—ˆ์œผ๋ฏ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  3. ํƒ์ƒ‰ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋‹ฌ ์‚ฌ์šฉ ( react-navigation ); ์ด๊ฒƒ์€ ์ž‘๋™ํ•˜์ง€๋งŒ API๋Š” ... ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ํ™”๋ฉด์„ ๋ชจ๋‹ฌ๋กœ ๋งŒ๋“ค ์ˆ˜๋Š” ์—†์œผ๋ฉฐ ์Šคํƒ ๋งŒ ๋ชจ๋‹ฌ ๋ชจ๋“œ์—์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ๊ณ ์ˆ˜ํ•˜๋Š” ํ•ด๊ฒฐ์ฑ…์ž…๋‹ˆ๋‹ค.

๊ธ€์Ž„, ์ตœ์ข… ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค-๋„ค์ดํ‹ฐ๋ธŒ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ตฌํ˜„์„ ํŒจ์น˜ํ•˜๊ฑฐ๋‚˜ (์—‘์Šคํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์Œ) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ํŒจ์น˜๋ฅผ ๊ธฐ๋‹ค๋ฆฐ ๋‹ค์Œ ์—‘์Šคํฌ์— ๋ณ‘ํ•ฉ ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์‹ญ์‹œ์˜ค.

์ถ”์‹ 
์˜คํ•ดํ•˜์ง€ ๋งˆ์„ธ์š”.์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋†€๋ž์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์ž‘์—…์„ ์Ÿ์•„ ๋ถ€์€ ๊ฒƒ์— ๋Œ€ํ•ด ๊ฐ์‚ฌํ•˜๊ณ  ์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ ์–ผ๋งˆ๋‚˜ ๋” ๋‚˜์€ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋Š”์ง€ ์ถฉ๋ถ„ํžˆ ๊ฐ•์กฐ ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ์ด์™€ ๊ฐ™์€ ๋ฒ„๊ทธ๋Š” ์ œ ๋จธ๋ฆฌ์นด๋ฝ์„ ๋นผ๋‚ด๊ณ  ์‹ถ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋„ค์ดํ‹ฐ๋ธŒ ์ปจํ…์ŠคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค.

Android์˜ ๊ฒฝ์šฐ RNGH ๋ฌธ์„œ์— ๋ช…์‹œ๋œ๋Œ€๋กœ ํŠน๋ณ„ํ•œ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

MainActivity.java ํŒŒ์ผ ์—…๋ฐ์ดํŠธ
Screen Shot 2019-11-30 at 12 17 07 PM

๋„์›€์ด๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋„ค์ดํ‹ฐ๋ธŒ ์ปจํ…์ŠคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค.

Android์˜ ๊ฒฝ์šฐ RNGH ๋ฌธ์„œ์— ๋ช…์‹œ๋œ๋Œ€๋กœ ํŠน๋ณ„ํ•œ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

MainActivity.java ํŒŒ์ผ ์—…๋ฐ์ดํŠธ
Screen Shot 2019-11-30 at 12 17 07 PM

๋„์›€์ด๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์˜ˆ, ์ด๊ฒƒ์€ ์ €์—๊ฒŒ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ์„ ์Šค์™€์ด ํ•‘ ํ•  ์ˆ˜์žˆ๊ฒŒ ๋งŒ๋“œ๋Š” ์†”๋ฃจ์…˜์„ ์ฐพ๋Š” ๋ฐ ๊ฑฐ์˜ ์ขŒ์ ˆํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜๋„ ์ž‘๋™์ด ์•ˆ๋˜๋Š”
๋ชจ๋‹ฌ์„ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ชจ๋“  ๊ฒƒ์ด ์ž˜ ์ž‘๋™ํ•˜๋ฉด ...

์•ˆ๋…•ํ•˜์„ธ์š” @romanonthego ,

๊ธ€์Ž„, ์ตœ์ข… ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค-๋„ค์ดํ‹ฐ๋ธŒ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ตฌํ˜„์„ ํŒจ์น˜ํ•˜๊ฑฐ๋‚˜ (์—‘์Šคํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์Œ) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ํŒจ์น˜๋ฅผ ๊ธฐ๋‹ค๋ฆฐ ๋‹ค์Œ ์—‘์Šคํฌ์— ๋ณ‘ํ•ฉ ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์‹ญ์‹œ์˜ค.

๋‚ด ๋„ค์ดํ‹ฐ๋ธŒ 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 (์„œ๋กœ ์ค‘๋ณต ๋  ์ˆ˜ ์žˆ์Œ)๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์™€์šฐ # 937

๊ทธ ๋†€๋ผ์šด! ๊ทธ๋ž˜๋„ react-native-modal ์—์„œ๋Š” ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!

_ // ํŽธ์ง‘ : ์‚ฌ์‹ค, ๊ธฐ๋ณธ ๋ชจ๋‹ฌ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์ง€๋งŒ ์ฐฉ๊ฐํ•˜์ง€ ์•Š์œผ๋ฉด 1.6.0๋ถ€ํ„ฐ ์‹œ์ž‘ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ฌด์—‡์ด ์ž˜๋ชป๋˜์—ˆ๋Š”์ง€ ์•Œ์•„ ๋‚ด๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค _

๋‚˜๋Š” ์•ฝ๊ฐ„ ๋†€์•˜๊ณ  ๋ฌธ์ œ๋ฅผ ์ฐพ์„ ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์›์ธ๊ณผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚ด ๊ฒฝ์šฐ์˜ ๋ฌธ์ œ๋Š”, ๊ทธ I react-native-gesture-handler ํ•˜๋Š” ๋‚ด๋ถ€ํ•˜์ง€ ์ž‘์—… @react-navigation/stack , ๊ทธ๋ž˜์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ (๋ชจ๋‹ฌ ๋‚ด๋ถ€์— ์œ„์น˜ํ•˜๋Š” ๊ฒฝ์šฐ Stack.Navigator > SomeScreenComponent > Modal > gestureHandlerRootHOC(PanGestureHandler) ์‹คํŒจ).

์Šคํƒ ๋„ค๋น„๊ฒŒ์ดํ„ฐ๋ฅผ ์ž˜๋ผ๋‚ด๊ฑฐ๋‚˜ ๋Œ€์‹  ํƒญ ๋„ค๋น„๊ฒŒ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งค๋ ฅ์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋ฏ€๋กœ ์Šคํƒ ๋„ค๋น„๊ฒŒ์ดํ„ฐ์˜ ์ž˜๋ชป์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

๊ด€๋ จ ํŒจํ‚ค์ง€ ๋ฒ„์ „ :

[email protected]
@react-navigation/[email protected]
@react-navigation/[email protected]

์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ๋ฐ๋ชจ ์ €์žฅ์†Œ๋ฅผ ์„ค์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ์œ ์šฉํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”.

๋‹ค์Œ์€ ๋ฌธ์ œ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐ๋ชจ ์•ฑ์ž…๋‹ˆ๋‹ค ( npx react-native init ์—์„œ ๊ฑฐ์˜ ๋น„์–ด ์žˆ์Œ). ์•ฑ ๋‚ด์—์„œ ์Šคํƒ ํƒ์ƒ‰๊ธฐ๋ฅผ ์ „ํ™˜ํ•˜๊ณ  PanGestureHandler ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๊ณ  ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/mxmzb/react-native-breakable-app

๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 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 ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ ํ–ˆ์ง€๋งŒ ๋ถˆ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์นจ๋‚ด ๋ฐ˜์‘ ํƒ์ƒ‰ ํ™”๋ฉด ์• ๋‹ˆ๋ฉ”์ด์…˜์œผ๋กœ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

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 ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๊ณ  ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/mxmzb/react-native-breakable-app

๊ทธ๋ ‡๋‹ค๋ฉด ํ•ด๊ฒฐ์ฑ…์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‚˜๋Š” ์—ฌ์ „ํžˆ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€์žˆ๋‹ค ....
์•„์ง ํ•ด๊ฒฐ์ฑ…์ด ์—†์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ 1.6.0์—์„œ ์—ฌ์ „ํžˆ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์œ„์—์„œ ์–ธ๊ธ‰ ํ•œ ๋ชจ๋“  ์ œ์•ˆ์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์•„์ง ์šด์ด ์—†์Šต๋‹ˆ๋‹ค. ์ •๋ง ์‹ค๋ง์Šค๋Ÿฌ์›Œ ๋„์™€์ฃผ์„ธ์š”.
0.62.2์˜ ๋‚ด ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฒ„์ „์€ / react-native-gesture-handler 1.5.6 ๋ฐ 1.6.0์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

^1.7.0 ์—์„œ ์—ฌ์ „ํžˆ ๋ฌธ์ œ

์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค : -1 :

์šฐ๋ฆฌ๋Š” wix-navigation์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ธ€์Ž„, ๊ฐ€๋Šฅํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์„ ์ •ํ™•ํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•˜๊ณ  iOS์™€ Android ๋ชจ๋‘์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

https://www.youtube.com/watch?v=tLQjGHDiRkM

@steniowagner ๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ๋ชจ๋‹ฌ๊ณผ ๊ฐ™์€๊ฐ€์š”? ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ถ”์ฒœํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค
๋ฐ˜์‘ ํƒ์ƒ‰ ๋˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ์Šคํƒ ๋ชจ๋‹ฌ๋กœ ์ด๋™ํ•˜๋ฉด ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

ํ , ๋ฐ˜์‘ ํƒ์ƒ‰์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์•˜์ง€๋งŒ (์ œ ๊ฒฝ์šฐ์—๋Š” ๋„ˆ๋ฌด ๋งŽ์ด ๋“ค๋ฆฌ๋Š” ๊ฒƒ ๊ฐ™์Œ) ํ˜„์žฌ๋กœ์„œ๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ• ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@ 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 ๋…„ ์ด์ƒ ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด ์•ฑ์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ง€์ • Slider ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ ๋‚ด ์•ฑ์˜ ๋งŽ์€ ๋ทฐ๊ฐ€ ๋ชจ๋‹ฌ์ด๊ธฐ ๋•Œ๋ฌธ์— Android์—์„œ ์ „ํ˜€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ํ™”๋ฉด๊ณผ ๋ชจ๋‹ฌ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ gestureHandlerRootHoC ๋ž˜ํ•‘ํ–ˆ์Šต๋‹ˆ๋‹ค (wix / react-native-navigation ์‚ฌ์šฉ).

๋‚˜๋Š” ์„ฑ๊ณตํ•˜์ง€ ์•Š๊ณ  gestureHandlerRootHoc ํ™”๋ฉด๊ณผ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ชจ๋‘ ๋ž˜ํ•‘ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋‹ฌ์—์„œ ์•„๋ž˜๋กœ ์Šค ์™€์ดํ”„ํ•˜์—ฌ ๋‹ซ๊ธฐ ๋™์ž‘์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด PanGestureHandler ๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— RectButton ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‹œ๋„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. iOS์—์„œ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค๋ง์Šค๋Ÿฝ๊ณ  ์‹ค์ œ๋กœ ์Šค ์™€์ดํ”„ํ•˜์—ฌ ์ฆ‰์‹œ ํ•ด์ œ ํ•  ์ˆ˜์žˆ๋Š” react-native-modal ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€์‹  ํ•ด๋‹น ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋ชจ๋‹ฌ ๋‚ด๋ถ€์— ์Šคํฌ๋กค ๊ฐ€๋Šฅํ•œ ์ฝ˜ํ…์ธ ๊ฐ€์—†๋Š” ํ•œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. iOS์™€ Android ๋ชจ๋‘์—์„œ ๋ฒ„๊ทธ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„ ๋ฉˆ์ถฐ ์žˆ์Šต๋‹ˆ๋‹ค.

์š”์•ฝํ•˜์ž๋ฉด :

  1. โŒ RNGH๋Š” react-native ์˜ <Modal> ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ gestureHandlerRootHOC ๋ž˜ํ•‘๋˜์–ด ์žˆ์–ด๋„)
  2. โœ… RNGH๋Š” Navigation.showModal ์‚ฌ์šฉํ•˜์—ฌ ํ‘œ์‹œ๋˜๋Š” wix/react-native-navigation ์˜ ํ™”๋ฉด์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค (ํ™”๋ฉด์ด gestureHandlerRootHOC ๋ž˜ํ•‘๋˜์–ด ์žˆ์–ด๋„).
  3. โœ… RNGH๋Š” modal: true ์™€ ํ•จ๊ป˜ react-navigation ์˜ ํ‘ธ์‹œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‘œ์‹œ๋˜๋Š” ๊ฒฝ์šฐ ๋ถ„๋ช…ํžˆ ์ž‘๋™ํ•˜์ง€๋งŒ ๊ธฐ๋ณธ ์Šคํƒ ( enableScreens() / createNativeStackNavigator() )์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@flysky ์™œ react-native-modal-animated ๊ฐ€ react-native-modal ๊ณผ ๊ฐ™์€ ๋ณ„๋„์˜ ํ™œ๋™์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ์œ„์— ์–ด๋–ป๊ฒŒ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๊นŒ? ์ ˆ๋Œ€ ์œ„์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@ waheedakhtar694 , ์•ฑ์†”๋ฃจํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ ์–ด๋„ ์ œ ๊ฒฝ์šฐ์—๋Š” ๋ฌธ์ œ ์—†์Šต๋‹ˆ๋‹ค : stuck_out_tongue_closed_eyes :

@jvaclavik https://github.com/callstack/react-native-paper ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ ํ–ˆ๋Š”๋ฐ์ด ๋ชฉ์ ์„ ์œ„ํ•ด ํŠน๋ณ„ํžˆ ์„ค๊ณ„๋œ Portal ์ด๋ผ๋Š” ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@jvaclavik์ด ๋งํ–ˆ๋“ฏ์ด react-native-paper์˜ Portal์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๋‚ด ์•ฑ์„ PaperProvider๋กœ ๋ž˜ํ•‘ ํ•œ ๋‹ค์Œ Modals๋ฅผ Views๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  gestureHandlerRootHOC ๋ฐ Portal๋กœ ๋ž˜ํ•‘ํ–ˆ์Šต๋‹ˆ๋‹ค
์ด์ œ ํ•˜๋‹จ ์‹œํŠธ๊ฐ€ 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 ๋ชจ๋‹ฌ์ด ๊ณจ์นซ๊ฑฐ๋ฆฌ ์ธ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋‘ ๊ฐœ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ๋ชจ๋‹ฌ์„ ์ œ๊ฑฐ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํฐ ๋””์ž์ธ ์ ๊ฒ€์ž…๋‹ˆ๋‹ค. : /

@DavidAPears gestureHandlerRootHOC ๋ชจ๋‹ฌ์„ ๋ž˜ํ•‘ ํ•ด ๋ณด์…จ๋‚˜์š”?

์ด ๊ฐ™์€ ?

const ModalInner = gestureHandlerRootHOC(function GestureExample() {
  return (
    <View>
      { RNGH components . }
    </View>
  );
});

export default function ModalForX() {
  return (
    <Modal animationType="slide" transparent={false}>
      <ModalInner />
    </Modal>
  );
}


react-native-portalize ์˜ Portal react-native-portalize ๋ฐ gestureHandlerRootHOC ์ด ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๊ฒƒ :

<Portal>
   <Modal>
      <GestureHandlerRootHOCWrappedComponent />
   </Modal>
</Portal>

๋ชจ๋‹ฌ ์ž‘์—…์— coverSreen = {false}๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‚ด ๋ชจ๋‹ฌ์ด ํ™”๋ฉด์„ ๋ฎ์–ด์•ผ ํ•ด

'react-native'์—์„œ {Platform, Modal} ๊ฐ€์ ธ ์˜ค๊ธฐ;
'react-native-gesture-handler'์—์„œ {gestureHandlerRootHOC} ๊ฐ€์ ธ ์˜ค๊ธฐ;
import {AnimatedBottomSheet} from '../AnimatedBottomSheet';

const AnimatedBottomSheetWrapper = Platform.OS === 'android'? gestureHandlerRootHOC (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>
  );
};
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰