Secara terprogram membuat UIView dengan gradien warna
292
Saya mencoba untuk menghasilkan tampilan dengan latar belakang warna gradien (warna solid ke transparan) saat runtime. Apakah ada cara untuk melakukan itu?
Jika ada tampilan lain yang ditambahkan ke ini UIView(seperti a UILabel), Anda mungkin ingin mempertimbangkan pengaturan warna latar belakang UIViewuntuk [UIColor clearColor]sehingga tampilan gradien disajikan bukan warna latar belakang untuk sub tampilan. Menggunakan clearColormemiliki sedikit performa yang melanda.
+1 untuk jumlah kode terpendek dari semua solusi. Saya baru saja menambahkan ke pengontrol tampilan yang ada, mengubah 2 referensi viewke self.viewdan itu bekerja seperti pesona :)
Ergin
4
Yang juga relevan adalah tempat menambahkan kode ini. Saya memerlukan pos berikut untuk membuatnya berfungsi: stackoverflow.com/a/20059268/1480518
Garrett Disco
13
Ini sangat membantu saya! Kehilangan bagian CGColor di tempat lain! Terima kasih
Gyfis
48
Jangan lupa untuk menggunakan 'startPoint' dan 'endPoint' untuk mengubah arah gradien. Nilai default adalah (0,5, 0) dan (0,5,1) - dari arah atas ke bawah.
Valentin Shamardin
12
Ketika UIView saya menggunakan AutoLayout, saya juga harus menelepon gradient.frame = view.boundsdi viewDidAppear()dan di didRotateFromInterfaceOrientation()atau gradien tidak akan berukuran benar.
Halo @LaloLoop, terima kasih atas komentarnya! Saya telah memperbarui kodenya. Saya pikir saya tidak perlu menimpa init(frame:CGRect). Saya menguji kode yang diperbarui dan berfungsi dengan baik.
Yuchen Zhong
@Yuchen Zhong Itu menabrak di IB, tetapi bekerja di app. Adakah alasan mengapa itu tidak diberikan dalam IB jika @IBDesignabledigunakan?
Alexander Volkov
@AlexanderVolkov Mungkin ada masalah lain? Kami telah menggunakannya seperti itu di storyboard dan sepertinya tidak memiliki masalah. Anda dapat men-debug storyboard Anda dan melihat baris mana yang menabraknya.
Yuchen Zhong
1
Solusi terbaik !
Baran Emre
40
Coba ini berhasil seperti pesona bagi saya,
Tujuan C
Saya telah mengatur warna latar belakang gradien RGB ke UIview
Untuk mempromosikan usabilitas, saya katakan buat kategori CAGradientLayerdan tambahkan gradien yang Anda inginkan sebagai metode kelas. Tentukan mereka dalam headerfile seperti ini:
di mana Anda harus meletakkan kode untuk menggunakannya? apa metode siklus hidup? viewdidappear membuatnya tampak terlambat satu detik. viewdidload dan viewdidappear menyebabkannya tidak berfungsi saat berputar. viewdidlayoutsubviews berfungsi lebih baik untuk rotasi tetapi masih terlihat sedikit berombak.
Adam Johns
Saya pribadi memasukkannya ke dalamviewDidLoad
Sam Fischer
1
Ketika saya memasukkannya viewDidLoad, itu tidak berfungsi jika aplikasi diluncurkan dalam orientasi lanskap. Solusi saya adalah membuat bingkai lapisan latar belakang lebih luas dari bingkai view.fr untuk mengimbangi orientasi lainnya.
Adam Johns
2
viewDidLoad berfungsi, Anda hanya perlu juga mengatur AutoResizingMask menggunakan [backgroundLayer setAutoresizingMask: UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
ekscrypto
21
Karena saya hanya memerlukan satu jenis gradien di seluruh aplikasi saya, saya membuat subkelas UIView dan mengkonfigurasikan sebelumnya lapisan gradien pada inisialisasi dengan warna-warna tetap. Inisialisasi dari UIView memanggil metode configureGradientLayer , yang mengkonfigurasi CAGradientLayer:
#import "DDGradientView.h"@implementationDDGradientView// Change the views layer class to CAGradientLayer class+(Class)layerClass
{return[CAGradientLayerclass];}-(instancetype)initWithCoder:(NSCoder*)aDecoder {self=[super initWithCoder:aDecoder];if(self){[self configureGradientLayer];}returnself;}-(instancetype)initWithFrame:(CGRect)frame {self=[super initWithFrame:frame];if(self){[self configureGradientLayer];}returnself;}// Make custom configuration of your gradient here -(void)configureGradientLayer {CAGradientLayer*gLayer =(CAGradientLayer*)self.layer;
gLayer.colors =[NSArray arrayWithObjects:(id)[[UIColor whiteColor]CGColor],(id)[[UIColor lightGrayColor]CGColor],nil];}@end
Saya telah memperluas jawaban yang diterima sedikit menggunakan fungsi ekstensi Swift dan juga enum.
Oh dan jika Anda menggunakan Storyboard seperti yang saya lakukan, pastikan untuk menelepon gradientBackground(from:to:direction:)di viewDidLayoutSubviews()atau lambat.
Cepat 3
enumGradientDirection{case leftToRight
case rightToLeft
case topToBottom
case bottomToTop
}
extension UIView{
func gradientBackground(from color1:UIColor, to color2:UIColor, direction:GradientDirection){let gradient =CAGradientLayer()
gradient.frame =self.bounds
gradient.colors =[color1.cgColor, color2.cgColor]switch direction {case.leftToRight:
gradient.startPoint =CGPoint(x:0.0, y:0.5)
gradient.endPoint =CGPoint(x:1.0, y:0.5)case.rightToLeft:
gradient.startPoint =CGPoint(x:1.0, y:0.5)
gradient.endPoint =CGPoint(x:0.0, y:0.5)case.bottomToTop:
gradient.startPoint =CGPoint(x:0.5, y:1.0)
gradient.endPoint =CGPoint(x:0.5, y:0.0)default:break}self.layer.insertSublayer(gradient, at:0)}}
Panggilan Swift3 harus seperti: myImageView.addGradientWithColor (warna: UIColor.blue)
mgyky
8
Pendekatan Swift
Jawaban ini dibangun di atas jawaban di atas dan menyediakan implementasi untuk menangani masalah gradien yang tidak diterapkan dengan benar selama rotasi. Ini memenuhi masalah ini dengan mengubah lapisan gradien menjadi kuadrat sehingga rotasi di semua arah menghasilkan gradien yang benar. Tanda tangan fungsi menyertakan argumen variadik Swift yang memungkinkan seseorang untuk mengirimkan sebanyak mungkin CGColorRef (CGColor) sesuai kebutuhan (lihat contoh penggunaan). Juga disediakan adalah contoh sebagai ekstensi Swift sehingga orang dapat menerapkan gradien ke UIView apa pun.
Yang berarti latar belakang gradien sekarang dapat diterapkan ke kontrol UIC karena semua kontrol adalah UIViews (atau subkelas) dan semua UIViews memiliki CALayers.
Apa yang Anda cari adalah CAGradientLayer. Setiap UIViewmemiliki lapisan - ke dalam lapisan itu Anda dapat menambahkan sublayers, sama seperti Anda dapat menambahkan subview. Salah satu jenis spesifik adalah CAGradientLayer, di mana Anda memberinya array warna untuk gradiasi di antara.
Salah satu contoh adalah pembungkus sederhana ini untuk tampilan gradien:
Solusi saya adalah membuat UIViewsubclass dengan CAGradientLayerdiakses sebagai properti readonly. Ini akan memungkinkan Anda untuk menyesuaikan gradien Anda seperti yang Anda inginkan dan Anda tidak perlu menangani perubahan tata letak sendiri. Implementasi subkelas:
Saya menggunakan pendekatan ini, mengubah "topview" ke nama IBoutlet saya untuk pandangan saya. Saya menghapus baris "SearchView".
jessi
Rencana yang bagus - mungkin juga perhatikan bahwa Anda dapat menggunakan pengaturan gradient.colors. Jadi, jika Anda mengomentari gradien sederhana. Warna menggunakan warna UI bernama, gambar adalah sama, tetapi jika Anda komentar yang lain, gradien warna kemudian bergantung pada merah ke hijau. Pengguna dapat melakukan keduanya.
jessi
1
Di Swift 3.1 saya telah menambahkan ekstensi ini ke UIView
Jawaban:
Tujuan-C:
Cepat:
Info : gunakan startPoint dan endPoint untuk mengubah arah gradien .
Jika ada tampilan lain yang ditambahkan ke ini
UIView
(seperti aUILabel
), Anda mungkin ingin mempertimbangkan pengaturan warna latar belakangUIView
untuk[UIColor clearColor]
sehingga tampilan gradien disajikan bukan warna latar belakang untuk sub tampilan. MenggunakanclearColor
memiliki sedikit performa yang melanda.sumber
view
keself.view
dan itu bekerja seperti pesona :)gradient.frame = view.bounds
diviewDidAppear()
dan dididRotateFromInterfaceOrientation()
atau gradien tidak akan berukuran benar.Anda dapat membuat kelas khusus
GradientView
:Cepat 5
Di storyboard, setel tipe kelas ke tampilan apa pun yang Anda inginkan memiliki latar belakang gradien:
Ini lebih baik dengan cara berikut:
CLayer
NSConstraint
seperti biasa diUIView
sumber
layerClass
itu tidak lagi berfungsi, itu adalah properti sehingga Anda harus menimpanya seperti properti: stackoverflow.com/questions/28786597/… . Anda juga harus menerapkanoverride init(frame: CGRect)
, periksa jawaban ini: stackoverflow.com/questions/27374330/… . Terima kasih!init(frame:CGRect)
. Saya menguji kode yang diperbarui dan berfungsi dengan baik.@IBDesignable
digunakan?Coba ini berhasil seperti pesona bagi saya,
Tujuan C
Saya telah mengatur warna latar belakang gradien RGB ke UIview
DIPERBARUI: - Swift3 +
Kode : -
Anda dapat menambahkan titik awal dan akhir warna gradien.
Untuk keterangan lebih lanjut, lihat CAGradientLayer Doc
Semoga ini bisa membantu seseorang.
sumber
Ini adalah pendekatan yang saya rekomendasikan.
Untuk mempromosikan usabilitas, saya katakan buat kategori
CAGradientLayer
dan tambahkan gradien yang Anda inginkan sebagai metode kelas. Tentukan mereka dalamheader
file seperti ini:Kemudian di file implementasi Anda, tentukan setiap gradien dengan sintaks ini:
Kemudian cukup impor kategori ini di Anda
ViewController
atau yang lain yang diperlukansubclass
, dan gunakan seperti ini:sumber
viewDidLoad
viewDidLoad
, itu tidak berfungsi jika aplikasi diluncurkan dalam orientasi lanskap. Solusi saya adalah membuat bingkai lapisan latar belakang lebih luas dari bingkai view.fr untuk mengimbangi orientasi lainnya.Karena saya hanya memerlukan satu jenis gradien di seluruh aplikasi saya, saya membuat subkelas UIView dan mengkonfigurasikan sebelumnya lapisan gradien pada inisialisasi dengan warna-warna tetap. Inisialisasi dari UIView memanggil metode configureGradientLayer , yang mengkonfigurasi CAGradientLayer:
DDGradientView.h:
DDGradientView.m:
sumber
initGradientLayer
mirip dengan penginisialisasi. Saya tidak berpikir itu sangat cocok.Implementasi Cepat:
sumber
Saya telah memperluas jawaban yang diterima sedikit menggunakan fungsi ekstensi Swift dan juga enum.
Oh dan jika Anda menggunakan Storyboard seperti yang saya lakukan, pastikan untuk menelepon
gradientBackground(from:to:direction:)
diviewDidLayoutSubviews()
atau lambat.Cepat 3
sumber
Saya telah menerapkan ini dengan cepat dengan ekstensi:
Cepat 3
Cepat 2.2
Tidak, saya dapat mengatur gradien pada setiap tampilan seperti ini:
sumber
Pendekatan Swift
Jawaban ini dibangun di atas jawaban di atas dan menyediakan implementasi untuk menangani masalah gradien yang tidak diterapkan dengan benar selama rotasi. Ini memenuhi masalah ini dengan mengubah lapisan gradien menjadi kuadrat sehingga rotasi di semua arah menghasilkan gradien yang benar. Tanda tangan fungsi menyertakan argumen variadik Swift yang memungkinkan seseorang untuk mengirimkan sebanyak mungkin CGColorRef (CGColor) sesuai kebutuhan (lihat contoh penggunaan). Juga disediakan adalah contoh sebagai ekstensi Swift sehingga orang dapat menerapkan gradien ke UIView apa pun.
Menggunakan:
di viewDidLoad ...
Implementasi ekstensi
Contoh ekstensi kasus penggunaan:
Yang berarti latar belakang gradien sekarang dapat diterapkan ke kontrol UIC karena semua kontrol adalah UIViews (atau subkelas) dan semua UIViews memiliki CALayers.
Cepat 4
Implementasi ekstensi
Contoh ekstensi kasus penggunaan:
sumber
Apa yang Anda cari adalah
CAGradientLayer
. SetiapUIView
memiliki lapisan - ke dalam lapisan itu Anda dapat menambahkan sublayers, sama seperti Anda dapat menambahkan subview. Salah satu jenis spesifik adalahCAGradientLayer
, di mana Anda memberinya array warna untuk gradiasi di antara.Salah satu contoh adalah pembungkus sederhana ini untuk tampilan gradien:
http://oleb.net/blog/2010/04/obgradientview-a-simple-uiview-wrapper-for-cagradientlayer/
Perhatikan bahwa Anda perlu memasukkan kerangka QuartZCore untuk mengakses semua bagian lapisan dari UIView.
sumber
Swift 4:
Memperlihatkan gradien dalam IB dengan benar:
sumber
PEMAKAIAN
sumber
Tampilan cepat sederhana berdasarkan versi Yuchen
Maka Anda dapat menggunakan gradientLayer setelah inisialisasi seperti ini ...
sumber
Solusi saya adalah membuat
UIView
subclass denganCAGradientLayer
diakses sebagai properti readonly. Ini akan memungkinkan Anda untuk menyesuaikan gradien Anda seperti yang Anda inginkan dan Anda tidak perlu menangani perubahan tata letak sendiri. Implementasi subkelas:Pemakaian:
sumber
Adalah ide yang bagus untuk memanggil solusi di atas untuk memperbarui lapisan pada
untuk mendapatkan tampilan diperbarui dengan benar
sumber
SWIFT 3
Untuk menambahkan lapisan gradien pada tampilan Anda
Ikat outlet tampilan Anda
Tentukan CAGradientLayer ()
Berikut adalah kode yang harus Anda tulis di viewDidLoad Anda
YOURVIEW.layoutIfNeeded()
gradient.startPoint = CGPoint(x: CGFloat(0), y: CGFloat(1)) gradient.endPoint = CGPoint(x: CGFloat(1), y: CGFloat(0)) gradient.frame = YOURVIEW.bounds gradient.colors = [UIColor.red.cgColor, UIColor.green.cgColor] gradient.colors = [ UIColor(red: 255.0/255.0, green: 56.0/255.0, blue: 224.0/255.0, alpha: 1.0).cgColor,UIColor(red: 86.0/255.0, green: 13.0/255.0, blue: 232.0/255.0, alpha: 1.0).cgColor,UIColor(red: 16.0/255.0, green: 173.0/255.0, blue: 245.0/255.0, alpha: 1.0).cgColor] gradient.locations = [0.0 ,0.6 ,1.0] YOURVIEW.layer.insertSublayer(gradient, at: 0)
sumber
Di Swift 3.1 saya telah menambahkan ekstensi ini ke UIView
yang kemudian saya panggil
sumber
Saya telah menerapkan ini dalam kode saya.
Sekarang saya bisa melihat gradien pada pandangan saya.
sumber
Untuk memberikan warna gradien ke UIView (swift 4.2)
Cara Penggunaan
sumber