A UISegmentedControl
memiliki tampilan baru di iOS 13 dan kode yang ada untuk mengubah warna kontrol tersegmentasi tidak lagi berfungsi seperti sebelumnya.
Sebelum iOS 13 Anda dapat mengatur tintColor
dan yang akan digunakan untuk perbatasan di sekitar kontrol tersegmentasi, garis antara segmen, dan warna latar belakang segmen yang dipilih. Kemudian Anda dapat mengubah warna judul setiap segmen menggunakan atribut warna latar depan dengan titleTextAttributes
.
Di bawah iOS 13, tintColor
tidak melakukan apa pun. Anda dapat menyetel kontrol tersegmentasi backgroundColor
untuk mengubah warna keseluruhan dari kontrol tersegmentasi. Tetapi saya tidak dapat menemukan cara untuk mengubah warna yang digunakan sebagai latar belakang segmen yang dipilih. Mengatur atribut teks masih berfungsi. Saya bahkan mencoba mengatur warna latar belakang judul tetapi itu hanya mempengaruhi latar belakang judul, bukan warna latar belakang segmen yang dipilih lainnya.
Singkatnya, bagaimana Anda mengubah warna latar belakang segmen yang saat ini dipilih UISegmentedControl
di iOS 13? Apakah ada solusi yang tepat, menggunakan API publik, yang tidak memerlukan penggalian ke dalam struktur subview pribadi?
Tidak ada properti baru di iOS 13 untuk UISegmentedControl
atau UIControl
dan tidak ada perubahan di UIView
relevan.
sumber
tintColor
yang sudah tercakup dalam jawabannya.Mulai Xcode 11 beta 3
Lihat jawaban rmaddy
Untuk mendapatkan kembali tampilan iOS 12
Saya tidak dapat mewarnai warna segmen yang dipilih, mudah-mudahan ini akan diperbaiki dalam versi beta yang akan datang.
Mengatur gambar latar belakang dari keadaan yang dipilih tidak berfungsi tanpa mengatur gambar latar belakang dari keadaan normal (yang menghapus semua gaya iOS 13)
Tapi saya bisa mengembalikannya ke tampilan iOS 12 (atau cukup dekat, saya tidak bisa mengembalikan radius sudut ke ukurannya yang lebih kecil).
Ini tidak ideal, tetapi kontrol tersegmentasi putih cerah terlihat agak tidak pada tempatnya di aplikasi kami.
(Tidak disadari
UIImage(color:)
adalah metode ekstensi dalam basis kode kami. Tetapi kode untuk menerapkannya ada di seluruh web)sumber
setTitleTextAttributes
untuk membuat judul segmen yang dipilih berwarna putih?IOS 13 dan Swift 5.0 (Xcode 11.0) Kontrol Segmen 100% Berfungsi
sumber
Saya sudah mencoba solusi tersebut dan hasilnya bagus untuk saya. Inilah versi Objective-C:
sumber
CGRectMake(0.0f, 0.0f, 1.0f, 1.0f)
: dari pengujian saya dengan Xcode 11 beta,rect
harus berukuran sama dengan batas-batas kontrol tersegmentasi.[[UISegmentedControl appearance] ensureiOS12Style]
saya mendapatkan pengecualian. Tahu apa yang sedang terjadi?Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSMethodSignature getArgumentTypeAtIndex:]: index (2) out of bounds [0, 1]'
Mulai Xcode 11 beta 3
Terima kasih @rmaddy!
Jawaban asli, untuk Xcode 11 beta dan beta 2
Dengan Xcode 11.0 beta, tampaknya menjadi tantangan untuk melakukannya sesuai aturan, karena pada dasarnya perlu menggambar ulang semua gambar latar belakang untuk setiap negara bagian sendiri, dengan sudut bulat, transparansi, dan
resizableImage(withCapInsets:)
. Misalnya, Anda perlu membuat gambar berwarna seperti:Jadi untuk saat ini, cara mari-gali-ke-subview tampaknya jauh lebih mudah:
Solusi ini akan menerapkan warna tint dengan benar ke seleksi, seperti pada:
sumber
setBackgroundImage
melakukannya.normal
, Anda harus mengatur semua gambar lain (termasuk status lain dansetDividerImage
), mungkin dengan beberapaUIBezierPath
danresizableImage(withCapInsets:)
, yang membuatnya terlalu rumit jika kita menginginkan desain iOS 13 cara ini.selectedSegmentTintColor
properti diUISegmentedControl
.Versi Swift jawaban @Ilahi Charfeddine:
sumber
sumber
iOS13 UISegmentController
Cara Penggunaan:
sumber
XCODE 11.1 & iOS 13
Berdasarkan jawaban @Jigar Darji tetapi implementasi yang lebih aman.
Pertama-tama kami membuat penginisialisasi kenyamanan yang dapat gagal:
Kemudian kami memperluas UISegmentedControl:
sumber
Inilah pendapat saya tentang jawaban Jonathan. untuk Xamarin.iOS (C #), tetapi dengan perbaikan untuk ukuran gambar. Terkait dengan komentar Cœur atas jawaban Colin Blake, saya membuat semua gambar kecuali pembatas sebesar ukuran kontrol tersegmentasi. Pembatas adalah 1xtinggi segmen.
sumber
Anda dapat menerapkan metode berikut
Kode penggunaan
sumber
Meskipun jawaban di atas bagus, sebagian besar mendapatkan warna teks di dalam segmen yang dipilih salah. Saya telah membuat
UISegmentedControl
subclass yang dapat Anda gunakan pada perangkat iOS 13 dan pra-iOS 13 dan menggunakan properti tintColor seperti yang Anda lakukan pada perangkat pra-iOS 13.Dengan menggunakan
tintColorDidChange
metode, kami memastikan bahwastylize
metode tersebut akan dipanggil setiap kalitintColor
properti berubah pada tampilan segmen, atau salah satu tampilan yang mendasari, yang merupakan perilaku yang disukai di iOS.Hasil:
sumber
Memperluas sedikit pada jawaban Jonathan jika Anda tidak ingin sudut bundar
sumber