Saya ingin dapat mengubah UIColor menjadi gradien. Cara saya bermaksud melakukan ini adalah dengan menggunakan Core Graphics untuk menggambar gradien. Apa yang saya coba lakukan adalah mendapatkan warna, katakan saja:
[UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0];
dan dapatkan UIColor yang beberapa warna lebih gelap dan beberapa warna lebih terang. Adakah yang tahu bagaimana melakukan ini? Terima kasih.
objective-c
ios
core-graphics
gradient
uicolor
CoreCode
sumber
sumber
Jawaban:
Gunakan seperti ini:
EDIT : seperti yang ditunjukkan oleh @Anchu Chimala, untuk fleksibilitas maksimum, metode ini harus diimplementasikan sebagai kategori UIColor. Juga, dari ide @ Riley, mungkin ide yang lebih baik untuk membuat warna lebih gelap atau lebih terang daripada menambahkan atau mengurangi nilai konstan. Seperti yang ditunjukkan oleh @jrturton, tidak perlu memanipulasi komponen RGB; lebih baik untuk memodifikasi properti kecerahan itu sendiri. Semua seutuhnya:
sumber
getHue:saturation:brightness
tanda tangan UIKit, tampaknya ini berfungsi dengan HSV daripada HSB. Mengubah kecerahan (jadi sebenarnya, nilai) dalam konteks ini tidak akan berfungsi. Misalnya murni Merah (rgb (255,0,0)) akan memiliki kecerahan / nilai 1, sehingga membuat penerangan melalui kecerahan tidak mungkin. Saya akhirnya bekerja dengan perubahan pada nilai RGB sebagai gantinya.getHue:saturation:brightness:alpha
akan mengembalikan SALAH.luminance
nilai ruang warna LAB adalah yang benar yang harus Anda pedulikan ketika membuat warna lebih terang / lebih gelap. Lihat jawaban saya tentang bagaimana Anda dapat memanfaatkannya dan menyelesaikan masalah ini dengan cara yang benar.TL; DR:
Cepat:
Pemakaian:
Tujuan-C:
@rchampourlier benar dalam komentarnya ke @ user529758 (Jawaban yang diterima) - Solusi HSB (Atau HSV) dan RGB memberikan hasil yang sangat berbeda. RGB hanya menambahkan (Atau membuat warna lebih dekat dengan) putih, dan solusi HSB membawa warna lebih dekat ke tepi dalam skala Brigtness - yang pada dasarnya dimulai dengan warna hitam dan berakhir dengan warna murni ...
Pada dasarnya Kecerahan (Nilai) membuat warna kurang atau lebih dekat ke hitam, di mana Saturasi membuatnya kurang atau lebih dekat ...
Seperti yang terlihat di sini:
Jadi solusi untuk membuat warna benar-benar lebih terang (yaitu lebih dekat ke putih ...) akan membuat nilai Saturasi itu lebih kecil , menghasilkan solusi ini:
sumber
Swift ekstensi universal untuk iOS dan OS X , menggunakan getHue :
Penggunaan:
ATAU (dengan nilai default):
Sampel :
sumber
let color = usingColorSpaceName(NSCalibratedRGBColorSpace)
dan kemudian menggantigetHue
panggilan dengan panggilan untuk mewarnai:color?.getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha)
_
sebelum jumlah kata. Seharusnyaprivate func hueColorWithBrightnessAmount(_ amount: CGFloat) -> PXColor {
Saya hanya ingin memberikan hasil yang sama, di RGB, daripada
Yang memberikan hasil yang sama, AFAIK, daripada memilih warna dalam gradien 'warna menjadi putih' atau 'warna menjadi hitam', pada x% dari ukuran gradien.
Untuk tujuan itu, matematika sederhana:
Berikut adalah contoh dengan beberapa warna
sumber
solusi user529758 di Swift:
Warna lebih gelap:
Warna yang lebih terang:
sumber
var darker: UIColor
contoh.Jika Anda mengubah warna RGB ke model warna HSL maka Anda dapat memvariasikan L = komponen terang dari L = 0,0 (hitam) di atas L = 0,5 (warna alami) ke L = 1,0 (putih).
UIColor
tidak dapat menangani HSL secara langsung, tetapi ada rumus untuk mengonversi RGB <-> HSL.sumber
Tak satu pun dari solusi yang diposting cukup berhasil untuk semua warna dan nuansa, tapi kemudian saya menemukan perpustakaan ini yang menyediakan serangkaian ekstensi yang diimplementasikan dengan sangat baik ke UIColor.
Secara khusus ia memiliki fungsi meringankan sebagai bagian dari implementasi HSL:
(UIColor *)lighten:(CGFloat)amount
- yang bekerja dengan sempurna.sumber
Sebyddd
solusi sebagai ekstensi:Pemakaian:
sumber
Jika Anda ingin solusi user529758 bekerja dengan nuansa abu-abu (seperti
[UIColor lightGrayColor]
atau[UIColor darkGrayColor]
Anda harus memperbaikinya seperti itu:getHue:saturation:brightness:alpha
gagal (dan kembalifalse
) ketika dipanggil dengan warna abu-abu karena itu Anda harus menggunakangetWhite:alpha
.sumber
Ekstensi UIColor dan memperbaiki korek apiColorForColor
sumber
Semua jawaban lain di utas ini menggunakan sistem warna RGB atau hanya mengubah nilai rona atau kecerahan sistem HSB . Seperti dijelaskan secara rinci dalam posting blog yang hebat ini , cara yang benar untuk membuat warna lebih terang atau lebih gelap adalah dengan mengubah
luminance
nilainya. Tidak ada jawaban lain yang melakukannya. Jika Anda ingin melakukannya dengan benar, maka gunakan solusi saya atau tulis sendiri setelah membaca posting blog.Sayangnya itu cukup merepotkan untuk mengubah atribut UIColor secara default . Juga Apple bahkan tidak mendukung ruang warna berbasis LAB seperti HCL di
UIColor
kelas (L
LAB di adalahluminance
nilai yang kita cari).Menggunakan HandyUIKit (instal melalui Carthage) menambah dukungan untuk HCL dan membuat hidup Anda jauh lebih mudah :
Ada juga opsi untuk menerapkan perubahan relatif (disarankan):
Perhatikan bahwa HandyUIKit juga menambahkan beberapa fitur UI berguna lainnya ke proyek Anda - checkout README -nya di GitHub untuk detail lebih lanjut.
Saya harap ini membantu!
sumber
Saya tidak yakin apakah Anda sedang mencari semacam jawaban Objective-C, tetapi berdasarkan bagaimana warna yang ditentukan oleh RGBA bekerja, saya pikir Anda bisa skala nilai-nilai RGB sesuai dengan faktor arbitrer untuk mendapatkan "lebih ringan" atau naungan "gelap". Misalnya, Anda mungkin memiliki warna biru:
Ingin yang lebih gelap? Lipat gandakan nilai RGB dengan 0,9:
Voila. Atau mungkin Anda memiliki jeruk:
Pilih faktor skala lain, katakanlah, 0,8:
Apakah itu jenis efek yang Anda cari?
sumber
Diuji dalam Xcode 10 dengan Swift 4.x untuk iOS 12
Mulai dengan warna Anda sebagai UIColor dan pilih faktor penggelapan (sebagai CGFloat)
Tipe CGColor memiliki nilai opsional
components
yang memecah warna menjadi RGBA (sebagai array CGFloat dengan nilai antara 0 dan 1). Anda kemudian dapat merekonstruksi UIColor menggunakan nilai-nilai RGBA yang diambil dari CGColor dan memanipulasinya.Dalam contoh ini, masing-masing RGB valuse dibagi 2, membuat warna setengah gelap seperti sebelumnya. Nilai alfa tetap sama, tetapi Anda bisa menerapkan faktor gelap pada nilai alfa daripada RGB.
sumber
Cepat 5
sumber
Idealnya, fungsi-fungsi tersebut harus dienkapsulasi di dalam
UIColor
ekstensi yang disebutUIColor+Brightness.swift
,, dan memiliki kecerahan yang dapat dikonfigurasi - lihat contoh di bawah ini:sumber
Saya membuat sel berwarna berdasarkan nilai status:
Untuk ini saya menulis ekstensi cepat berdasarkan pada beberapa kode objc lama setelah saya mendapat kesalahan menggunakan saran CryingHippo:
Hal yang sama
NSColor
juga berlaku. Cukup gantiUIColor
denganNSColor
.sumber
Berikut adalah kategori UIColor yang juga memungkinkan kontrol atas jumlah perubahan warna.
sumber
Ekstensi Swift berdasarkan jawaban @Sebyddd:
sumber
untuk warna yang lebih gelap, ini adalah yang paling sederhana: theColor = [theColor shadowWithLevel: s]; //s 8.00.0 hingga 1.0
sumber