Почему цвета, которые я назначаю UIControls, не совпадают с отображаемыми цветами? - PullRequest
0 голосов
/ 28 апреля 2020

Начиная с 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".

I am setting a background color of

I am setting

Я искал документы Apple для ответов, но ничего не нашел. Кажется, они относятся к tintColor и как с ним обходятся очень неоднозначно Я изучил UITraitCollection и цветовые профили и не смог выяснить это.

Кто-нибудь знает, какие здесь механизмы используются для того, чтобы мой назначенный цвет фактически не отображался как назначенный? Наряду с лучшим способом борьбы с этими несоответствиями при работе с дизайном? Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...