Anteriormente, eles fizeram um xib separado para dar suporte ao iPad. Para unificar o layout, em 2014 a Apple introduziu as Classes de layout e tamanho automático e para o UISplitViewController de navegação adaptável.

Um controlador dividido é um contêiner que coloca dois controladores lado a lado. À esquerda, haverá um controlador de navegação (não sobre o Navigation Controller), à direita, correspondente à escolha na navegação. Em resumo, como em Configurações.
Vamos UISplitViewController
como configurar o UISplitViewController
e seu comportamento nas telas.
Definindo controladores
Indique os controladores esquerdo (navegação) e direito. Para ambos, defina o cabeçalho:
class MasterController: UITableViewController { override func viewDidLoad() { super.viewDidLoad() self.navigationItem.title = "Master" self.navigationController?.navigationBar.prefersLargeTitles = true } } class DetailController: UIViewController { override func viewDidLoad() { super.viewDidLoad() self.navigationItem.title = "Detail" self.navigationController?.navigationBar.prefersLargeTitles = true } }
Um controlador dividido é um contêiner para dois controladores. Como escrevi antes do kat, à esquerda está o controlador principal de navegação, à direita, correspondente à opção de navegação ou detalhada (Controlador de detalhes). Lembre-se de Mestre e Detalhe, as palavras serão encontradas na documentação e protocolos.
Adicionar divisão
Vamos para AppDelegate, no método didFinishLaunchingWithOptions, crie uma nova janela, inicialize o controlador Split e mais dois, defina-o como Split:
let masterController = MasterController() let masterNavigationController = UINavigationController(rootViewController: masterController) let detailController = DetailController() let detailNavigationController = UINavigationController(rootViewController: detailController) let splitViewController = UISplitViewController() splitViewController.viewControllers = [masterNavigationController, detailNavigationController] self.window = UIWindow(frame: UIScreen.main.bounds) self.window!.rootViewController = splitViewController self.window!.makeKeyAndVisible()
Execute o simulador. Orientações retrato e paisagem, respectivamente:

Na orientação da porta, o controlador mestre não está visível. Deslize para a esquerda para que ela apareça. Ele é configurado usando modos, vamos analisá-los ainda mais.
Navegação
Adicione células ao controlador mestre. Deixe-me lembrá-lo de que um controlador Master é uma tabela agrupada em um UINavigationController.
Você sabe como adicionar células, não precisa ver o código class MasterController: UITableViewController { override func viewDidLoad() { self.tableView = UITableView(frame: .zero, style: .insetGrouped) super.viewDidLoad() self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "id") self.navigationItem.title = "Master" self.navigationController?.navigationBar.prefersLargeTitles = true } override func numberOfSections(in tableView: UITableView) -> Int { return 2 } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 4 } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "id")! cell.textLabel?.text = "\(indexPath)" return cell } }
E se você não sabe, então aqui .
No iOS 13, um novo estilo de tabela .insetGrouped apareceu , eu o instalei. O estilo está disponível a partir do Xcode 11.
Execute o projeto:

Ao clicar na célula, mostraremos um controlador detalhado. Como os "controladores detalhados" cortaram o boato , espero que nos comentários me digam melhor a tradução. O código fica assim:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let controller = DetailController() controller.navigationTitle = "\(indexPath)" self.showDetailViewController(UINavigationController(rootViewController: controller), sender: nil) }
Lembre-se de nomear controladores mestre / detalhados? Aqui está um exemplo do uso de Detail no método showDetailViewController .
A Attention notará que o controlador não possui o NavigationTitle . Atualize a classe do controlador Detail:
class DetailController: UIViewController { var navigationTitle: String = "Detail" override func viewDidLoad() { super.viewDidLoad() self.navigationItem.title = navigationTitle self.view.backgroundColor = .white } }
Execute o projeto e clique na célula:

IPhones
A navegação é adaptável, o que significa que tudo está pronto. Bem, quase. Selecione um iPhone e execute:

Funciona como um controlador de navegação comum. É universalidade adaptabilidade - dependendo do espaço livre, o controlador Split coloca os controladores principal e detalhado.
Não é o controlador Master, mas o Detail foi o primeiro a abrir no iPhone. A transição da exibição de dois controladores para uma situação semelhante é configurada pelo delegado UISplitViewControllerDelegate . O valor de retorno determina se o controlador Master deve ser exibido ou Detail:
extension AppDelegate: UISplitViewControllerDelegate { func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController: UIViewController, onto primaryViewController: UIViewController) -> Bool { return true } }
Esse método nem sempre precisa retornar true. Exemplo: ao alterar a orientação para um controlador de detalhes compacto e já aberto, pode ser necessário deixar Detalhes na tela. Planeje esse comportamento.

Paisagem para iPhone
A orientação paisagem para iPhones funciona sem Dividir por padrão. Isso é corrigido pelo modo de exibição do controlador Split:
splitViewController.preferredDisplayMode = UISplitViewController.DisplayMode.allVisible
Definimos o modo de exibição preferido, ou seja, para mostrar o par Mestre-Detalhe sempre que possível. A capacidade determina a API, é impossível de configurar.
Na orientação retrato permanecerá o mesmo. Mas na paisagem (apenas para Xs Max e 8+):
Se as condições do controlador Split mudarem no SDK, seu projeto as implementará por padrão.
Dimensões
Pode ser personalizado. Isso é feito pela proporção:
splitViewController.preferredPrimaryColumnWidthFraction = 0.5 splitViewController.maximumPrimaryColumnWidth = 2000
Mestre e Detalhe terão o mesmo tamanho. Certifique-se de definir maximumPrimaryColumnWidth . Opcionalmente, você pode definir a largura mínima. Não adicionarei uma captura de tela e há muitos ipads para o tutorial)
Mestre Escondido
Adicione um botão que abre Detalhes em tela cheia. O controlador de divisão deve estar no modo .allVisible . Cole o código do controlador Detail em viewDidLoad :
if let splitController = self.splitViewController{ if let navController = splitController.viewControllers.last as? UINavigationController { navController.topViewController?.navigationItem.leftBarButtonItem = splitController.displayModeButtonItem } }
É difícil descrever o comportamento, e o gif é do tamanho de um orçamento de Moscou. Portanto, uma captura de tela:

Ou eu tenho um vídeo no Twitter .
Diretrizes
O AutoLayout coloca os elementos, o controlador Split determina a navegação. A Apple recomenda enfaticamente o uso de um controlador mestre estático . Para o experimento, criei um controlador de navegação à esquerda, clicando em uma célula que eu pressionei nos controladores (em vez de atualizar o controlador de detalhes). Parece estranho.
Em geral, restrinja a navegação a um lado de uma exibição dividida. Colocar a navegação nos dois painéis em uma exibição dividida torna difícil para as pessoas permanecerem orientadas e discernir o relacionamento entre os dois painéis.
Destaque a seleção ativa no controlador mestre. Embora o conteúdo do controlador de detalhes possa variar, ele deve sempre corresponder à seleção no mestre. Isso ajudará as pessoas a controlar o relacionamento entre controladores. Para controlar os controladores - um trocadilho de algum tipo.
Não é necessário usar o Split em qualquer lugar. Mas se o seu aplicativo tiver uma navegação forte e o controlador raiz for Tab ou Navigation, o Split provavelmente será útil. Se você possui um aplicativo tradutor de tela única, não precisa do Split.
Para quem procura
Link para documentação , link para diretrizes .
Se você preferir assistir ao vídeo, confira o tutorial: