RORK LABEN
TOOLING — Rorkの開発者向けリポジトリが動き続けています。rork-xcodeが7月16日、rork-deviceが7月15日、rork-plistが7月13日に更新されましたOPUS46 — RorkでClaude Opus 4.6が稼働しています。Rork MaxはClaude Codeを土台にアプリを組み立てる設計ですSIM — ブラウザ上で動くクラウドのiOSシミュレータを備え、実機へのインストールは1クリック、App Storeへの提出は2クリックと案内されていますMAX — Rork MaxはReact Nativeではなく純粋なSwiftを出力します。iPhone・iPad・Apple Watch・Apple TV・Vision Pro、そしてiMessageまでが射程ですNATIVE — HealthKit、ARKitとLiDAR、NFC、Dynamic Island、Live Activities、Metalによる3D、Core MLのオンデバイス推論まで扱えますSEED — RorkはLeft Lane Capitalが主導する1,500万ドルのシードラウンドを実施し、Peak XVとa16z Speedrunが参加しましたTOOLING — Rorkの開発者向けリポジトリが動き続けています。rork-xcodeが7月16日、rork-deviceが7月15日、rork-plistが7月13日に更新されましたOPUS46 — RorkでClaude Opus 4.6が稼働しています。Rork MaxはClaude Codeを土台にアプリを組み立てる設計ですSIM — ブラウザ上で動くクラウドのiOSシミュレータを備え、実機へのインストールは1クリック、App Storeへの提出は2クリックと案内されていますMAX — Rork MaxはReact Nativeではなく純粋なSwiftを出力します。iPhone・iPad・Apple Watch・Apple TV・Vision Pro、そしてiMessageまでが射程ですNATIVE — HealthKit、ARKitとLiDAR、NFC、Dynamic Island、Live Activities、Metalによる3D、Core MLのオンデバイス推論まで扱えますSEED — RorkはLeft Lane Capitalが主導する1,500万ドルのシードラウンドを実施し、Peak XVとa16z Speedrunが参加しました
記事一覧/開発ツール
開発ツール/2026-05-06中級

Rorkアプリでスワイプやタップが反応しない:よくある5つの原因と対処法

Rorkアプリでスワイプやタップなどのジェスチャーが反応しない問題の原因と解決法を解説します。GestureHandlerRootViewの未設定からzIndexの重なり問題まで、5つの典型パターンを具体的なコードで紹介します。

トラブルシューティング77ジェスチャーReact Native209GestureHandlerタッチイベント

Rorkで生成したアプリを実機で動かしていると、「スワイプしているのに画面が動かない」「ボタンを押しても無反応」という問題に出くわすことがあります。厄介なのは、コンソールにはエラーが一切出ないケースが多いことです。

こういった現象は、React NativeのGestureHandler周りの設定漏れや、コンポーネントの重なりによる競合が原因であることがほとんどです。RorkのAIは機能ロジックを正確に生成しますが、タッチイベントのレイヤー設計は人間が確認する必要がある部分でもあります。

実際によく起きる5つのパターンと、それぞれの修正方法を順番にご紹介します。

原因①:GestureHandlerRootViewが設定されていない

Expo SDK 50以降、react-native-gesture-handler を使う場合はアプリのルートを GestureHandlerRootView でラップすることが必須です。Rorkが生成するコードでは、スワイプ可能なカードやドラッグ&ドロップを含む画面を作った際にこの設定が省略されることがあります。

// ❌ よくある状態:ルートがラップされていない
import React from 'react';
import { NavigationContainer } from '@react-navigation/native';
import RootNavigator from './navigation/RootNavigator';
 
export default function App() {
  return (
    <NavigationContainer>
      <RootNavigator />
    </NavigationContainer>
  );
}
 
// ✅ 修正後:GestureHandlerRootViewでラップする
import React from 'react';
import { GestureHandlerRootView } from 'react-native-gesture-handler';
import { NavigationContainer } from '@react-navigation/native';
import RootNavigator from './navigation/RootNavigator';
 
export default function App() {
  return (
    <GestureHandlerRootView style={{ flex: 1 }}>
      <NavigationContainer>
        <RootNavigator />
      </NavigationContainer>
    </GestureHandlerRootView>
  );
}

style={{ flex: 1 }} を忘れると画面が縮んで表示が崩れることがあるので一緒に設定してください。この一行の追加で、スワイプ系のジェスチャーがまるごと動き出すことは珍しくありません。

原因②:透明なViewがタッチを横取りしている

zIndexposition: 'absolute' でコンポーネントを重ねた場合、目に見えない上位レイヤーのViewがタッチを横取りしてしまうことがあります。モーダルやオーバーレイ、グラデーション背景をRorkで生成した際に起きやすいパターンです。

// ❌ 問題のある状態:全画面の透明Viewがタッチを奪っている
<View style={{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0 }}>
  {/* 背景グラデーションなど */}
</View>
<TouchableOpacity onPress={handlePress}>
  <Text>押してもなぜか反応しない</Text>
</TouchableOpacity>
 
// ✅ 修正:pointerEventsを設定してタッチを透過させる
<View
  style={{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0 }}
  pointerEvents="none"
>
  {/* 背景だけのView — タッチは下のコンポーネントへ */}
</View>
<TouchableOpacity onPress={handlePress}>
  <Text>正常に反応するようになった</Text>
</TouchableOpacity>

デバッグ時は疑わしいコンポーネントを一時的に display: 'none' にしてジェスチャーが効くか確認するのが一番早いです。動くようになったら、元に戻して pointerEvents="none" を追加する、というフローで原因を特定できます。

原因③:ScrollViewとスワイプジェスチャーが競合している

ScrollView内でスワイプカードやスライダーを使うと、縦スクロールと横スワイプのどちらを優先すべきかでReact Nativeが迷い、どちらも中途半端にしか動かない現象が起きます。

// ✅ iOS向け:directionalLockEnabledで一方向にロック
<ScrollView directionalLockEnabled={true}>
  <SwipeableCard />
</ScrollView>
 
// ✅ GestureHandlerのPanGestureで方向を明示する方法
import { Gesture, GestureDetector } from 'react-native-gesture-handler';
import Animated, {
  useSharedValue,
  useAnimatedStyle,
  withSpring,
} from 'react-native-reanimated';
 
export function SwipeCard() {
  const translateX = useSharedValue(0);
 
  const swipeGesture = Gesture.Pan()
    .activeOffsetX([-10, 10])   // 横10px以上動いたら認識
    .failOffsetY([-5, 5])       // 縦に5px動いたらスクロールに譲る
    .onUpdate((event) => {
      translateX.value = event.translationX;
    })
    .onEnd(() => {
      translateX.value = withSpring(0);
    });
 
  const animatedStyle = useAnimatedStyle(() => ({
    transform: [{ translateX: translateX.value }],
  }));
 
  return (
    <GestureDetector gesture={swipeGesture}>
      <Animated.View style={[styles.card, animatedStyle]}>
        {/* カードの中身 */}
      </Animated.View>
    </GestureDetector>
  );
}

activeOffsetXfailOffsetY の組み合わせがポイントです。これを設定するだけで、縦スクロールと横スワイプの競合がほとんどのケースで解消します。

Rorkでアニメーションのより高度な実装をしたい場合は、Reanimated × Gesture Handlerで作るスワイプアニメーション完全ガイドも参考にしてください。

原因④:Androidでタッチの反応が遅い・効かないように見える

Androidでは TouchableNativeFeedbackPressable のrippleエフェクトが、タッチの応答を体感的に遅く見せることがあります。これ自体はバグではありませんが、カード型UIのスワイプと組み合わさると「タッチが効かない」と誤解されやすいです。

// ✅ Pressableでタッチ遅延を最小化する
<Pressable
  onPress={handlePress}
  android_ripple={{ color: 'rgba(0,0,0,0.1)' }}
  unstable_pressDelay={0}  // タッチ認識の遅延をゼロに
  style={({ pressed }) => [
    styles.card,
    { opacity: pressed ? 0.85 : 1 },
  ]}
>
  <Text>レスポンスの良いボタン</Text>
</Pressable>

unstable_pressDelay={0} は名前に「unstable」が含まれていますが、実用上は安定して動作します。ただし将来のReact Nativeバージョンで挙動が変わる可能性があるため、アップデート時には確認が必要です。

また、Androidの hitSlop を設定してタッチ範囲を広げることも有効です。

<Pressable
  onPress={handlePress}
  hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }}
>
  <Text>タッチしやすいボタン</Text>
</Pressable>

アイコンボタンや小さなUIパーツが「押せない」と感じる場合は、hitSlop を試してみてください。

原因⑤:Modal内のジェスチャーが検知されない

React NativeのModalコンポーネント内でGestureHandlerを使う場合は、追加の設定が必要です。ModalはネイティブのWindowに描画されるため、アプリルートに置いた GestureHandlerRootView のスコープ外になってしまいます。

// ❌ Modal内のスワイプが効かない状態
import { Modal } from 'react-native';
 
<Modal visible={isVisible} transparent animationType="slide">
  <SwipeableBottomSheet />  {/* ← ジェスチャーが認識されない */}
</Modal>
 
// ✅ Modal内でも個別にGestureHandlerRootViewをラップする
import { Modal } from 'react-native';
import { GestureHandlerRootView } from 'react-native-gesture-handler';
 
<Modal visible={isVisible} transparent animationType="slide">
  <GestureHandlerRootView style={{ flex: 1 }}>
    <SwipeableBottomSheet />  {/* ← 正常に動作する */}
  </GestureHandlerRootView>
</Modal>

ボトムシートをModalで実装している場合に特に起きやすいパターンです。@gorhom/bottom-sheet などのサードパーティライブラリを使っている場合も同様で、ライブラリのドキュメントにModal対応の設定が記載されていることが多いので確認してみてください。

それでも解決しない場合のチェックリスト

上記の5つで解決しない場合は、以下を順番に確認してください。

  • react-native-gesture-handlerreact-native-reanimated のバージョンが互換性を持っているか(package.json で照合)
  • Expo SDKのバージョンと各ライブラリが対応しているか(Expo公式の互換性テーブルを確認)
  • Expo GoではなくEAS Buildした実機ビルドで試したか(Expo GoはGesture Handlerの挙動が本番と異なる場合がある)
  • iOSとAndroidで挙動が違う場合は、プラットフォーム別の処理が必要なサインです

Rorkのプロンプトで「ジェスチャーが動かない、GestureHandlerRootViewを確認してほしい」と具体的に伝えると、AIが的確な修正を提案してくれることがあります。エラーが出ていない分、漠然と「動かない」と伝えるだけでは原因を特定しにくいので、この記事で絞り込んだ仮説を一緒に伝えると解決が早まります。

アプリの品質をさらに上げるための次のステップとして、Rorkアプリのエラーハンドリングとクラッシュ防止の基本もあわせて読んでみてください。

シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

もしこの記事がお役に立ちましたら、チップ(¥150)で応援いただけると大変励みになります。広告なしでの運営を続けるため、皆さまのご支援が大きな力になっています。

関連記事

開発ツール2026-07-08
SVGアイコンがExpo Goでは出るのにビルドで消える — Rork製アプリでSVGを確実に表示する
Rork や Expo のアプリで .svg ファイルを import してもアイコンが表示されない、色が反映されないという問題を、metro.config.js と react-native-svg-transformer の設定、currentColor によるテーマ追従まで実際のコードで解決します。
開発ツール2026-06-12
Rork 製アプリの『書類とデータ』が数 GB に膨らむときの原因と対処 — expo-image のディスクキャッシュ管理
アプリ本体は小さいのに『書類とデータ』だけが数 GB に膨らむ——壁紙アプリの運用で実際に踏んだ expo-image のディスクキャッシュ肥大を、cachePolicy の使い分け・縮小版配信・世代別クリアの三段構えで解決した記録です。
開発ツール2026-05-25
Rork で targetSdkVersion 35 にしたら Android のレイアウトが下まで埋まる問題の直し方
Android 15 (API 35) で強制されるエッジ・トゥ・エッジ表示によって、Rork で生成したアプリの下部タブやヘッダーがシステムバーに食い込む問題を、react-native-edge-to-edge と useSafeAreaInsets を使って実装パターン別に解決します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →