Вопрос

Я обновился до XCode 4.2 и это новая функция раскадровки. Однако не смог найти способ поддержать как портрет, так и ландшафт.

Конечно, я сделал это программно, с двумя просмотрами, один на портрет и один для ландшафта, как в старые времена, и::

if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight) 
    {
        self.view = self.landscapeView;
    }
    else
    {
        self.view = self.portraitView;
    }

Но я искал способ как -то сделать это автоматически. Я имею в виду, что сейчас XCODE 4.2, я ожидал от него большего. Спасибо всем.

==================================
ВРЕМЕННОЕ РЕШЕНИЕ:

Я представлю здесь временное решение. Я говорю, что это временно, потому что я все еще жду, когда ребята из Apple сделают что -то действительно умное в этом.

Я создал еще один файл .storyboard, который называется «mainstoryboard_iphone_landscape» и внедрил там контроллеры представления ландшафта. На самом деле, это точно так же, как обычно (портретный).

Таким образом, я извлечу ViewController из ландшафтной раскадровки, и когда происходит вращение, просто измените Self.view с помощью нового представления ViewController.

1. Генерация уведомлений при изменении ориентации:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

2. Посмотрите на уведомления:

[[NSNotificationCenter defaultCenter] addObserverForName:UIDeviceOrientationDidChangeNotification object:nil queue:nil usingBlock:^(NSNotification *note) {    
    // We must add a delay here, otherwise we'll swap in the new view  
    // too quickly and we'll get an animation glitch  
    [self performSelector:@selector(updateLandscapeView) withObject:nil afterDelay:0];
}];

3. Имплекция UpdatelandScapeview

- (void)updateLandscapeView {  
 //>     isShowingLandscapeView is declared in AppDelegate, so you won't need to declare it in each ViewController
 UIDeviceOrientation deviceOrientation       = [UIDevice currentDevice].orientation;
 if (UIDeviceOrientationIsLandscape(deviceOrientation) && !appDelegate().isShowingLandscapeView)
 {
     UIStoryboard *storyboard                = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone_Landscape" bundle:[NSBundle mainBundle]];
     MDBLogin *loginVC_landscape             =  [storyboard instantiateViewControllerWithIdentifier:@"MDBLogin"];
     appDelegate().isShowingLandscapeView    = YES;  
     [UIView transitionWithView:loginVC_landscape.view duration:0 options:UIViewAnimationOptionTransitionCrossDissolve|UIViewAnimationCurveEaseIn animations:^{
         //>     Setup self.view to be the landscape view
         self.view = loginVC_landscape.view;
     } completion:NULL];
 }
 else if (UIDeviceOrientationIsPortrait(deviceOrientation) && appDelegate().isShowingLandscapeView)
 {
     UIStoryboard *storyboard                = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:[NSBundle mainBundle]];
     MDBLogin *loginVC                       = [storyboard instantiateViewControllerWithIdentifier:@"MDBLogin"];
     appDelegate().isShowingLandscapeView    = NO;
     [UIView transitionWithView:loginVC.view duration:0 options:UIViewAnimationOptionTransitionCrossDissolve|UIViewAnimationCurveEaseIn animations:^{
         //>     Setup self.view to be now the previous portrait view
         self.view = loginVC.view;
     } completion:NULL];
 }}

Удачи всем.

PS: Я приму ответа AD Taylor, потому что, после долгих времени ожидания и поиска решения, я закончил реализовать что -то вдохновленное его ответом. Спасибо Тейлор.

Это было полезно?

Решение

Это старый вопрос, но я прочитал это ранее в тот же день, а затем должен был потратить немало времени на то, чтобы разрабатывать лучшее решение. Я придумал это решение, чтобы взломать Apple Альтернативный просмотр пример. Анкет По сути, он служит модальным видом на ландшафтный вид.

#pragma mark Rotation view control

- (void)orientationChanged:(NSNotification *)notification
{
    // We must add a delay here, otherwise we'll swap in the new view
    // too quickly and we'll get an animation glitch
    [self performSelector:@selector(updateLandscapeView) withObject:nil afterDelay:0];
}

- (void)updateLandscapeView
{
    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
    if (UIDeviceOrientationIsLandscape(deviceOrientation) && !self.isShowingLandscapeView)
    {
        [self performSegueWithIdentifier: @"toLandscape" sender: self];
        self.isShowingLandscapeView = YES;
    }
    else if (deviceOrientation == UIDeviceOrientationPortrait && self.isShowingLandscapeView)
    {
        [self dismissModalViewControllerAnimated:YES];
        self.isShowingLandscapeView = NO;
    }    
}


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

Другие советы

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

Чтобы ответить на ваш вопрос более напрямую, нет, у XCode нет возможности предположить или сказать, какие представления вы хотите использовать для определенной ориентации на интерфейс, поскольку это никогда не было намерением UIKitАрхитектура просмотра.

Вот дополнительная информация об авторизации масок: Обработка макета автоматически изменяется с использованием правил авторезиции.

В Xcode v4.2.1 При использовании раскадровки вы можете изменить только ориентацию контроллера представления, а не само мнение, поэтому, если вы вставили там другое представление, вы не сможете изменить его ориентацию, даже если бы вы увидели Просмотреть правильно.

Таким образом, предыдущий способ наличия двух просмотров не будет работать при использовании раскадровки (при использовании NIB's, где ориентация представления изменяется для отдельных представлений).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top