Имам контролер за изглед, който добавя UIPageViewController към подизглед (нека го наречем „наслагване“) програмно. Тъй като всяка от страниците на контролера за изглед на страница има различна височина, добавих NSLayoutConstraint в подизгледа "overlay".
При всяко плъзгане изчислявам височината на предстоящия контролер за изглед и съответно преоразмерявам изгледа с наслагване:
- (void)resizeOverlayToBottomOf:(UIView *)element {
// resize overlay in parent view controller so it shows the element
float bottomOfElement = element.frame.origin.y + element.frame.size.height + 20;
[self.parentViewController.overlayHeightConstraint setConstant:bottomOfElement];
[self.parentViewController.overlayView setNeedsUpdateConstraints];
[self.parentViewController.overlayView setNeedsLayout];
[self.parentViewController.overlayView layoutIfNeeded];
}
Всичко работи според очакванията... докато не искам да променя размера на наслагването с анимация.
Обвих последните два реда от горния метод с блок за анимация:
[UIView animateWithDuration:0.25f animations:^{
[self.parentViewController.overlayView setNeedsLayout];
[self.parentViewController.overlayView layoutIfNeeded];
}];
След приключване на плъзгането височината на изгледа с наслагване се променя с анимация.
Проблемът е, че докато се възпроизвежда анимацията, съдържанието на контролера за изглед на страница се връща обратно на някое място извън екрана и се плъзга обратно. Опитах се да добавя ограничения, за да осигуря фиксирана ширина на съдържанието на контролера за изглед на страница, но изглежда нищо не върши работа.
Всеки намек за това как да анимирате изгледа родител, без да засягате изгледите на контролера за изглед на страница, ще бъде високо оценен!