Saya mencoba untuk menambahkan bayangan jatuh ke tampilan yang berlapis di atas satu sama lain, tampilan runtuh memungkinkan konten di tampilan lain untuk dilihat, dalam hal ini saya ingin tetap view.clipsToBounds
AKTIF sehingga ketika tampilan menciutkan, konten mereka terpotong.
Hal ini tampaknya membuat saya sulit untuk menambahkan drop shadow ke lapisan seperti saat saya clipsToBounds
MENGAKTIFKAN bayangan juga terpotong.
Saya telah mencoba untuk memanipulasi view.frame
dan view.bounds
untuk menambahkan bayangan jatuh ke bingkai tetapi membiarkan batasnya cukup besar untuk melingkupinya, namun saya tidak beruntung dengan ini.
Berikut adalah kode yang saya gunakan untuk menambahkan Shadow (ini hanya berfungsi dengan clipsToBounds
OFF seperti yang ditunjukkan)
view.clipsToBounds = NO;
view.layer.shadowColor = [[UIColor blackColor] CGColor];
view.layer.shadowOffset = CGSizeMake(0,5);
view.layer.shadowOpacity = 0.5;
Berikut adalah tangkapan layar dari bayangan yang sedang diterapkan ke lapisan abu-abu paling terang atas. Semoga ini memberi gambaran tentang bagaimana konten saya akan tumpang tindih jika clipsToBounds
NONAKTIF.
Bagaimana cara menambahkan bayangan ke saya UIView
dan menjaga konten saya tetap terpotong?
Sunting: Hanya ingin menambahkan bahwa saya juga telah bermain-main dengan menggunakan gambar latar belakang dengan bayangan aktif, yang berfungsi dengan baik, namun saya masih ingin mengetahui solusi kode terbaik untuk ini.
masksToBounds = NO;
ke aslinya - dengan kedua upaya saya tetapclipsToBounds = YES;
AKTIF - keduanya gagal untuk memotong konten. berikut adalah screencap tentang apa yang terjadi dengan contoh Anda> youtu.be/tdpemc_XdpsUIBezierPath *shadowPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds cornerRadius:5.0];
. Tidak diuji tetapi harus memberikan hasil yang Anda inginkan.layoutSubviews()
dipanggil. Dan jika kita tidak mengimbangi di tempat itu dengan menyesuaikanshadowPath
untuk mencerminkan ukuran saat ini, kita akan memiliki tampilan yang diubah ukurannya tetapi bayangannya akan tetap menjadi ukuran (awal) yang lama dan tidak muncul atau mengintip di tempat yang tidak semestinya. .Jawaban Wasabii di Swift 2.3:
Dan di Swift 3/4/5:
Letakkan kode ini di layoutSubviews () jika Anda menggunakan AutoLayout.
Di SwiftUI, ini semua jauh lebih mudah:
sumber
layoutSubviews
CGSize(width: 0, height: 0.5)
view.bounds
belum dibuat begitu jelas sehinggashadowPath
tidak bisa mereferensikan tampilan persegi tetapi beberapaCGRectZero
sebagai gantinya. Bagaimanapun, meletakkan ini di bawahlayoutSubviews
menyelesaikan masalah saya akhirnya!Triknya adalah menentukan
masksToBounds
properti lapisan tampilan Anda dengan benar:dan itu harus berhasil.
( Sumber )
sumber
Anda dapat membuat ekstensi untuk UIView untuk mengakses nilai-nilai ini di editor desain
sumber
Anda juga dapat mengatur bayangan ke tampilan Anda dari storyboard
sumber
On viewWillLayoutSubviews:
Menggunakan Ekstensi UIView:
Pemakaian:
sumber
targetView: UIView
dan lepaskan poni.self
? Sepertinya jauh lebih nyaman bagi saya.if let
sintaks daripada!
Jadi ya, Anda harus memilih properti shadowPath untuk kinerja, tetapi juga: Dari file header CALayer.shadowPath
Menentukan jalur secara eksplisit menggunakan properti ini biasanya akan * meningkatkan kinerja rendering, seperti halnya berbagi referensi jalur * yang sama di beberapa lapisan
Trik yang kurang dikenal adalah berbagi referensi yang sama di beberapa lapisan. Tentu saja mereka harus menggunakan bentuk yang sama, tetapi ini umum terjadi pada sel tampilan tabel / koleksi.
Saya tidak tahu mengapa ini menjadi lebih cepat jika Anda berbagi contoh, saya kira itu menyimpan rendering bayangan dan dapat menggunakannya kembali untuk contoh lain dalam tampilan. Saya ingin tahu apakah ini bahkan lebih cepat dengan
sumber