Примечание: Это может быть дубликатом 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
соответствовать кадру предыдущего представления.
Это работает, но кажется немного взломанным:
- (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];
}
}
Окно может включать в себя другие элементы пользовательского интерфейса помимо вашего представления. Разница в 20 пикселей в вашем примере - это высота строки состояния.
[[UIApplication sharedApplication] statusBarFrame].height;
Ни окно, ни экран не вращаются. Получение их рамок и использование их для повернутого вида будет работать, только если вы поменяли высоту и ширину.
Если вы используете UIViewController, попробуйте вернуть ДА из этого метода:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation; // Override to allow rotation. Default returns YES only for UIDeviceOrientationPortrait
У меня такая же проблема, но я решил ее с помощью следующих строк кода:
- (void)changeRow:(NSNotification *)notification {
[window addSubview:new.view];
[old.view removeFromSuperview];
[new.view removeFromSuperview];
[window addSubview:new.view];
}
Вы должны добавить новый вид, затем удалить старый и новый, а затем добавить новый вид. Я не знаю почему, но это работает.