33

UIPageViewControllerのページングをセットアップしましたImageViewController

には、内側ImageViewControllerに が含まれています。他には何もありません。UIScrollViewUIImageView

現在、データソースの 3 つの「アイテム」UIPageViewController(つまり 3 ページ) でテストしています。

それはすべて正常に機能し、スクロールしてズームし、約 30 秒間ページを移動すると、突然この警告が表示されます...

*** Assertion failure in -[_UIQueuingScrollView _didScrollWithAnimation:force:], /SourceCache/UIKit/UIKit-2372/_UIQueuingScrollView.m:778

私のコードを指しておらず、スタックなどに私のコードがないため、どこからデバッグを開始すればよいかわかりません。

誰かがこれのデバッグを開始する場所についてのポインタを教えてもらえますか?

編集

もう少しテストを行いました。scrollView が減速している場合 (つまり、フリック後) に発生するようで、スクロールビューがまだ移動しているため、PageViewController を別の ViewController に移行しようとします。

次のページへの遷移の約 20% でアプリがクラッシュします。

編集2

エラーは _cache_getImp 行で停止しているようです (大文字の i か小文字の L かは不明です)。

編集3

これで良くなります。Apple の PhotoScroller サンプル アプリをダウンロードして、彼らが別の方法で問題を回避したかどうかを確認しました。いいえ、そうではありませんでした。サンプル アプリは、私の場合とまったく同じようにクラッシュします。クラッシュする可能性を高めるには、ページのズームとスクロール、および遷移を同時に行う必要がありますが、それはそれ自体でも発生し、発生するまでに時間がかかる場合があります.

4

5 に答える 5

5

解決策を思いつきました!私の場合、ユーザーがビューページャーをタップして進むことができるようにするボタンと次へのボタンがありますUIPageViewControllerUIPageViewControllerTransitionStyleScrollユーザーが次のボタンを押して、指を離す前に (まだボタンのフレーム内で) 少しドラッグすると、このクラッシュが発生します。この場合、ボタン内でのドラッグがUIPageViewControllerのパン ジェスチャ レコグナイザに干渉しているようで、それがクラッシュの原因です。

ユーザーがこの状態になる可能性はほとんどありませんが、クラッシュが発生した場合にアプリがクラッシュするのを防ぐ比較的簡単な解決策を考え出しました。ユーザーが次の画面に移動する有効な状態にあるかどうかを表すブール値があり、タッチダウン時にそれを YES に設定し、ユーザーがボタン内の任意の場所をドラッグすると NO に設定します。次に、 touchUp (nextPressed) で、UIPageViewControllerプログラムで移動する前にブール値をチェックします。

- (IBAction)touchDown:(id)sender
{
  self.shouldAdvanceToNextScreen = YES;
}

- (IBAction)touchDragInside:(id)sender
{
  self.shouldAdvanceToNextScreen = NO;
}

- (IBAction)nextPressed:(id)sender
{
  if (self.shouldAdvanceToNextScreen) {
    UIViewController *initialViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"TutorialScreen2"];
    NSArray *viewControllers = [NSArray arrayWithObject:initialViewController];
    [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil];
  }
}

欠点は、ユーザーがボタン フレーム内で指を離しても何も起こらないことです。ただし、私はクラッシュよりもこれを好み、これは非常にまれなエッジ ケースであると考えています。ユーザーがもう一度タップするだけで (今回はタップ & ドラッグなしで)、正常に前進することを期待しています。

これをさらに一歩進めて、タッチドラッグとUIPageViewController全体の衝突を防ぐためのアイデアを歓迎します.

于 2013-12-14T10:56:06.007 に答える
1

UIScrollView でバウンスを無効にしてみましたか? それは私にとってはうまくいき、上記のコメントでほのめかされた他の問題も解決しました。

于 2012-12-03T14:15:18.237 に答える
0

同様の問題がありました。私のセットアップはで、内部UIPageViewControllerでビュー コントローラーを読み込んでいました。UIImageViewスクロール中UIPageViewControllerに操作すると、同じクラッシュ ログが表示されました。

を作成して修正し、のスクロール ビューUILongPressGestureRecognizerに追加しました。UIPageViewController

  1. 独自のサブクラスを作成しましたUIPageViewController(ソリューションは私のケースに固有ですが、一般的なソリューションとして簡単に使用できます)

  2. の内部 UIScrollView を見つけますUIPageViewController

    - (UIScrollView *)findScrollView
    {
        UIScrollView *scrollView;
        for (id subview in self.view.subviews)
        {
            if ([subview isKindOfClass:UIScrollView.class])
            {
                scrollView = subview;
                break;
            }
        }
    
        return scrollView;
    }
    
  3. ロング タップ ジェスチャ レコグナイザーを内側のスクロール ビューに追加し、そのアクションをメソッドまたは nil にポイントします。

    /**
     *  On tap-hold the page view controller crashes as soon as it pages to a new view controller.
     *  Setting a long press gesture to ignore the hold.
     */
    - (void)listenForLongPressGestureOnScrollView:(UIScrollView *)scrollView
    {
        UILongPressGestureRecognizer *longPressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:nil];
        [longPressGestureRecognizer setMinimumPressDuration:0.5];
        [scrollView addGestureRecognizer:longPressGestureRecognizer];
    }
    
于 2014-05-13T16:52:17.437 に答える