Pertanyaan CALayers tidak diubah ukurannya pada perubahan batas UIView-nya. Mengapa?


Saya punya UIView yang memiliki sekitar 8 berbeda CALayer sublapisan ditambahkan ke lapisannya. Jika Saya mengubah batas pandangan (animasi), maka tampilan itu sendiri menyusut (saya memeriksanya dengan backgroundColor), tapi ukuran subbolder tetap tidak berubah.

Bagaimana mengatasi ini?


76
2018-03-23 22:43


asal


Jawaban:


Saya menggunakan pendekatan yang sama yang digunakan Solin, tetapi ada kesalahan dalam kode itu. Metode ini harus:

- (void)layoutSubviews {
  // resize your layers based on the view's new bounds
  mylayer.frame = self.bounds;
}

Untuk tujuan saya, saya selalu ingin sublayer menjadi ukuran penuh dari tampilan induk. Masukkan metode itu di kelas tampilan Anda.


118
2017-11-04 15:37



Karena CALayer pada iPhone tidak mendukung manajer tata letak, saya rasa Anda harus menjadikan lapisan utama tampilan Anda sebagai sub-kelas CALayer khusus yang Anda ganti layoutSublayers untuk mengatur frame dari semua sublayer. Anda juga harus mengesampingkan pandangan Anda +layerClass metode untuk mengembalikan kelas subclass CALayer baru Anda.


23
2018-03-24 00:40



Saya menggunakan ini di UIView.

-(void)layoutSublayersOfLayer:(CALayer *)layer
{
    if (layer == self.layer)
    {
        _anySubLayer.frame = layer.bounds;
    }

super.layoutSublayersOfLayer(layer)
}

Bekerja untukku.


10
2018-02-27 03:39



Saya memiliki masalah yang sama. Dalam lapisan tampilan kustom saya menambahkan dua sublayers lagi. Untuk mengubah ukuran sublayers (setiap kali batas tampilan kustom berubah), saya menerapkan metode layoutSubviews dari tampilan kebiasaan saya; di dalam metode ini saya hanya memperbarui setiap frame sublayer untuk mencocokkan batas-batas lapisan subview saya saat ini.

Sesuatu seperti ini:

-(void)layoutSubviews{
   //keep the same origin, just update the width and height
   if(sublayer1!=nil){
      sublayer1.frame = self.layer.bounds;
   }
}

8
2017-07-28 08:21



Swift 3 Version 

Di Sel khusus, Tambahkan baris Mengikuti

Deklarasikan dulu

let gradientLayer: CAGradientLayer = CAGradientLayer()

Kemudian tambahkan baris berikut

override func layoutSubviews() {
    gradientLayer.frame = self.YourCustomView.bounds
}

3
2018-06-08 10:38



2017

Jawaban harfiah untuk pertanyaan ini:

"CALayers tidak diubah ukurannya pada perubahan batas UIView-nya. Kenapa?"

apakah itu baik atau buruk

needsDisplayOnBoundsChange

default ke false di CALayer.

larutan,

class CircularGradientViewLayer: CALayer {

    override init() {

        super.init()
        needsDisplayOnBoundsChange = true
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override open func draw(in ctx: CGContext) {
        go crazy drawing in .bounds
    }
}

Memang, saya mengarahkan Anda ke QA ini

https://stackoverflow.com/a/47760444/294884

yang menjelaskan, apa sih yang kritis contentsScale pengaturan tidak; Anda biasanya perlu mengaturnya dengan sama ketika Anda mengatur kebutuhanDisplayOnBoundsChange.


2
2017-12-11 17:56



Seperti [Ole] menulis CALayer tidak mendukung autoresizing di iOS. Jadi Anda harus menyesuaikan tata letak secara manual. Pilihan saya adalah menyesuaikan frame layer dalam (iOS 7 dan sebelumnya)

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 

atau (mulai iOS 8)

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinato

0
2018-03-01 12:59