iOS 6、ページングUIScrollView、および純粋な自動レイアウトを使用しています。モーダルビューコントローラを無効にした後、フレームに自動レイアウトの制約が反映されない
要約:コンテンツのページをスクロールするView Controllerを作成しました。一部のビューはストーリーボードで作成され、設定されます。ビュー階層は次のとおりです。
- Main view (storyboard)
- UIScrollView (storyboard)
- content view (programmatically)
- subviews representing pages of content (programmatically)
スクロールビューの制約は、IBで設定されています。ここで私はコード内のコンテンツビューのための制約を設定した方法は次のとおりです。
- (void)viewDidLoad
{
// ABPageScrollerContentView is a subclass of UIView; it overrides intrinsicContentSize; the size is calculated without referencing the scroll view's dimensions
self.contentView = [[ABPageScrollerContentView alloc] init];
self.contentView.translatesAutoresizingMaskIntoConstraints = NO;
[self.pageScrollerView addSubview:self.contentView];
// configure constraints between scroll view and content view...
UIView *contentView = self.contentView;
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(contentView);
[self.pageScrollerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[contentView]|" options:0 metrics:0 views:viewsDictionary]];
[self.pageScrollerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contentView]|" options:0 metrics:0 views:viewsDictionary]];
// the content view's subviews are added/removed in the tilePages method (not shown); tilePages is called later in the view controller lifecycle...
}
、ユーザが編集ボタンをタップすると、別のビューコントローラは、ストーリーボードにセグエを使用してモーダルモードで表示されます。 View Controllerが終了すると、制約が変更されていなくても、システムは不可解にコンテンツビューのフレームを変更するように見えます。
は、私は次のデリゲートメソッドで提示ビューコントローラを却下:- (void)didExitEditPageViewVC:(id)controller
{
// update currently displayed page view from data model...
// logged content view frame = (0, 0; 1020, 460)
[self dismissViewControllerAnimated:YES completion:^{
// logged content view frame = (-170, 0; 1020, 460)
}];
}
が、私は、フレームの原点のx成分が0から-170に変更する方法を理解していません。この制約は、View Controllerを閉じる前と後で同じです。完了:ここ
は右dismissViewControllerAnimatedを呼び出す前に、フレームと制約である方法:提示ビューコントローラが再表示された後
(lldb) po self.contentView
$0 = 0x1ede2b40 <AEBPageScrollerContentView: 0x1ede2b40; frame = (0 0; 1020 460); layer = <CALayer: 0x1edd6f00>>
(lldb) po self.pageScrollerView.constraints
$1 = 0x1ed076c0 <__NSArrayM 0x1ed076c0>(
<NSLayoutConstraint:0x1ede2980 H:|-(0)-[AEBPageScrollerContentView:0x1ede2b40] (Names: '|':UIScrollView:0x1edd3410)>,
<NSLayoutConstraint:0x1eded480 H:[AEBPageScrollerContentView:0x1ede2b40]-(0)-| (Names: '|':UIScrollView:0x1edd3410)>,
<NSLayoutConstraint:0x1edecbc0 V:|-(0)-[AEBPageScrollerContentView:0x1ede2b40] (Names: '|':UIScrollView:0x1edd3410)>,
<NSLayoutConstraint:0x1ede1040 V:[AEBPageScrollerContentView:0x1ede2b40]-(0)-| (Names: '|':UIScrollView:0x1edd3410)>
)
ここでは、フレームと制約です:
contentView = <AEBPageScrollerContentView: 0x1ede2b40; frame = (-170 0; 1020 460); layer = <CALayer: 0x1edd6f00>>
self.pageScrollerView.constraints =
(
"<NSLayoutConstraint:0x1ede2980 H:|-(0)-[AEBPageScrollerContentView:0x1ede2b40] (Names: '|':UIScrollView:0x1edd3410)>",
"<NSLayoutConstraint:0x1eded480 H:[AEBPageScrollerContentView:0x1ede2b40]-(0)-| (Names: '|':UIScrollView:0x1edd3410)>",
"<NSLayoutConstraint:0x1edecbc0 V:|-(0)-[AEBPageScrollerContentView:0x1ede2b40] (Names: '|':UIScrollView:0x1edd3410)>",
"<NSLayoutConstraint:0x1ede1040 V:[AEBPageScrollerContentView:0x1ede2b40]-(0)-| (Names: '|':UIScrollView:0x1edd3410)>"
)
コンテンツビューのフレームが突然変更されたのはなぜですか?なぜそれが制約によって指示されるものと一致しないのですか?
hasAmbiguousLayoutの呼び出しが遅延すると、驚いたことにfalseが返されます。例外はスローされません。コンテンツビューは一部オフスクリーンですが、スクロールビューもスクロールします。
いいえどこでスクロールビューのコンテンツサイズを明示的に設定しますか。私はシステムにそれを残す。コンテンツビューには本質的なサイズがあります(コンテンツビューのサイズは問題ありませんが、コンテンツビューの原因は問題です)。
ビューコントローラを閉じる前と後でスクロールビューのコンテンツオフセットが同じです。しかしながら、コンテンツビューの原点のx成分の変位は、コンテンツオフセットに比例する。コンテンツオフセットが大きいほど、モーダルビューコントローラが閉じられた後のコンテンツビューの原点のx成分がより負になります。そして、「ゼロ」のコンテンツオフセットでは、x成分はゼロである。したがって、モーダル・ビュー・コントローラがコンテンツの第1のページを見ている間(コンテンツ・オフセットが「ゼロ」のとき)に提示される場合、コンテンツ・コントローラのビュー・コントローラの解雇時に、コンテンツ・ビューのフレームは正しい。 0のコンテンツオフセットは、コンテンツビューのフレームが制約を正しく反映している唯一の状況です。
私は結果のないさまざまな場所でlayoutIfNeededへの呼び出しを挿入しようとしました。
提案がありますか?
賢いソリューション: – bilobatum