메인 콘텐츠로 건너뛰기
Back to plugins
@capgo/capacitor-transitions
튜토리얼
@capgo/capacitor-transitions

전환

iOS 에지 스와이프 백 가젯과 Ionic UI 없이 Ionic-style 페이지 전환을 추가합니다.

데모

Animated WebP 데모

iOS 스타일 Capacitor 페이지 전환을 보여주는 React 라우터 흐름.

원본 자산
앞으로 후로 네비게이션을 보여주는 Capacitor 스타일 셸에서 React 페이지 전환 데모
React 전환 흐름

안내

__CAPGO_KEEP_0__ 전환에 대한 튜토리얼

__CAPGO_KEEP_0__

Download the Capgo app, then scan the QR code.

code

Using @capgo/capacitor-transitions

@capgo/capacitor-transitions adds Ionic-style route transitions to Capacitor apps without adopting Ionic UI. It runs in the web layer, keeps your existing router, and can auto-enable an iOS edge swipe-back gesture only inside native Capacitor iOS.

__CAPGO_KEEP_0__

npm install @capgo/capacitor-transitions

code

요소들을 등록하세요

import '@capgo/capacitor-transitions';

페이지들을 wrapping하세요

<cap-router-outlet platform="auto" swipe-gesture="auto">
  <cap-page>
    <cap-header slot="header">
      <h1>Inbox</h1>
    </cap-header>

    <cap-content slot="content">
      <button>Open message</button>
    </cap-content>

    <cap-footer slot="footer">
      <nav>Tabs</nav>
    </cap-footer>
  </cap-page>
</cap-router-outlet>

라우터에 연결하세요

정상적인 라우트 업데이트하기 전에 전환 방향을 설정하세요:

import { setDirection } from '@capgo/capacitor-transitions/react';

setDirection('forward');
router.push('/message/42');

setDirection('back');
router.back();

React 예시

import { useEffect, useRef } from 'react';
import { useNavigate } from 'react-router-dom';
import { initTransitions, setDirection, setupPage, setupRouterOutlet } from '@capgo/capacitor-transitions/react';
import '@capgo/capacitor-transitions';

initTransitions({ platform: 'auto' });

export function AppShell() {
  const outletRef = useRef<HTMLElement>(null);

  useEffect(() => {
    if (!outletRef.current) return;
    setupRouterOutlet(outletRef.current, { platform: 'auto', swipeGesture: 'auto' });
  }, []);

  return <cap-router-outlet ref={outletRef}>{/* routes */}</cap-router-outlet>;
}

export function InboxPage() {
  const navigate = useNavigate();
  const pageRef = useRef<HTMLElement>(null);

  useEffect(() => {
    if (!pageRef.current) return;
    return setupPage(pageRef.current);
  }, []);

  return (
    <cap-page ref={pageRef}>
      <cap-header slot="header">
        <h1>Inbox</h1>
      </cap-header>
      <cap-content slot="content">
        <button
          onClick={() => {
            setDirection('forward');
            navigate('/message/42');
          }}
        >
          Open message
        </button>
      </cap-content>
    </cap-page>
  );
}

React subpath는 JSX 타이핑을 포함하여 커스텀 요소에 대한 지원을 제공합니다. TypeScript가 여전히 cap-router-outlet 이런 오류를 보고한다면, JSX.IntrinsicElements파일을 추가하세요:

// src/capgo-transitions.d.ts
import '@capgo/capacitor-transitions/react';

Vite, Create React App, 그리고 대부분의 webpack React 앱의 경우, src/ 파일을 포함하는 폴더에 두면 충분합니다. Next.js 또는 커스텀 TypeScript 설정의 경우, tsconfig.json:

{
  "include": ["src", "src/capgo-transitions.d.ts"]
}

이 파일을 포함하도록 보장하세요

스와이프 백을 활성화하세요 swipe-gesture="auto" iOS 네이티브 런타임이 보고할 때만 제스처를 활성화하십시오: Capacitor

<cap-router-outlet swipe-gesture="auto"></cap-router-outlet>

JavaScript에서 강제로 사용할 수도 있습니다:

const outlet = document.querySelector('cap-router-outlet');

outlet?.setSwipeGesture(true);
outlet?.setSwipeGesture(false);
outlet?.setSwipeGesture('auto');

제스처는 손가락이 전환하는 동안 따라가고, 사용자가 손가락을 놓을 때 완료되거나 취소됩니다. 추가 data-swipe-gesture-ignore 버튼, 슬라이더 또는 드로어에 Edge 제스처를 시작하지 않도록 하려면:

네이티브 네비게이션과 함께 사용

네이티브 레이어가 네비게이션 바 또는 탭 바를 소유할 때: @capgo/native-navigation 설정

npm install @capgo/native-navigation
npx cap sync

네이티브 크롬을 구성하고 WebView 페이지의 전환에 집중하세요:

import { NativeNavigation } from '@capgo/native-navigation';
import { setDirection } from '@capgo/capacitor-transitions/react';
import { router } from './router';

await NativeNavigation.configure({
  contentInsetMode: 'css',
});

await NativeNavigation.setNavbar({
  title: 'Inbox',
  backButton: { visible: false },
});

await NativeNavigation.addListener('navbarBack', () => {
  setDirection('back');
  router.back();
});

async function openMessage(id: string) {
  setDirection('forward');
  router.push(`/message/${id}`);

  await NativeNavigation.setNavbar({
    title: 'Message',
    backButton: { visible: true, title: 'Inbox' },
  });
}

이용 cap-content animated page body와 네이티브 네비게이션 CSS 변수를 사용하여 insets:

<cap-router-outlet platform="auto" swipe-gesture="auto">
  <cap-page>
    <cap-content slot="content" fullscreen>
      <main class="native-page">Inbox content</main>
    </cap-content>
  </cap-page>
</cap-router-outlet>
.native-page {
  padding-top: var(--cap-native-navigation-top);
  padding-bottom: var(--cap-native-navigation-bottom);
}

네이티브 네비게이션 바를 중복하여 움직이는 웹 헤더로 사용하지 마십시오. @capgo/native-navigation 바를 네이티브로 유지합니다. @capgo/capacitor-transitions 페이지 내용 아래에 애니메이션을 합니다.

Full Reference

Using @capgo/capacitor-transitions

native 미디어 및 인터페이스 동작을 계획하고 있는 경우 Using @capgo/capacitor-transitions native 미디어 및 인터페이스 동작을 계획하고 있는 경우 @__CAPGO_KEEP_0__/__CAPGO_KEEP_1__-transitions @capgo/capacitor-transitions Using @capgo/capacitor-transitions native 미디어 및 인터페이스 동작을 계획하고 있는 경우 @__CAPGO_KEEP_0__/__CAPGO_KEEP_1__-transitions for the implementation detail in Getting Started, Using @capgo/capacitor-live-activities for the native capability in Using @capgo/capacitor-live-activities, @capgo/capacitor-live-activities for the implementation detail in @capgo/capacitor-live-activities, and Using @capgo/capacitor-video-player for the native capability in Using @capgo/capacitor-video-player.