RORK LABJP
PLAY — Google Play's target API level 36 requirement took effect yesterday, August 31. From today, new apps and updates must target Android 16VISIBILITY — Apps still on API 35 stay listed but disappear for users on newer Android versions. No error is raised; new installs simply fade, which makes the change easy to missEXTENSION — If you missed the deadline, an extension through November 1, 2026 can be requested in Play Console — best filed alongside a concrete migration planAPPLE — On the Apple side, the event lands September 9 and iOS 27 is reported to ship September 14. Testing generated apps on iOS 27 hardware before release week is time well spentEXPO — Expo released expo-paste-input on August 28, a native module that brings image, GIF, and sticker paste to React Native TextInputEAS — EAS Observe reached general availability on August 20, putting crash and performance monitoring on the same EAS platform as builds and updatesPLAY — Google Play's target API level 36 requirement took effect yesterday, August 31. From today, new apps and updates must target Android 16VISIBILITY — Apps still on API 35 stay listed but disappear for users on newer Android versions. No error is raised; new installs simply fade, which makes the change easy to missEXTENSION — If you missed the deadline, an extension through November 1, 2026 can be requested in Play Console — best filed alongside a concrete migration planAPPLE — On the Apple side, the event lands September 9 and iOS 27 is reported to ship September 14. Testing generated apps on iOS 27 hardware before release week is time well spentEXPO — Expo released expo-paste-input on August 28, a native module that brings image, GIF, and sticker paste to React Native TextInputEAS — EAS Observe reached general availability on August 20, putting crash and performance monitoring on the same EAS platform as builds and updates
Articles/App Dev
App Dev/2026-07-14Intermediate

Long-Press Context Menus for a Gallery Item in a Rork Expo App

Long-pressing a wallpaper card does nothing, yet iOS users expect a preview and a menu. From why Pressable alone falls short, to a native context menu with zeego, resolving the scroll-vs-long-press conflict, wiring up save and share, and a custom overlay fallback for Android — all with working code.

Rork547Expo193React Native234context menuwallpaper app22

Premium Article

I was scrolling a wallpaper gallery on a real device and, almost absentmindedly, long-pressed a card. Nothing happened. Anyone used to an iPhone has muscle memory from the Photos app and the home screen: press and hold, and a preview with a menu should appear. Answering that expectation with silence makes the whole app feel a notch cheaper. Working on wallpaper apps as an indie developer, I have watched this small friction quietly cost engagement more than once.

The list screens Rork generates usually wrap a Pressable with nothing but a tap-to-navigate handler. Let us start there and work out why the long-press menu, specifically, needs one extra step.

What onLongPress leaves on the table

Pressable ships with onLongPress, so detecting the gesture itself is trivial.

<Pressable onPress={openDetail} onLongPress={() => setMenuOpen(true)}>
  <Image source={item.uri} style={styles.card} />
</Pressable>

But all this can raise is a sheet or modal you drew yourself. It is not the experience iOS shows by default — the target lifting gently, the background blurring, the preview appearing before you even release your finger. That lift and blur come from UIContextMenuInteraction, a native mechanism you cannot fully reproduce by stacking views from JavaScript.

So the decision comes down to this. If matching the behavior iOS users already know is the priority, bridge to a native context menu. If you want full control over the animation or a unified look on Android, build your own around onLongPress. For a wallpaper app that only needs the familiar trio of save, share, and favorite, the native route wins on both experience and effort.

Decide between two approaches first

Before writing anything, here is the trade-off on one page.

ConcernNative context menu (zeego)Custom overlay (Reanimated)
iOS preview liftExactly as standardClose, but hard to match fully
Consistent Android lookFollows the Material popupFully yours to design
Implementation effortLowHigh (gestures and geometry)
Dynamic menu itemsSomewhat constrainedFlexible

For the gallery I wanted the iOS feel out of the box, so I built with zeego first and only pulled the pieces I cared about on Android into a custom path. zeego is a thin wrapper over the native context menu, and it falls back to a regular menu where the native one is unavailable. When in doubt, I would start from zeego.

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
Why Pressable's onLongPress alone never gives you the iOS preview-and-menu experience, and where the line is
Building a native context menu with zeego and resolving the scroll-vs-long-press conflict via delayLongPress
Bundling save, share, and favorite into one menu, and switching to a custom overlay on Android
Secure payment via Stripe · Cancel anytime

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Rork Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $15 for lifetime access
View Membership →

Related Articles

App Dev2026-08-16
My chart broke on day one, not at scale
A line chart that vanished for anyone with only a few days of data. The cause was a zero-height Y axis turning coordinates into NaN. Here is the measured behavior and the small normalization layer that fixed it.
App Dev2026-08-06
Deciding overlay text legibility at ingest time instead of on device — four metrics measured side by side
Moving the question of whether text stays readable over a wallpaper out of the device and into the content pipeline. Four candidate metrics measured across 240 images, including what downscaled judging actually computes.
App Dev2026-07-07
Laying Out Variable-Height Images in Two Columns: A Masonry Wallpaper Gallery in a Rork Expo App
From why numColumns cannot pack variable-aspect images cleanly, to a dependency-free column-balancing algorithm, to keeping virtualization with FlashList masonry and a pragmatic no-dependency fallback, building a wallpaper gallery with real code.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →