Каким образом некоторые мои UIViews смещаются после навигации?

В части моей разработки приложений или для просто некоторого UIViews, после pushViewController navigationController, мое новое представление будет смещено от окна высотой строки состояния. В результате я помещу этот тупик кода в viewDidLoad метод.

CGRect  frameAt = [self.view frame];
CGRect  statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
frameAt.origin.y += statusBarFrame.size.height;
[self.view setFrame: frameAt];

Это не имеет смысла мне, что это - намерение XCode и Интерфейсного Разработчика, таким образом, я подозреваю, что делаю что-то существенно неправильно с SDK во время моего дизайна представления. Кроме того, в редком случае, что я не должен смещать свое представление, я действительно не знаю что различие в двух подходах дизайна.

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

Кто-либо еще сталкивается с этим и знает то, что они делают для фиксации без такого тупика кода?

10
задан mobibob 6 February 2010 в 14:21
поделиться

4 ответа

Я использовал пример кода NavBar от Apple, чтобы попытаться воспроизвести эту проблему.

applicationDidFinishLaunching изначально реализован следующим образом:

[window addSubview:navigationController.view];
[window makeKeyAndVisible];

Если я изменю его на следующее:

UIViewController *shellController = [[UIViewController alloc] initWithNibName:nil bundle:nil];
[shellController.view addSubview:navigationController.view];
[window addSubview:shellController.view];
[window makeKeyAndVisible];

Тогда я получу появление пробела.

Однако если я делаю только это:

UIView *shell = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[shell addSubview:navigationController.view];
[window addSubview:shell];
[window makeKeyAndVisible];

Тогда все выглядит нормально.

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

16
ответ дан 3 December 2019 в 20:04
поделиться

У меня возникали похожие проблемы. Ознакомьтесь с двумя моими предыдущими вопросами:

IPhone - После отключения контроллера модального представления - пробел остается вверху страницы

IPhone - UIView addSubview Gap вверху

1
ответ дан 3 December 2019 в 20:04
поделиться

Главное, о чем следует помнить, это то, что контроллер представления будет сам устанавливать рамку своего представления. Это связано с тем, что объем пространства, доступного для представления, может измениться в течение жизни приложения, и только контроллер представления знает, как соответствующим образом настроить рамку представления. Примерами изменения объема пространства являются изменение высоты навигационной панели, поворот устройства из книжной ориентации в альбомную, а также увеличение высоты строки состояния, если пользователь принимает звонок. По этой причине не следует самостоятельно изменять рамку представления.

Итак, первое, что вам нужно сделать, это удалить весь код, связанный с модификацией рамки представления.

Теперь вам нужно разрабатывать свои представления с учетом того, что размер рамки может измениться в любой момент. Это означает правильную установку свойства autoresizing для каждого вложенного представления. Если вы это сделаете, то не будет иметь значения, включите вы имитацию навигационной и статусной панелей или нет; в большинстве случаев они просто помогают увидеть, как будет выглядеть конечный результат.

Вы можете установить свойство авторазмера каждого подпросмотра в Interface Builder в инспекторе размеров (тот, что с иконкой линейки). В анимации белая рамка представляет корневое представление контроллера представления, красная рамка представляет выбранное в данный момент вложенное представление. Вы заметите, что по умолчанию вложенное представление привязано к левому верхнему углу корневого представления. Это хорошо, если размер представления никогда не меняется, но мы знаем, что это не так. Если у вас есть вложенные представления, которые вы хотите видеть внизу независимо от размера, то вам нужно поиграть с диаграммой слева. Если выбрать одну из четырех линий вокруг края, то расстояние между краем корневого представления и краем вложенного представления будет фиксированным. Поэтому если вы хотите, чтобы вложенный вид отображался внизу, вам нужно убедиться, что выбрана самая нижняя линия, а не самая верхняя. Две линии в середине влияют на то, изменяется ли размер вложенного вида при изменении размера корневого вида. Так, например, если у вас есть табличное представление, которое должно занимать всю высоту экрана, вы должны убедиться, что выбрана внутренняя вертикальная линия. Это называется моделью распорок и пружин.

Если вы добавляете вложенные представления программно, вам нужно установить свойство autoresizingMask для каждого вложенного представления. Вот объяснение.

Надеюсь, это поможет!

2
ответ дан 3 December 2019 в 20:04
поделиться

текст ссылки

Здесь обсуждается аналогичная ошибка.

Также установлено значение НЕТ для анимации? Попробуйте установить для него значение ДА, поскольку это решило аналогичную проблему, с которой я столкнулся.

0
ответ дан 3 December 2019 в 20:04
поделиться
Другие вопросы по тегам:

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