Używam iOS 6, stronicującego UIScrollView i czystego automatycznego układu.Ramka nie odzwierciedla ograniczeń automatycznego układu po zwolnieniu kontrolera widoku modalnego.
Podsumowanie: Stworzyłem kontroler widoku, który przewija strony zawartości. Niektóre widoki są tworzone i konfigurowane w storyboardzie, inne są programowane. Oto hierarchia widoków:
- Main view (storyboard)
- UIScrollView (storyboard)
- content view (programmatically)
- subviews representing pages of content (programmatically)
Ograniczenia dla widoku przewijania są konfigurowane w IB. Oto jak ja skonfigurowane ograniczenia dotyczące zawartości widoku w kodzie:
- (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...
}
Jeżeli użytkownik kliknie przycisk Edytuj, inny kontroler widoku jest przedstawiony modally użyciu segue w serii ujęć. Po zwolnieniu kontrolera widoku system wydaje się w niewytłumaczalny sposób modyfikować ramkę widoku treści, mimo że ograniczenia są niezmienione.
I odrzucenie przedstawionego kontroler widoku w następujący sposób Delegat:
- (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)
}];
}
Nie rozumiem, w jaki sposób x składnik pochodzenia ramy zmieniło od 0 do -170. Ograniczenia są identyczne przed i po zwolnieniu kontrolera widoku.
Oto ramy i ograniczenia tuż przed wywołaniem dismissViewControllerAnimated: Zakończenie: metody:
(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)>
)
Oto ramy i ograniczenia po widoku przedstawianie kontrolerów pojawi się ponownie:
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)>"
)
Dlaczego ramka widoku treści zmieniła się nieoczekiwanie? I dlaczego nie pasuje do tego, co jest podyktowane ograniczeniami?
Opóźnione wywołanie metody hasAmbiguousLayout zwraca fałszywie zaskakująco. Nie są zgłaszane żadne wyjątki. Nawet przewijany widok jest przewijany, chociaż widok zawartości jest częściowo poza ekranem.
Nie, gdzie wyraźnie określić rozmiar treści widoku przewijania; Zostawiam to systemowi. Widok treści ma nieodłączny rozmiar (rozmiar widoku treści wydaje się być w porządku, ale przyczyną jest widok pochodzenia zawartości).
Przesunięcie widoku przewijania jest takie samo przed i po zamknięciu kontrolera widoku. Jednak przesunięcie komponentu x pochodzenia widoku treści jest proporcjonalne do przesunięcia treści. Im większe przesunięcie zawartości, tym bardziej negatywny jest komponent x pochodzenia widoku treści po odrzuceniu kontrolera widoku modalnego. I, przy przesunięciu zawartości o "zero", składnik x wynosi zero. Więc jeśli kontroler widoku modalnego jest prezentowany podczas przeglądania pierwszej strony zawartości (gdy przesunięcie treści wynosi "zero"), ramka widoku treści jest poprawna po zwolnieniu kontrolera widoku. Przesunięcie treści zerowej to jedyna okoliczność, w której ramka widoku treści poprawnie odzwierciedla ograniczenia.
Próbowałem wstawiania połączeń do layoutIfNeeded w różnych miejscach bez wyników.
Wszelkie sugestie?
rozwiązanie Clever. Podoba mi się pomysł podklasy UIScrollView. Łatwo usunąć, gdy pojawi się poprawka. Zaktualizowałem swój projekt do iOS 7, ale przeniosłem się do innej części mojego projektu. Po powrocie do tego kontrolera widoku mogę usunąć moją wersję poprawki. – bilobatum