Cepat
// corner radius
blueView.layer.cornerRadius = 10
// border
blueView.layer.borderWidth = 1.0
blueView.layer.borderColor = UIColor.black.cgColor
// shadow
blueView.layer.shadowColor = UIColor.black.cgColor
blueView.layer.shadowOffset = CGSize(width: 3, height: 3)
blueView.layer.shadowOpacity = 0.7
blueView.layer.shadowRadius = 4.0
Menjelajahi opsi
Masalah 1: Bayangan terpotong
Bagaimana jika ada sublayers atau subview (seperti gambar) yang isinya ingin kita klip ke batas tampilan kita?
Kita bisa menyelesaikan ini dengan
blueView.layer.masksToBounds = true
(Atau, blueView.clipsToBounds = true
berikan hasil yang sama .)
Tapi, oh tidak! Bayangan itu juga terpotong karena berada di luar batas! Apa yang harus dilakukan? Apa yang harus dilakukan?
Larutan
Gunakan tampilan terpisah untuk bayangan dan perbatasan. Tampilan dasar transparan dan memiliki bayangan. Tampilan perbatasan klip setiap subkonten lain yang ada di perbatasannya.
// add the shadow to the base view
baseView.backgroundColor = UIColor.clear
baseView.layer.shadowColor = UIColor.black.cgColor
baseView.layer.shadowOffset = CGSize(width: 3, height: 3)
baseView.layer.shadowOpacity = 0.7
baseView.layer.shadowRadius = 4.0
// add the border to subview
let borderView = UIView()
borderView.frame = baseView.bounds
borderView.layer.cornerRadius = 10
borderView.layer.borderColor = UIColor.black.cgColor
borderView.layer.borderWidth = 1.0
borderView.layer.masksToBounds = true
baseView.addSubview(borderView)
// add any other subcontent that you want clipped
let otherSubContent = UIImageView()
otherSubContent.image = UIImage(named: "lion")
otherSubContent.frame = borderView.bounds
borderView.addSubview(otherSubContent)
Ini memberikan hasil sebagai berikut:
Masalah 2: Performa buruk
Menambahkan sudut bulat dan bayangan bisa menjadi hit kinerja. Anda dapat meningkatkan kinerja dengan menggunakan jalur yang telah ditentukan untuk bayangan dan juga menentukan bahwa itu akan di-raster. Kode berikut dapat ditambahkan pada contoh di atas.
baseView.layer.shadowPath = UIBezierPath(roundedRect: baseView.bounds, cornerRadius: 10).cgPath
baseView.layer.shouldRasterize = true
baseView.layer.rasterizationScale = UIScreen.main.scale
Lihat posting ini untuk lebih jelasnya. Lihat di sini dan di sini juga.
Jawaban ini diuji dengan Swift 4 dan Xcode 9.