XCode Redraw портретная компоновка с двойной высокой строкой состояния

У меня возникла проблема с несколькими экранами в моем приложении, но я объясню, что происходит с моим домашним экраном. Надеюсь, решение не такое сложное, как я думаю. Таким образом, на моем домашнем экране есть логотип вверху, метка (заголовок) под ним, 3 горизонтальные кнопки под ним и, наконец, кнопки настроек и информации в нижнем левом и правом углу соответственно при портретной ориентации. Чтобы обеспечить альбомную ориентацию, маски изменения размера не могли добиться желаемого вида, поэтому я реализовал

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

с операторами if и else, «if» использует CGRectMakes для отрисовки всех элементов там, где они должны располагаться в альбомной компоновке, а «else» перерисовывает их обратно на исходные места при изменении обратно на портретную ориентацию. Все это работает очень хорошо. Я вспомнил, что мы должны иметь возможность обрабатывать строку состояния с двойной высотой, поэтому я смоделировал ее, чтобы посмотреть, что она сделает с моим приложением. Когда я нахожусь на главном экране и включаю и выключаю его, автоматическое изменение размера элементов (которые настроены на настройку в соответствии с верхней частью экрана) работает хорошо, слегка сжимая все немного и ничего не скрывая. Включаю и выключаю без проблем.

Вот в чем проблема:

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

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

Извините за многословие, но я хотел четко описать, какие обстоятельства вызывают эту проблему. Буду очень признателен за любые идеи, так как я действительно не знаю, как к этому подойти.


person Ryan    schedule 27.05.2011    source источник


Ответы (1)


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

Для меня я хотел, чтобы представление настроек загружалось из пера и добавлялось поверх всего остального. Если панель двойной высоты действовала при добавлении представления, она уходила бы за нижнюю часть экрана. Чтобы исправить это, вы должны сами установить размер и положение представления при его загрузке. Это код моей рабочей кнопки «Перейти к настройкам»:

- (IBAction) settingsPressed:(id)_sender
{
    NSArray* a = [[NSBundle mainBundle] loadNibNamed:@"SettingsView" owner:self options:nil];
    SettingsView* settings = [a objectAtIndex:0];
    settings.frame = self.view.bounds;
    [[self view] addSubview:settings];
}

Важная строка:

settings.frame = self.view.bounds;

Что, по-видимому, классифицируется как «изменение размера», и поэтому применяются правила изменения размера маски. Позже я добавил анимацию для перехода, и он продолжает работать нормально.

Примечание. Этот метод был в контроллере представления.

person Wex    schedule 09.10.2011