web-dev-qa-db-ja.com

iOS 8 UIPageViewController遷移後の制約の適用

私のアプリには、ユーザーがアプリについて学ぶためにスワイプするマルチペインのチュートリアルスタイルのビューがあります。これは このチュートリアルで説明 として実装されます。 iOS 7とiOS 8の両方に実装した後、それらの動作を比較し、後者の問題を見つけています。Xcode6 GMここで実行しています。

遷移が完了した後、UIPageViewControllerがビューをレンダリングしているようです。デリゲートメソッドをオーバーライドして、何が起こっているのかを確認しました。

- (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers
{
   NSLog(@"Frame size before: %@", NSStringFromCGRect([(UIViewController*)pendingViewControllers[0] view].frame));
}

- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
{
   NSLog(@"Frame size after: %@", NSStringFromCGRect([(UIViewController*)previousViewControllers[0] view].frame));
}

次に、出力例を示します。

Frame size before: {{0, 0}, {600, 600}}
Frame size after: {{0, 0}, {320, 568}}

これは次のように現れます。左にスワイプして次のビューを表示し、新しいビューの下部にある32ポイントの空白に注意してください。移行が完了すると、適切なレイアウトになります。

これはおそらくiOS 8のバグですか?私はこの時点ですべて推測外です。

64
Aaron Vegh

View Controllerのレイアウトガイドではなく、Viewに基づいて制約を設定する必要があることがわかりました。これにより、ViewControllerが、PageViewControllerでの遷移の前に設定した制約を順守するようになります。

次のようにこれを行うことができます:

Constraints example

「マージンに制約」のチェックを外すことを忘れないでください

112
Darryl Bayliss

この問題を抱えている人にとって、私にとっては、「マージンに関連する」ビュー(iOS 8の新機能)をレイアウトしているように見えました。

の代わりに:

enter image description here

つかいます:

enter image description here

41
dfickling

私はこれに数日間苦労しました。

ストーリーボードからページViewControllerをインスタンス化して実装しようとしました。明確なサイズ変更が発生していました。フレームサイズを確認する

  1. pageViewController:viewControllerAfterViewController
  2. pageViewController:willTransitionToViewControllers
  3. pageViewController:didFinishAnimating:previousViewControllers

フレームサイズは、13の呼び出し間で常に変化します。 =。時々2の前に、時には後に。

ストーリーボードも使用している場合、ページUI要素を独自のXIBファイルに抽出し、IBで制約を設定してから、initWithNibName

完全な答えではありませんが、生産性を感じるようになりました。それが役に立てば幸い。

2
widano

私にとっての解決策は、tableViewの上部をスーパービューに固定することでした:Editor-> Pin-> Top Space To SuperView(iOS8)

1

これはiOS 8のバグですが、回避策が見つかりました。

ストーリーボードのステータスバーの上に空のビューを追加します。ビューの高さは、移動されるオブジェクトのy値と同じくらいでなければなりません。

Image of correct constraints

0
AmiiQo