2015-02-16 2 views
2

Я хотел бы создать приложение, как это: enter image description hereразница UI для портретной и альбомной IPad

На Iphone (как в портретной и альбомной ориентации) и Ipad портрету, у меня есть экран просмотра таблицы, нажмите на пункт строки будет перейдите к другому подробному экрану, как и к другому базовому приложению.
Но когда я повернуть экран, чтобы перейти в альбомную на Ipad, экран теперь есть два мнения раздела
Вот что я сделал:

  • Напишите метод isInLandscapeTablet обнаружить Ipad ландшафту
  • Используйте UINavigationController как корневого контроллер контролировать все другие представления
  • в портретной экране, нажать ViewController содержит TableView к корневому контроллеру
  • в экране планшета ландшафтного, прикрепить контроллер Tableview и подробно контроллер UISplitViewController, а затем вставьте его в корневой контроллер

Но проблема в том, что я не могу нажать UISplitViewController укоренить контроллер, так как он требует, чтобы быть корневым контроллером.
Интересно, как я могу справиться с этой проблемой
И мой подход правильный? Есть ли другой путь?

Update: изменить контроллер представления корня, как этого

// this snippet is in UINavigationController (I use as root viewcontroller) 
     if([self isInTabletLandscape]){ 
      self.splitViewController.viewControllers = [NSArray arrayWithObjects:[[CategoryViewController alloc] initWithNibName:@"CategoryViewController" bundle:nil], self.propertyLandViewController, nil]; 
      [[UIApplication sharedApplication].keyWindow setRootViewController:self.splitViewController]; 
     }else{ 
// it doesn't work 
      [[UIApplication sharedApplication].keyWindow setRootViewController:self]; 
      } 
     } 
+0

Вы должны иметь три различных ViewController - 1 для iPhone портрет, 1 для IPad портрет, 1 для IPad пейзаж (с splitViewController) , нажмите правильный контроллер просмотра на базу корневого контроллера на типе устройства и ориентации. Если пользователь повернет iPad, поп в rootViewControler и снова нажмите правильный viewController.Вы можете установить флаг с помощью делегирования в корневой контроллер, чтобы указать, какой viewContoller нужно нажать. – Kilogen9

+0

@ Kilogen9 это то, что я сделал. Но, как я уже сказал, проблема в том, что я не могу подтолкнуть UISplitViewController к корневому контроллеру, поскольку он должен быть корневым контроллером. – R4j

+0

@ R4j - это меню, которое должно быть статичным или всегда показывать в ландшафте? – NorthBlast

ответ

1

Мое предложение не использовать Split View Controller на всех. Создайте пользовательский контроллер просмотра, в который будет встроен контроллер табличного представления и второй контроллер. Кроме того, вы можете реализовать логику интерфейса-вращения в настраиваемом контроллере, который вы создаете.

+0

Есть ли у вас какой-нибудь пример для пользовательского контроллера контроллера вида, например, контроллера разделенного вида? – R4j

+0

У меня есть опыт создания различных пользовательских контроллеров. Если вы новичок в разработке iOS, я рекомендую вам использовать Container View в раскадровке. Этот вид можно найти в инспекторе объектов. Он обеспечивает ** встраивание ** segue в пользовательский дочерний контроллер. Используйте два контейнера, для таблицы и для деталей. – kelin

+0

Он выглядит обещает. У меня будет попытка. Большое спасибо – R4j

1

Если вы разрабатываете на прошивке 8 вы должны использовать Size Classes, так что вы можете полностью изменить расположение в зависимости от iPhone/IPad портрета и iPad Пейзаж. К сожалению, на iOS 7 размерные классы различают только iPhone и iPad.

В обоих случаях правая часть (2) может быть легко обработана контейнеромView.

+0

ну, я знаю классы размеров, но я не думаю, что это может помочь моему делу. Поскольку это не только разница UI, но и разница в логике. Мне нужен правильный способ организовать иерархию представлений для обработки логики представления. – R4j

2

Узнав устройство, будь то iPad или iPhone. Вы можете попытаться удалить RootViewController.

 appDelegate.window.rootViewController = nil; 

Затем вы устанавливаете контроллер представления корня с новым SplitViewContloller

 id objClass =[[SplitViewController alloc]initWithNibName:@"SplitViewController" bundle:nil]; 
     masterVC.delegate = detailVC; 
     detailVC.delegate = objClass; 
     [objClass setViewControllers:@[masterNavigate,detailNavigate]]; 

     [appDelegate.window setRootViewController:objClass]; 
+0

Я обновил свой вопрос. Этот способ будет работать, когда я повернусь к пейзажу. Но когда я перехожу от пейзажа к портрету, он отображает подробный вид контроллера splitview вместо моего контроллера корневого представления. – R4j

+0

Не могли бы вы поделиться кодом над github. Так что я могу помочь. – Chirag

+0

Вот мой фрагмент корневого контроллера: http://pastebin.com/DAs38PsU – R4j

1

https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/ViewControllerCatalog/Chapters/SplitViewControllers.html

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    MyFirstViewController* firstVC = [[MyFirstViewController alloc] init]; 
    MySecondViewController* secondVC = [[MySecondViewController alloc] init]; 

if (([[UIDevice currentDevice] orientation] == UIDeviceOrientationPortrait) ){ 

    UISplitViewController* splitVC = [[UISplitViewController alloc] init]; 
    splitVC.viewControllers = [NSArray arrayWithObjects:firstVC, secondVC, nil]; 

    window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    window.rootViewController = splitVC; 
    [window makeKeyAndVisible]; 
} 
    else 
{ 
// Display tableview 

} 
return YES; 
} 


Я предполагаю, что это может помочь вам ..

+0

Это похоже на ответ Джеймса ниже. При вращении от пейзажа к портрету он отображает view2 вместо tableview (вид 1). Вот мой фрагмент: http://pastebin.com/DAs38PsU – R4j

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