Автоматически Измеряя UIView после Добавления к Окну

Примечание: Это может быть дубликатом Doesnt AutoSize Подпредставления При Добавлении для Укоренения Контроллера Представления


У меня есть приложение для iPad, которое переключается между различными взглядами в его главное окно. Переключающий представление код похож на это:

- (void)switchToViewController:(UIViewController*)viewController {
    if (currentViewController != viewController) {
        [currentViewController.view removeFromSuperview];
        currentViewController = viewController;
        [window addSubview:viewController.view];
    }
}

Проблема состоит в том, что, когда новое представление (UISplitView) появляется в альбомной ориентации, оно не измерено для заполнения всего окна. Справа существует большое пустое черное пространство. Похоже, что представление только 768 пикселей шириной, а не 1 024 пикселя шириной из альбомного окна.

Если я поворачиваю устройство к портрету и затем обратно заниматься ландшафтным дизайном, размеры представления самому правильно.

Если устройство находится в портретной ориентации, все хорошо работает. UISplitView также измерен правильно, если это - первое представление, я показываю. Проблема только происходит, если я переключаюсь на нее после того, как другое представление показали в среде.

Так, есть ли некоторый способ вынудить iPhone OS изменить размер представления после того, как это было добавлено к окну?

Я попытался звонить sizeToFit, и setNeedsLayout. Я также попытался установить представление bounds к окну bounds, и я попытался установить frame соответствовать кадру предыдущего представления.

6
задан 9 revs 23 May 2017 в 10:32
поделиться

3 ответа

Это работает, но кажется немного взломанным:

- (void)switchToViewController:(UIViewController *)viewController {
    if (viewController != currentViewController) {
        UIInterfaceOrientation orientation = currentViewController.interfaceOrientation;
        [currentViewController.view removeFromSuperview];

        currentViewController = viewController;
        UIView *view = viewController.view;

        // Set appropriate view frame (it won't be autosized by addSubview:)
        CGRect appFrame = [[UIScreen mainScreen] applicationFrame];
        if (UIInterfaceOrientationIsLandscape(orientation)) {
            // Need to flip the X-Y coordinates for landscape
            view.frame = CGRectMake(appFrame.origin.y, appFrame.origin.x, appFrame.size.height, appFrame.size.width);
        }
        else {
            view.frame = appFrame;
        }

        [window addSubview:view];
    }
}
3
ответ дан 8 December 2019 в 16:00
поделиться

Окно может включать в себя другие элементы пользовательского интерфейса помимо вашего представления. Разница в 20 пикселей в вашем примере - это высота строки состояния.

[[UIApplication sharedApplication] statusBarFrame].height;

Ни окно, ни экран не вращаются. Получение их рамок и использование их для повернутого вида будет работать, только если вы поменяли высоту и ширину.

Если вы используете UIViewController, попробуйте вернуть ДА из этого метода:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation; // Override to allow rotation. Default returns YES only for UIDeviceOrientationPortrait
1
ответ дан 8 December 2019 в 16:00
поделиться

У меня такая же проблема, но я решил ее с помощью следующих строк кода:

- (void)changeRow:(NSNotification *)notification {
[window addSubview:new.view];
[old.view removeFromSuperview];
[new.view removeFromSuperview];
[window addSubview:new.view];

}

Вы должны добавить новый вид, затем удалить старый и новый, а затем добавить новый вид. Я не знаю почему, но это работает.

1
ответ дан 8 December 2019 в 16:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: