Saya mencoba menghadirkan pengontrol tampilan secara modern, dengan latar belakang transparan. Tujuan saya adalah membiarkan tampilan pengontrol tampilan yang disajikan dan disajikan ditampilkan pada saat yang bersamaan. Masalahnya adalah, ketika animasi presentasi selesai, tampilan pengendali tampilan presentasi menghilang.
- (IBAction)pushModalViewControllerButtonPressed:(id)sender
{
ModalViewController *modalVC = [[ModalViewController alloc] init];
[self presentViewController:modalVC animated:YES completion:nil];
}
Saya tahu saya bisa menambahkan tampilan sebagai subview, tetapi saya ingin menghindari solusi ini karena beberapa alasan. Bagaimana saya bisa memperbaikinya?
Jawaban:
Kode berikut ini hanya berfungsi di iPad.
Saya akan menambahkan sub tampilan.
Ini diskusi yang sangat bagus. Lihatlah komentar secara khusus. Bukan hanya jawabannya.
Modal View
Jika aku jadi kamu, aku tidak akan melakukannya. Saya akan menambahkan tampilan sub dan melakukannya. Tampaknya memberi saya kontrol yang lebih baik terhadap banyak hal.
EDIT:
Seperti yang disebutkan oleh Paul Linsay, karena iOS 8 yang dibutuhkan hanyalah
UIModalPresentationOverFullScreen
modalPresentationStyle dari ViewController yang disajikan. Ini juga akan mencakup tombol navigationBar dan tabBar.sumber
modalPresentationStyle = UIModalPresentationCurrentContext
pada presenter pandangan controller, dan tidak dalam disajikan satu.ViewController
. (mis. aNavigationController
atau instance dari pengontrol tampilan menu slide Anda misalnya).UIModalPresentationCustom
, dan hanya jika diatur tepat sebelumpresentViewController
daripada padaviewDidLoad
.modalPresentationStyle
sebelumnyaviewDidLoad
. Saya melakukannya di konstruktor dan berhasil.Bagi orang yang mencoba untuk mendapatkan ini untuk bekerja di iOS 8, "Apple-disetujui" cara untuk menampilkan transparan controller tampilan modal adalah dengan menetapkan
modalPresentationStyle
pada saat ed kontroler untukUIModalPresentationOverCurrentContext
.Ini bisa dilakukan dalam kode, atau dengan mengatur properti segue di storyboard.
Dari dokumentasi UIViewController:
https://developer.apple.com/documentation/uikit/uiviewcontroller
Video 'View Controller Advancements in iOS 8' dari WWDC 2014 menjelaskan hal ini secara terperinci.
catatan:
viewDidLoad
dari the disajikanViewController tidak akan mempengaruhisumber
sourceVC
adalahself.navigationController
. Juga, hanya setelah mengatur gaya presentasi target sebagai kustom, saya bisa melihatnya.[sourceVC setModalPresentationStyle:UIModalPresentationCurrentContext];
,[targetVC setModalPresentationStyle:UIModalPresentationCustom];
Mudah-mudahan itu akan membantu seseorang.presentedVC.modalPresentationStyle = UIModalPresentationOverCurrentContext
di menghadirkan VC. Tidak berfungsi di dalamVC yang disajikan. Percayalah, saya mencoba.Di iOS 8.0 dan di atas dapat dilakukan dengan menyetel properti modalPresentationStyle untuk UIModalPresentationOverCurrentContext
sumber
.custom
dan.overFullScreen
berfungsi..overFullScreen
pengontrol tampilan iniviewWillAppear
tidak akan dipanggil.presentedController.view.backgroundColor = #color#
harus ditulis dalampresentedController
'sviewDidLoad
, atau yang lainpresentedController
' s kehidupan terganggu.Kode ini berfungsi dengan baik di iPhone di bawah iOS6 dan iOS7:
Dalam hal ini Anda kehilangan animasi slide-on. Untuk mempertahankan animasi, Anda masih dapat menggunakan ekstensi "tidak elegan" berikut:
Jika presentingV kami terletak di dalam UINavigationController atau UITabbarController, Anda harus beroperasi dengan pengendali itu sebagai presentingVC.
Selanjutnya, di iOS7 Anda dapat menerapkan
UIViewControllerTransitioningDelegate
protokol penerapan animasi transisi kustom . Tentu saja, dalam hal ini Anda bisa mendapatkan latar belakang yang transparanPertama, sebelum presentasi Anda harus mengatur
modalPresentationStyle
Maka Anda harus menerapkan dua metode protokol
Hal terakhir adalah menentukan transisi khusus Anda di
CustomAnimatedTransitioning
kelassumber
modalPresentationStyle
juga diatur!Saya sedikit kesulitan dengan Interface Builder dari XCode 7 untuk mengatur Gaya Presentasi seperti yang disarankan @VuuGopalTewari. Dalam versi ini, sepertinya tidak ada mode presentasi
Over Current Context
atauOver Full Screen
untuk segue. Jadi, untuk membuatnya bekerja, saya mengatur mode keDefault
:dengan
Selain itu saya mengatur mode presentasi dari pengontrol tampilan yang disajikan secara digital ke
Over Full Screen
:sumber
Buat segue untuk mempresentasikan secara modern dan setel properti Presentasi dari segue ke konteks saat ini, ia akan bekerja 100%
sumber
PresentViewController dengan latar belakang Transparan - di iOS 8 dan iOS 9
Dan di MYViewController mengatur warna latar belakang hitam dan mengurangi opacity
sumber
Ini sedikit cara hacky, tetapi bagi saya kode ini berfungsi (iOS 6):
Kode ini juga berfungsi di iPhone
sumber
Kategori ini cocok untuk saya (ios 7, 8 dan 9)
File H
File M.
sumber
Solusi untuk jawaban ini menggunakan swift adalah sebagai berikut.
sumber
Jika Anda menggunakan Storyboard, Anda dapat mengikuti langkah ini:
sumber
Saya menambahkan tiga baris ini dalam metode init di controller tampilan yang disajikan, dan bekerja seperti pesona:
EDIT (bekerja di iOS 9.3):
Sesuai dokumentasi:
Tersedia di iOS 8.0 dan yang lebih baru.
sumber
Cara alternatif adalah dengan menggunakan "tampilan wadah". Buat saja alpha di bawah 1 dan embed dengan seque. XCode 5, target iOS7. Diuji pada iPhone.
Tampilan kontainer tersedia dari iOS6. Tautan ke posting blog tentang itu.
sumber
Saya telah membuat objek untuk menangani presentasi dari apa yang saya sebut "modal superposed", yang berarti ia mempertahankan tampilan latar belakang dan memungkinkan Anda untuk memiliki modal dengan latar belakang transparan.
Ini memiliki satu, metode sederhana yang melakukan ini:
Sangat penting untuk menyetel
modalPresentationCapturesStatusBarAppearance
properti keYES
dan memaksa tampilan bilah status untuk memperbarui, jika pengontrol tampilan yang disajikan Anda memiliki yang berbedapreferredStatusBarStyle
.Objek ini harus memiliki
@property (assign, nonatommic) isPresenting
Anda ingin objek ini untuk memenuhi ke
UIViewControllerAnimatedTransitioning
danUIViewControllerTransitioningDelegate
protokol dan menerapkan metode berikut:dan:
Ini melakukan animasi slide-in-from-the-bottom meniru modal animasi default, tetapi Anda dapat membuatnya apa pun yang Anda inginkan.
Yang penting adalah bahwa pandangan pengendali tampilan presentasi akan tetap di belakang, membiarkan Anda membuat efek transparan.
Solusi ini berfungsi untuk iOS 7+
sumber
Cara yang sangat sederhana untuk melakukan ini (menggunakan
Storyboards
, misalnya) adalah:Hal ini akan menyajikan
UIViewController
dalamStoryboard
modally, tapi dengan latar belakang tembus.sumber
Bekerja untuk iOS 7-10
sumber
Untuk merangkum semua jawaban dan komentar yang baik di sini dan masih memiliki animasi saat pindah ke yang baru,
ViewController
inilah yang saya lakukan: (Mendukung iOS 6 dan lebih tinggi)Jika Anda menggunakan
UINavigationController
\UITabBarController
ini adalah cara untuk pergi:Jika Anda melakukannya, Anda akan kehilangan
modalTransitionStyle
animasi. Untuk mengatasinya Anda dapat dengan mudah menambahkan keSomeViewController
kelas Anda ini:sumber
Tentu saja Anda harus mengatur UIModalPresentationCurrentContext, tetapi tempat untuk mengatur clearColor juga sangat penting! Anda tidak dapat mengatur latar belakang dalam fungsi viewDidLoad, atur sebelum tampilan memuat seperti pada pengontrol tampilan root atau pada fungsi init dari pengontrol yang akan ditampilkan!
atau
sumber
Jika Anda menggunakan modal segue, pastikan untuk mengaturnya sebagai gambar ini (Anda dapat mematikan animasi jika Anda mau)
sumber
Metode lengkap yang diuji pada iOS 7 dan iOS 8.
sumber
Cepat 4.2
sumber
di appdelegate:
di Anda controller tampilan pertama dari mana Anda harus memuat tampilan berikutnya:
di nextViewController Anda yang akan ditambahkan transparan:
sumber
Kita perlu mengatur Modal kita dengan benar.
target tautan gambar
Pertama, kita perlu mengubah latar belakang View Controller's View menjadi Clear color. Ini berarti harus transparan. Secara default, tampilan itu berwarna putih.
Kedua, kita perlu memilih Segue yang mengarah ke layar Login, dan di Inspektur Atribut, atur Presentation ke Over Current Context. Opsi ini hanya tersedia jika Tata Letak Otomatis dan Kelas Ukuran diaktifkan.
target tautan gambar
sumber
Atur navigasi
modalPresentationStyle
menjadiUIModalPresentationCustom
dan mengatur warna latar belakang pengendali tampilan yang disajikan sebagai warna bening.
sumber