Sebelumnya, mereka membuat xib terpisah untuk mendukung iPad. Untuk menyatukan tata letak, pada tahun 2014 Apple memperkenalkan Tata Letak Otomatis dan Kelas Ukuran, dan untuk navigasi adaptif UISplitViewController .

Pengontrol terbagi adalah wadah yang menempatkan dua pengontrol berdampingan. Di sebelah kiri akan ada pengontrol navigasi (bukan tentang Pengontrol Navigasi), di sebelah kanan sesuai dengan pilihan dalam navigasi. Singkatnya, seperti dalam Pengaturan.
Mari kita UISplitViewController
cara mengkonfigurasi UISplitViewController
dan perilakunya di layar.
Menentukan pengontrol
Nyatakan pengendali kiri (navigasi) dan kanan. Untuk keduanya, atur tajuk:
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 } }
Split controller adalah wadah untuk dua pengendali. Seperti yang saya tulis sebelum kat, di sebelah kiri adalah pengendali navigasi-utama, di sebelah kanan sesuai dengan pilihan dalam navigasi, atau rinci (Detail Controller). Ingatlah Guru dan Detail, kata-katanya akan ditemukan dalam dokumentasi dan protokol.
Tambahkan Split
Mari kita pergi ke AppDelegate, dalam metode didFinishLaunchingWithOptions, buat jendela baru, inisialisasi Split controller dan dua lainnya, atur ke 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()
Jalankan simulator. Orientasi potret dan lanskap masing-masing:

Dalam orientasi port, pengontrol Master tidak terlihat. Geser ke kiri untuk membuatnya muncul. Ini dikonfigurasi menggunakan mode, kami akan menganalisisnya lebih lanjut.
Navigasi
Tambahkan sel ke master controller. Biarkan saya mengingatkan Anda bahwa kontroler Master adalah tabel yang dibungkus dengan UINavigationController.
Anda tahu cara menambahkan sel, Anda tidak perlu melihat kode 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 } }
Dan jika Anda tidak tahu caranya, maka di sini .
Di iOS 13, gaya tabel .insetGrouped baru muncul , saya memasangnya. Gaya tersedia mulai dengan Xcode 11.
Jalankan proyek:

Dengan mengeklik sel, kami akan menampilkan pengontrol terperinci. Bagaimana "pengendali terperinci" memotong gosip , saya harap di komentar ceritakan terjemahannya lebih baik. Kode ini terlihat seperti ini:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let controller = DetailController() controller.navigationTitle = "\(indexPath)" self.showDetailViewController(UINavigationController(rootViewController: controller), sender: nil) }
Ingat tentang penamaan master / pengendali terperinci? Berikut ini adalah contoh menggunakan Detail dalam metode showDetailViewController .
Perhatian akan memperhatikan bahwa controller tidak memiliki navigationTitle . Perbarui kelas pengontrol detail:
class DetailController: UIViewController { var navigationTitle: String = "Detail" override func viewDidLoad() { super.viewDidLoad() self.navigationItem.title = navigationTitle self.view.backgroundColor = .white } }
Jalankan proyek dan klik pada sel:

IPhone
Navigasi adaptif, yang berarti semuanya sudah siap. Yah, hampir. Pilih iPhone dan jalankan:

Bekerja seperti pengontrol Navigasi biasa. Itu universalitas kemampuan beradaptasi - tergantung pada ruang kosong, pengontrol Split menempatkan pengontrol utama dan terperinci.
Bukan pengendali Master, tetapi Detail adalah yang pertama dibuka di iPhone. Transisi dari menampilkan dua pengontrol ke satu situasi serupa dikonfigurasikan oleh delegasi UISplitViewControllerDelegate . Nilai kembali menentukan apakah akan menampilkan kontroler Master, atau Detail:
extension AppDelegate: UISplitViewControllerDelegate { func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController: UIViewController, onto primaryViewController: UIViewController) -> Bool { return true } }
Metode ini tidak selalu harus mengembalikan true. Contoh: ketika mengubah orientasi ke pengontrol Detail yang ringkas dan sudah terbuka, Anda mungkin perlu meninggalkan Detail di layar. Rencanakan perilaku ini.

Lansekap untuk iPhone
Orientasi lansekap untuk iPhone berfungsi tanpa Pisahkan secara default. Ini dikoreksi oleh mode tampilan untuk pengontrol Split:
splitViewController.preferredDisplayMode = UISplitViewController.DisplayMode.allVisible
Kami mengatur mode tampilan yang disukai, yaitu untuk menunjukkan pasangan Detail Master jika memungkinkan. Kemampuan menentukan API, tidak mungkin untuk mengkonfigurasi.
Dalam orientasi potret akan tetap sama. Namun dalam lanskap (hanya untuk Xs Max dan 8+):
Jika kondisi untuk pengontrol Split berubah dalam SDK, proyek Anda akan menerapkannya secara default.
Dimensi
Dapat disesuaikan. Ini dilakukan oleh aspek rasio:
splitViewController.preferredPrimaryColumnWidthFraction = 0.5 splitViewController.maximumPrimaryColumnWidth = 2000
Master dan Detail akan berukuran sama. Pastikan untuk mengatur maksimumPrimaryColumnWidth . Secara opsional, Anda dapat mengatur lebar minimum. Saya tidak akan menambahkan tangkapan layar, dan ada begitu banyak iPad untuk tutorial)
Menyembunyikan Guru
Tambahkan tombol yang membuka Detail di layar penuh. Pengontrol terpisah harus dalam mode .allVisible . Tempel kode untuk pengontrol detail ke viewDidLoad :
if let splitController = self.splitViewController{ if let navController = splitController.viewControllers.last as? UINavigationController { navController.topViewController?.navigationItem.leftBarButtonItem = splitController.displayModeButtonItem } }
Sulit untuk menggambarkan perilaku tersebut, dan gif adalah ukuran anggaran Moskow. Karena itu tangkapan layar:

Atau saya punya video di Twitter .
Pedoman
AutoLayout menempatkan elemen, pengontrol Split menentukan navigasi. Apple sangat merekomendasikan menggunakan pengendali master statis . Demi percobaan, saya membuat pengontrol navigasi di sebelah kiri, dengan mengklik sel saya mendorong pengontrol (alih-alih memperbarui pengontrol Detail). Terlihat aneh.
Secara umum, batasi navigasi ke satu sisi tampilan split. Menempatkan navigasi di kedua panel tampilan terpisah membuatnya sulit bagi orang untuk tetap berorientasi dan melihat hubungan antara dua panel.
Sorot pilihan aktif di master controller. Meskipun isi dari pengontrol Detail dapat bervariasi, itu harus selalu sesuai dengan pilihan pada Master. Ini akan membantu orang mengontrol hubungan antar pengendali. Untuk mengontrol pengendali - permainan kata-kata semacam itu.
Tidak perlu menggunakan Split di mana-mana. Tetapi jika aplikasi Anda memiliki navigasi yang kuat, dan pengontrol root adalah Tab atau Navigasi, Split kemungkinan besar berguna. Jika Anda memiliki aplikasi penerjemah satu layar, Anda tidak perlu Split.
Bagi para pencari
Tautan ke dokumentasi , tautan ke pedoman .
Jika Anda lebih suka menonton video, lihat tutorialnya: