IOS 8 UIPageViewController Применение ограничений после переходов
Мое приложение имеет многоуровневое представление в стиле учебника, которое пользователи просматривают, чтобы узнать о приложении. Это реализовано так же, как описанное в этом уроке. Внедрив его как для iOS 7, так и для 8, я сравниваю, как они работают, и обнаружил проблемы с последними - здесь я запускаю Xcode 6 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-pt-белое пространство внизу нового представления. Как только переход завершен, он врывается в правильную компоновку.
Возможно, это ошибка в iOS 8? В данный момент я все догадываюсь.
Ответы
Ответ 1
Я понял, что вам нужно основывать свои ограничения на представлении, а не на макете вашего контроллера. Это обеспечит, чтобы ваш контроллер просмотра соблюдал ограничения, установленные вами перед переходом в PageViewController.
вы можете сделать это так:
![Constraints example]()
Не забудьте снять флажок "Ограничить на поля"
Ответ 2
Для всех, у кого есть эта проблема, для меня оказалось, что я выкладываю взгляды "относительно поля" (новая функция в iOS 8).
Вместо:
![enter image description here]()
Использование:
![enter image description here]()
Ответ 3
Я боролся с этим в течение нескольких дней.
Я попытался реализовать его, создав экземпляр ViewController страницы из раскадровки. Произошло определенное изменение размера. Проверка размера кадра в
- pageViewController: viewControllerAfterViewController
- pageViewController: willTransitionToViewControllers
- pageViewController: didFinishAnimating: previousViewControllers
Размер кадра всегда будет меняться между вызовами 1 и 3. Иногда до 2, а иногда и после.
Если вы также используете раскадровки, я смог решить проблему, извлекая элементы пользовательского интерфейса страницы в свой собственный файл XIB, установив ограничения в IB, а затем создав страницы с вызовом initWithNibName.
Не полный ответ, но он вернул мне чувство продуктивности.
Надеюсь, что это поможет.
Ответ 4
Для меня решение заключалось в том, чтобы вывести вершину таблицыView для просмотра:
Редактор → Pin → Top Space To SuperView (iOS8)
Ответ 5
Это ошибка в iOS 8, но я нашел обходное решение:
Добавить пустой вид поверх строки состояния в вашей раскадровке. Высота представления должна быть такой же, как и y-значение перемещаемого объекта.
![Image of correct constraints]()