Saya memiliki tampilan sederhana (sisi kiri gambar) dan saya perlu membuat semacam overlay (sisi kanan gambar) untuk tampilan ini. Hamparan ini harus memiliki beberapa opasitas, jadi tampilan di bawahnya masih terlihat sebagian. Yang terpenting overlay ini harus memiliki lubang melingkar di tengahnya sehingga tidak menutupi bagian tengah tampilan (lihat gambar di bawah).
Saya dapat dengan mudah membuat lingkaran seperti ini:
int radius = 20; //whatever
CAShapeLayer *circle = [CAShapeLayer layer];
circle.path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0,radius,radius) cornerRadius:radius].CGPath;
circle.position = CGPointMake(CGRectGetMidX(view.frame)-radius,
CGRectGetMidY(view.frame)-radius);
circle.fillColor = [UIColor clearColor].CGColor;
Dan hamparan persegi panjang "penuh" seperti ini:
CAShapeLayer *shadow = [CAShapeLayer layer];
shadow.path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, view.bounds.size.width, view.bounds.size.height) cornerRadius:0].CGPath;
shadow.position = CGPointMake(0, 0);
shadow.fillColor = [UIColor grayColor].CGColor;
shadow.lineWidth = 0;
shadow.opacity = 0.5;
[view.layer addSublayer:shadow];
Tetapi saya tidak tahu bagaimana saya bisa menggabungkan dua lapisan ini sehingga mereka menciptakan efek yang saya inginkan. Siapa saja? Aku sudah mencoba segalanya ... Terima kasih banyak atas bantuannya!
ios
objective-c
calayer
quartz-core
animal_chin
sumber
sumber
moveToPoint
, lalu tambahkan persegi bulat. Periksa dokumen untuk metode yang ditawarkan olehUIBezierPath
.Jawaban:
Saya bisa menyelesaikan ini dengan saran Jon Steinmetz. Jika ada yang peduli, inilah solusi akhirnya:
Swift 3.x:
Swift 4.2 & 5:
sumber
Untuk membuat efek ini, saya merasa paling mudah untuk membuat seluruh tampilan melapisi layar, kemudian mengurangkan bagian layar menggunakan lapisan dan UIBezierPaths. Untuk implementasi Swift:
Saya menguji kode di atas, dan inilah hasilnya:
Saya menambahkan perpustakaan ke CocoaPods yang mengabstraksi banyak kode di atas dan memungkinkan Anda untuk dengan mudah membuat overlay dengan lubang persegi panjang / melingkar, memungkinkan pengguna untuk berinteraksi dengan tampilan di balik overlay. Saya menggunakannya untuk membuat tutorial ini untuk salah satu aplikasi kami:
Pustaka ini disebut TAOverlayView , dan open source di bawah Apache 2.0. Semoga bermanfaat!
sumber
Solusi yang diterima kompatibel dengan Swift 3.0
sumber
Saya mengambil pendekatan yang mirip dengan animal_chin, tetapi saya lebih visual, jadi saya mengatur sebagian besar di Interface Builder menggunakan outlet dan tata letak otomatis.
Inilah solusi saya di Swift
sumber
Kompatibel dengan Kode Swift 2.0
Mulai dari jawaban @animal_inch, saya mengkodekan sedikit kelas utilitas, semoga akan menghargai:
Lalu, di mana pun dalam kode Anda:
sumber