Вращение, когда нажатие контроллера вида на контроллер навигации не соответствует размеру проталкиваемого контроллера вида - PullRequest
0 голосов
/ 11 апреля 2019

Я вижу действительно странную проблему;проталкивание контроллера вида в контроллер навигации так же, как пользователь поворачивает устройство, заставляет контроллер push-представления не выполнять автоматическую разметку на контроллер навигации.

Вот демонстрация, где нажатие кнопки вызывает pushViewController:

[1]

Сначала вы можете увидеть толчок, работающий как положено (без вращения), затем испортить (с вращением) толчок и, наконец, испортить (с вращением) поп.

Я специально сделал самый простой проект, который только мог придумать, чтобы проверить это, поэтому раскадровка - это контроллер представления с кнопкой в ​​контроллере навигации, и весь код выглядит так:

- (void)didTapButton:(id)sender
{
    UIViewController *viewController = [[UIViewController alloc] init];
    viewController.view.backgroundColor = [UIColor whiteColor];

    [self.navigationController pushViewController:viewController animated:YES];
}

Я нахожуТрудно поверить, что я столкнулся с доселе незамеченной ошибкой в ​​iOS11 и 12 (не происходит в 10), но я действительно в растерянности, чтобы увидеть, что я мог сделать не так, если это моя вина.

Кто-нибудь видел это раньше или есть предложения, что мне здесь не хватает?

1 Ответ

1 голос
/ 12 апреля 2019

Полагаю, это какое-то состояние гонки, связанное с толчком при переходе на другой размер.Возможно, флаг updateConstraints / needsLayout равен NO, когда переход к новому размеру завершен (то есть он уже думает, что он полностью завершил, выкладывая свой вид после завершения push, но вращение еще не завершено).Я бы посчитал это ошибкой Apple и сообщил бы об этом, если вы этого еще не сделали.

В качестве обходного пути вы могли бы использовать подкласс UINavigationController и реализовать viewWillTransitionToSize:withTransitionCoordinator:, а затем, если необходимо, добавить дополнительный [self.view setNeedsLayout] или [self.view setNeedsUpdateConstraints] в блоке завершения coordinator animateAlongsideTransition:completion:

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext>  _Nonnull context) {
    } completion:^(id<UIViewControllerTransitionCoordinatorContext>  _Nonnull context) {
        UIView *topView = [self.topViewController view];
        // we should only need an additional layout if the topView's size doesn't match the size
        // we're transitioning to (otherwise it should have already beend layed out properly)
        BOOL needsAdditionalLayout = topView && CGSizeEqualToSize(topView.frame.size, size) == NO;
        if (needsAdditionalLayout) {
            // either of these two should do the trick
            [self.view setNeedsUpdateConstraints];
            // [self.view setNeedsLayout];
        }
    }];
}

Похоже, это правильно изменяло размеры представлений после завершения перехода к размеру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...