NavigationControllers memiliki tumpukan ViewController untuk dikelola, dan transisi animasi terbatas.
Menambahkan pengontrol tampilan sebagai sub-tampilan ke pengontrol tampilan yang ada mengharuskan melewati acara ke pengontrol tampilan-bawah, yang merupakan rasa sakit untuk dikelola, dimuat dengan sedikit gangguan dan secara umum terasa seperti hack yang buruk saat menerapkan (Apple juga merekomendasikan melakukan ini).
Menyajikan pengontrol tampilan modal lagi menempatkan pengontrol tampilan di atas yang lain, dan sementara itu tidak memiliki masalah acara yang dijelaskan di atas, itu tidak benar-benar 'menukar' pengendali tampilan, ia menumpuknya.
Storyboard terbatas untuk iOS 5, dan hampir ideal, tetapi tidak dapat digunakan di semua proyek.
Dapatkah seseorang menampilkan CONTOH KODE SOLID dalam cara mengubah pengontrol tampilan tanpa batasan di atas dan memungkinkan transisi animasi di antara mereka?
Contoh dekat, tetapi tidak ada animasi: Cara menggunakan beberapa pengontrol tampilan khusus iOS tanpa pengontrol navigasi
Sunting: Penggunaan Nav Controller baik-baik saja, tetapi perlu ada gaya transisi animasi (bukan hanya efek slide) pengendali tampilan yang ditampilkan harus ditukar sepenuhnya (tidak ditumpuk). Jika pengontrol tampilan kedua harus menghapus pengontrol tampilan lain dari tumpukan, maka itu tidak cukup dienkapsulasi.
Sunting 2: iOS 4 harus menjadi OS dasar untuk pertanyaan ini, saya harus menjelaskan bahwa ketika menyebutkan storyboard (di atas).
sumber
Jawaban:
EDIT: Jawaban baru yang berfungsi dalam orientasi apa pun. Jawaban asli hanya berfungsi ketika antarmuka dalam orientasi potret. Ini adalah animasi transisi tampilan b / c yang menggantikan tampilan dengan tampilan berbeda harus terjadi dengan tampilan setidaknya tingkat di bawah tampilan pertama yang ditambahkan ke jendela (mis
window.rootViewController.view.anotherView
.).Saya telah mengimplementasikan kelas kontainer sederhana yang saya panggil
TransitionController
. Anda dapat menemukannya di https://gist.github.com/1394947 .Sebagai tambahan, saya lebih suka implementasi di kelas yang terpisah b / c lebih mudah untuk digunakan kembali. Jika Anda tidak menginginkannya, Anda bisa menerapkan logika yang sama secara langsung di delegasi aplikasi Anda untuk menghilangkan kebutuhan
TransitionController
kelas. Namun, logika yang Anda butuhkan akan sama.Gunakan sebagai berikut:
Di delegasi aplikasi Anda
Untuk beralih ke pengontrol tampilan baru dari pengontrol tampilan apa pun
Sunting: Jawaban Asli di bawah - hanya berfungsi untuk orientasi portait
Saya membuat asumsi berikut untuk contoh ini:
Anda memiliki pengontrol tampilan yang ditetapkan sebagai
rootViewController
jendela AndaSaat Anda beralih ke tampilan baru, Anda ingin mengganti viewController saat ini dengan viewController yang memiliki tampilan baru. Kapan saja, hanya viewController saat ini yang hidup (mis.
Kode dapat dengan mudah dimodifikasi untuk bekerja secara berbeda, kuncinya adalah transisi animasi dan pengontrol tampilan tunggal. Pastikan Anda tidak mempertahankan pengontrol tampilan di mana pun di luar penetapan itu
window.rootViewController
.Kode untuk menghidupkan transisi dalam delegasi aplikasi
Contoh digunakan dalam pengontrol tampilan
sumber
TransitionController.m
menjadiUIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
, tetapi saya hanya menggunakan ini pada versi terbaru iOS, jadi uji dengan cermat.Anda dapat menggunakan sistem penahanan viewController baru Apple. Untuk informasi lebih lanjut, lihat video sesi WWDC 2011 "Implementing
UIViewController
Containment".Baru di iOS5,
UIViewController
Containment memungkinkan Anda memiliki viewController induk dan sejumlah viewController anak yang terkandung di dalamnya. Ini adalah cara kerja UISplitViewController. Dengan melakukan ini, Anda dapat menumpuk view controller di dalam induk, tetapi untuk aplikasi khusus Anda, Anda hanya menggunakan induk untuk mengelola transisi dari satu viewController yang terlihat ke yang lain. Ini adalah cara yang disetujui Apple untuk melakukan sesuatu dan menjiwai dari satu viewController anak tidak menyakitkan. Plus Anda bisa menggunakan semua berbagaiUIViewAnimationOption
transisi yang berbeda !Juga, dengan UIViewContainment, Anda tidak perlu khawatir, kecuali jika Anda mau, tentang kekacauan mengelola viewControllers anak selama acara orientasi. Anda bisa menggunakan yang berikut ini untuk memastikan parentViewView Anda meneruskan kejadian rotasi ke viewControllers anak.
Anda dapat melakukan hal berikut atau serupa dalam metode viewDidLoad orang tua Anda untuk mengatur childViewController pertama:
kemudian ketika Anda perlu mengubah child viewController, Anda memanggil sesuatu di sepanjang baris berikut dalam induk viewController:
Saya memposting proyek contoh lengkap di sini: https://github.com/toolmanGitHub/stackedViewControllers . Ini proyek lain menunjukkan bagaimana menggunakan
UIViewController
kendali pada beberapa berbagai jenis masukan viewController yang tidak mengambil seluruh layar. Semoga berhasilsumber
[self.currentViewController willMoveToParentViewController:nil];
sebelum transisi?OK, saya tahu pertanyaannya mengatakan tanpa menggunakan pengontrol navigasi, tetapi tidak ada alasan untuk tidak melakukannya. OP tidak menanggapi komentar pada waktunya untuk saya tidur. Jangan memilih saya. :)
Berikut cara memunculkan pengontrol tampilan saat ini dan beralih ke pengontrol tampilan baru menggunakan pengontrol navigasi:
sumber
Karena saya baru saja menemukan masalah yang tepat ini, dan mencoba variasi pada semua jawaban yang sudah ada sebelumnya untuk kesuksesan terbatas, saya akan memposting bagaimana saya akhirnya menyelesaikannya:
Seperti dijelaskan dalam posting ini pada segmen khusus , sebenarnya sangat mudah untuk membuat segmen khusus. Mereka juga sangat mudah dihubungkan di Interface Builder, mereka membuat hubungan di IB tetap terlihat, dan mereka tidak memerlukan banyak dukungan oleh pengontrol tampilan sumber / tujuan.
Posting yang ditautkan di atas menyediakan kode iOS 4 untuk menggantikan pengontrol tampilan atas saat ini pada tumpukan navigationController dengan yang baru menggunakan animasi slide-in-dari-atas.
Dalam kasus saya, saya ingin penggantian segmen yang sama terjadi, tetapi dengan
FlipFromLeft
transisi. Saya juga hanya membutuhkan dukungan untuk iOS 5+. Kode:Dari RAFlipReplaceSegue.h:
Dari RAFlipReplaceSegue.m:
Sekarang, kontrol-seret untuk menyiapkan segala jenis segue lainnya, lalu buat Segue khusus, dan ketikkan nama kelas segue khusus, lalu pilih!
sumber
–performSegueWithIdentifier:sender:
metode UIViewController's .Saya berjuang dengan yang ini untuk waktu yang lama, dan salah satu masalah saya tercantum di sini , saya tidak yakin jika Anda memiliki masalah itu. Tapi inilah yang akan saya rekomendasikan jika harus bekerja dengan iOS 4.
Pertama, buat
NavigationController
kelas baru . Di sinilah kita akan melakukan semua pekerjaan kotor - kelas lain akan dapat "bersih" memanggil metode instance sepertipushViewController:
dan semacamnya. Di Anda.h
:Array pengontrol tampilan anak akan berfungsi sebagai toko untuk semua pengontrol tampilan di tumpukan kami. Kami akan meneruskan semua rotasi dan mengubah ukuran kode secara otomatis dari
NavigationController
tampilan kecurrentController
.Sekarang, dalam implementasi kami:
Sekarang Anda dapat menerapkan kebiasaan Anda sendiri
pushViewController:
,popViewController
dan semacamnya, menggunakan pemanggilan metode ini.Semoga berhasil, dan saya harap ini membantu!
sumber
viewWillAppear
,viewDidAppear
, dan semacamnya.Coba Kode Ini.
Kode ini memberikan Transisi dari pengontrol tampilan ke pengontrol tampilan lain yang memiliki pengontrol navigasi.
sumber