2013-10-24 8 views
3

Мое приложение использует как альбомный режим, так и портретный режим, и пользователь может переключаться между ними по желанию.IOS 6 view controller неправильная ширина/граница - ландшафтный режим

Когда контроллер представления представлен контроллером родительского вида, который находится в портретной ориентации , открываемый контроллер представления будет иметь правильную ширину & кадра.

Однако, если контроллер родительского вида находится в ландшафтном режиме, а затем на iOS6 (он работает правильно IOS7), контроллер зрения ребенка будет слишком большой и на самом деле немного слишком коротки, и, когда она представлена ,

Примечания это не потому, что значения представлены неправильно, так как [[UIScreen В начале] оценка] сообщает то же значение, независимо от ориентации контроллер ребенка загружена в.

Любых идеи о том, как это исправить/почему это происходит? Любая идея о том, как заставить версии IOS6 вести себя как IOS7, теперь ведет себя естественным образом? Большое спасибо!!!

Edit :: Вот как представлены в ВК:

AppDelegate

Launch1 *launch1 =[[Launch1 alloc] init]; 
self.window.rootViewController = launcher; 
[self.window makeKeyAndVisible]; 

Launch1 класса

Search *search = [[Search alloc] init]; 
[self presentViewController:search animated:YES completion:nil]; 

Поиск Класс

//load list_container 
views = [[Search_custom_views alloc] initWithControllerContext:self]; 
[self.view addSubview:views]; 

Search_custom_views расширение UIView:

- (id)initWithControllerContext:(UIViewController*)contextstart { 

    //set size of the screen 
    CGRect screenRect = [[UIScreen mainScreen] bounds]; 

    self = [super initWithFrame:screenRect]; 

    if (self) { 
    .... 

ответ

2

Так что это было сложно. Я загружаю все свои взгляды программно. В основном это подклассы UIView, которые соответствуют каждому контроллеру представления. По какой-то причине, когда диспетчер представлений IOS6 открывается с родительского контроллера представлений в ландшафтном режиме, ограничения контроллера дочернего представления не сразу передаются в подклассы UIView дочернего vc (если вы просто используете addSubview в методе viewDidLoad контроллера - этого не достаточно). IOS7 не имеет этой проблемы.

Исправление iOS6 для меня делает следующее в методе viewDidLoad контроллера зрения ребенка:

//add view subclass to view controller 
[self.view addSubview:views]; 

//reset bounds & refresh layout for IOS6 
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 7) { 
    views.frame = self.view.bounds; 
    [views layoutIfNeeded]; 
} 
0

IOS 7 нравится, когда вы звоните [[UIScreen mainScreen] bounds] вместо [[UIScreen mainScreen] applicationFrame], поскольку свойства applicationFrame не последовательно вычисленными между различными версиями IOS, в то время как границы есть.

Она должна иметь обратную совместимость, так что вы должны быть в состоянии сделать что-то вроде этого:

- (CGRect)filterBankFrameForOrientation:(UIInterfaceOrientation)orientation { 
    CGRect appFrame = [[UIScreen mainScreen] bounds]; 
    if (UIInterfaceOrientationIsLandscape(orientation)) {//using bounds here instead of applicationFrame for iOS7 compatibility 
     //Handle landscape orientation 
     filterBankFrame = CGRectMake(0.0, k_filterBankOffsetFromTop, appFrame.size.height, k_filterBankHeight); 
    } 
    else { 
     //Handle portrait orientation 
     filterBankFrame = CGRectMake(0.0, k_filterBankOffsetFromTop, appFrame.size.width, k_filterBankHeight); 
    } 
    return filterBankFrame; 
} 

и просто переворачивать значения высоты и ширины по мере необходимости (так как границы всегда будет в «портретной» ориентации)

Использование bounds должно обеспечивать согласованность, необходимую для идентичного поведения в версиях iOS и размерах устройства.

Обновления в ответ на изменениях кода OP в

Один подхода, я бы рекомендовал вам по крайней мере рассмотреть это разводка этих взглядов в InterfaceBuilder и используя AutoLayout беспокоиться о вращениях для вас. У этого есть дополнительное преимущество, изящно обрабатывающее ВСЕ различные размеры экрана, доступные также, так что это может быть хорошо также.

Все еще, создание и управление всем этим в коде вполне приемлемо и может быть правильным вызовом для вашей ситуации.Если это так, вам нужно переопределить несколько методов обработки вращения UIViewController. Вероятно, большинство или все из них:

– shouldAutorotate 
– supportedInterfaceOrientations 
– preferredInterfaceOrientationForPresentation 
– willRotateToInterfaceOrientation:duration: 
- didRotateFromInterfaceOrientation 

как минимум первый и последний два.

Чтобы избежать привязки к одной ориентации только при запуске, это общий шаблон дизайна (править) написать метод, как тот, который я отправил выше, а затем использовать его как от viewDidLoad, а также от willRotate/didRotate класса методы.

При вызове во время viewDidLoad, вы делаете что-то вроде этого:

_filterBank.collectionView.frame = [self filterBankFrameForOrientation:[[UIApplication sharedApplication] statusBarOrientation]]; 

который использует statusBarOrientation свойство правильно запустить в любой пейзаж или портрет.

Методы willRotate/didRotate дают вам параметр, который вы можете передать методу генерации кадров.

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

(в вашем случае, это выглядит как launcher бы реализовать методы, а затем координировать корректировки launch1, а затем вниз к search и, наконец, Search_custom_views)

(** Последнее вы добавите сюда больше друзей, выбрав SearchCustomViews вместо Search_custom_views)

+0

Это, кажется, не делать ничего. Я думаю, это потому, что родительский контроллер представления находится в ландшафтном представлении, когда ребенок инициализирован. Может быть, IOS7 автоматически поворачивает родителя назад к портрету перед отображением дочернего элемента, а затем поворачивает их обратно? Не могу понять, что здесь происходит. Спасибо за вашу помощь! –

+0

Можете ли вы опубликовать код с обоих контроллеров? Особенно, как они создаются и связаны друг с другом (файл nib или в коде?), И если любой из них реализует любой из определенных в ротации методов в [классе UIViewController] (https://developer.apple.com/library/ios /documentation/uikit/reference/UIViewController_Class/Reference/Reference.html) –

+0

Я только что добавил код в свой вопрос выше. Контроллеры обзора могут свободно вращаться, но не реализуют методы вращения - это просто указано в настройках сборки. Еще раз спасибо! –

Смежные вопросы