Начиная с iOS 13, цвета, назначаемые для UIControls, не кажутся теми же цветами, которые в конечном итоге заканчиваются отображением.
Вот пример, который можно скопировать и вставить в код xcode детская площадка:
import UIKit
import PlaygroundSupport
// https://www.hackingwithswift.com/example-code/uicolor/how-to-convert-a-hex-color-to-a-uicolor
extension UIColor {
public convenience init?(hex hexUser: String) {
let r, g, b, a: CGFloat
let hex = "\(hexUser)FF" // append alpha compnent for ease of example
if hex.hasPrefix("#") {
let start = hex.index(hex.startIndex, offsetBy: 1)
let hexColor = String(hex[start...])
if hexColor.count == 8 {
let scanner = Scanner(string: hexColor)
var hexNumber: UInt64 = 0
if scanner.scanHexInt64(&hexNumber) {
r = CGFloat((hexNumber & 0xff000000) >> 24) / 255
g = CGFloat((hexNumber & 0x00ff0000) >> 16) / 255
b = CGFloat((hexNumber & 0x0000ff00) >> 8) / 255
a = CGFloat(hexNumber & 0x000000ff) / 255
self.init(red: r, green: g, blue: b, alpha: a)
return
}
}
}
return nil
}
}
let backgroundColorHex = "#303b46" // shows up as #38424c in iOS >= 13
let tintColorHex = "#ebdb34" // shows up as #eadb33 in iOS >= 13
let backgroundColor = UIColor(hex: backgroundColorHex)!
let tintColor = UIColor(hex: tintColorHex)!
class MyViewController: UIViewController {
override func loadView() {
let view = UIView()
view.backgroundColor = .white
let segmentedControl = UISegmentedControl(items: ["One", "Two"])
segmentedControl.selectedSegmentTintColor = tintColor
segmentedControl.backgroundColor = backgroundColor
segmentedControl.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.white], for: .normal)
segmentedControl.selectedSegmentIndex = 0
view.addSubview(segmentedControl)
segmentedControl.translatesAutoresizingMaskIntoConstraints = false
segmentedControl.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
segmentedControl.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
segmentedControl.widthAnchor.constraint(equalToConstant: 200).isActive = true
self.view = view
}
}
PlaygroundPage.current.liveView = MyViewController()
Для этого UISegmentedControl
Я устанавливаю цвет фона "# 303b46", но после проверки вижу, что iOS отображает "# 38424 c". Для selectedSegmentTintColor
я задаю "# ebdb34", но iOS отображает "# eadb33".
Я искал документы Apple для ответов, но ничего не нашел. Кажется, они относятся к tintColor
и как с ним обходятся очень неоднозначно Я изучил UITraitCollection
и цветовые профили и не смог выяснить это.
Кто-нибудь знает, какие здесь механизмы используются для того, чтобы мой назначенный цвет фактически не отображался как назначенный? Наряду с лучшим способом борьбы с этими несоответствиями при работе с дизайном? Спасибо.