Saya memiliki UIView
yang memiliki sekitar 8 CALayer
sublapisan berbeda yang ditambahkan ke lapisannya. Jika saya memodifikasi batas tampilan (animasi), maka tampilan itu sendiri menyusut (saya memeriksanya dengan a backgroundColor
), tetapi ukuran sub-lapisan tetap tidak berubah .
Bagaimana mengatasi ini?
UITextView
(scrollEnabled = NO) dan tata letak otomatis. Saya memiliki tampilan teks yang disematkan ke tampilan supernya, yang pada gilirannya memiliki sebuahCALayer
di bagian bawahnya sendiri (sebuah perbatasan), dan saya ingin itu memperbarui posisi perbatasan saat ketinggian tampilan teks berubah. Untuk beberapa alasanlayoutSubiews
disebut terlambat (dan posisi lapisan dianimasikan).Karena CALayer di iPhone tidak mendukung pengelola tata letak, saya rasa Anda harus membuat lapisan utama tampilan Anda menjadi subkelas CALayer khusus yang Anda timpa
layoutSublayers
untuk menyetel bingkai dari semua sub -lapisan . Anda juga harus mengganti+layerClass
metode view untuk mengembalikan kelas subkelas CALayer baru Anda.sumber
Saya menggunakan ini di UIView.
Bekerja untuk saya.
sumber
CALayerDelegate
'sdraw(_:in:)
), saya harus juga memanggil_anySubLayer.setNeedsDisplay()
. Kemudian ini berhasil untuk saya.Saya memiliki masalah yang sama. Di lapisan tampilan kustom saya menambahkan dua sub-lapisan lagi. Untuk mengubah ukuran sublayer (setiap kali batas tampilan kustom berubah), saya menerapkan metode ini
layoutSubviews
tampilan kustom saya; di dalam metode ini saya hanya memperbarui setiap bingkai sub-lapisan agar sesuai dengan batas-batas lapisan subview saya saat ini.Sesuatu seperti ini:
sumber
2017
Jawaban literal untuk pertanyaan ini:
"CALayer tidak diubah ukurannya pada perubahan batas UIView. Mengapa?"
apakah itu lebih baik atau lebih buruk
needsDisplayOnBoundsChange
defaultnya adalah false in
CALayer
.larutan,
Memang, saya mengarahkan Anda ke QA ini
https://stackoverflow.com/a/47760444/294884
yang menjelaskan, apa yang dilakukan oleh
contentsScale
pengaturan kritis ; Anda biasanya perlu menyetelnya secara sama saat menyetel needsDisplayOnBoundsChange.sumber
Versi Swift 3
Di sel Kustom, Tambahkan baris Mengikuti
Deklarasikan dulu
Kemudian tambahkan baris berikut
sumber
Seperti yang [Ole] tulis, CALayer tidak mendukung pengubahan ukuran otomatis di iOS. Jadi Anda harus menyesuaikan tata letak secara manual. Pilihan saya adalah menyesuaikan bingkai lapisan di dalam (iOS 7 dan sebelumnya)
atau (pada iOS 8)
sumber
Dalam tampilan kustom Anda, Anda perlu mendeklarasikan variabel untuk lapisan kustom Anda, jangan mendeklarasikan variabel dalam scope init. Dan cukup lakukan sekali, jangan coba setel nilai null dan ulangi
sumber