0

3 つのナビゲーション コントローラーを備えたルート ページ ビュー コントローラーがあり、それぞれが最初にメイン テーブルを備えたビュー コントローラーに移動します。ユーザーがテーブルをクリックすると、プッシュが別の VC (詳細テーブル付き) に移動するセグエがあります。

遷移スタイルはスクロールです。

それはうまくいきます。しかし、次の効果があります。ページのスクロールはどこでも機能します。ユーザーがテーブルvcにいる場合にのみ、ページ間をスクロールする必要があります。詳細テーブル vc を左にスワイプすると、メイン テーブル vc に戻るのではなく、前のナビゲーション コントローラーに移動します。

説明されている動作を修正するにはどうすればよいですか? X コード 5、iOS 7

Upd: メソッドの前/後にデータソースで nil を返すことでページ遷移を防ぐことができますが、画面にスクロールが表示されたままです。

2 つの方法でデータソースを nil に設定してスクロールを無効にしようとしたとき: 1) pageViewController:didFinishAnimating) で例外があります: キャッチされていない例外 'NSInternalInconsistencyException' によるアプリの終了、理由: '無効なパラメーターが満たされていない: [views count] = = 3' 2) willAppear /willDisapper のメイン テーブル vc にあり、例外があります: キャッチされない例外 'NSGenericException' が原因でアプリを終了しています。

Upd 2: 私のプロジェクトへのリンク: http://yadi.sk/d/MWmdA3XLCdn4U . 「ダウンロード」画像のある青いボタンを押してファイルを取得するか、ページの下部にある言語スイッチャーを使用します。

Upd 3: デビッドに感謝します。彼のソリューションは機能しています。さらに、ストーリーボードの DetailTable VC に Pan GR を配置し、それをビューにリンクするだけです。コードは一切必要ありません。

4

1 に答える 1

2

次の 2 つのアイデアが思い浮かびます。

  • サブクラス UIPageViewController を作成し、サブクラスで、View Controller の配列を「実際の」配列から現​​在表示されている配列に変更するメソッドを提供します。ユーザーにはこれによる影響は見られませんが、ページ コントローラーが何も実行できなくなります。明らかに、ルート ビューに戻ったら、ページ ビュー コントローラーに変更を元に戻すように指示します (実際の配列にスワップします)。 .

  • dataSource プロトコルを実装し、ページングを防止したい場合に dataSource が次/前のビュー コントローラに対して nil を返すようにフラグを設定します。

注: pageController でこれを行ったことはありませんが、ナビゲーション コントローラーで同様のことを行いました。

EDIT1:私はあなたのプロジェクトで遊んでいました。はい、スクロールを防ぐのは簡単ではありませんが、可能です。重要な問題は、ページ コントローラーに、ページをホストしているスクロールビュー サブビューがあることです。ドラッグ動作を認識して応答するパン ジェスチャ レコグナイザーが含まれています。残念ながら、ページ コントローラーの "スクロール" バリエーションでは、ジェスチャ レコグナイザーは公開されていません。SOには、この件全体に関する興味深いスレッドがあります。

したがって、いくつかのオプションがあります。

  • サブビューでスクロール ビューを探し、ジェスチャ レコグナイザーを見つけて無効にします。

  • 同じスクロールビューを無効にする

  • 最初のView Controllerをプッシュした後、いくつかの凝ったトリックを行います. ただし、アニメーションが終了したら、そのビューをサブビューから引き出し、ウィンドウからページング コントローラーを削除し、引き出したビューをルート ビュー コントローラーとして直接インストールします。これは動作させることができますが、オフセットが変更されるためです。ウィンドウと同じサイズの透明なビューを実際に作成し、そこにプルされたビューを最初に挿入する必要がある場合があります。

  • 独自のパン ジェスチャ レコグナイザを追加し、結果を無視します。そのため、ページングが不要なビューの viewDidLoad で、以下のコードを追加します。それはかなりうまくいくようです。

コード:

UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
[self.view addGestureRecognizer:pan];

EDIT2: これを行うための推奨される方法は、上記のコードに示すように、独自のパン ジェスチャ認識エンジンを使用することです。あなたができることは、ページング コントロールをアクティブにしたくないというビューが表示されたときに、viewDidLoad にジェスチャ レコグナイザーを追加することです。ユーザーがメイン ビューに戻ると、そのパン レコグナイザーはアクティブではなく、ページ コントロールは正常に機能します。デモプロジェクトでこれを試しましたが、うまくいきます。

他の方法も機能させることができますが、ご覧のとおりより複雑です。scrollView またはそのレコグナイザーを変更するには、ページ ビューのサブビューを調べなければなりませんが、これは Apple が眉をひそめ、壊れやすいものです (つまり、将来簡単に壊れる可能性があります)。サブクラスにパブリック メソッドを提供し、各サブビューへのページ コントロールへの参照を取得する方法を理解する必要があります。

于 2013-11-13T15:14:47.597 に答える