Swift.- UIAppereance UISwitch не учитывает layer.cornerRadius - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь использовать appearance для установки общих макетов / дизайнов по умолчанию в приложении. Для UISwitch, чтобы установить цвет off не только на границе, необходимо выполнить настройку (см. Изменение цвета переключателя UIS в состоянии «выключено» ):

uiswitch.backgroundColor = .red
uiswitch.layer.cornerRadius = 16

Всякий раз, когда я делаю:

let toggle = UISwitch()
toggle.tintColor = offColor // see "global vars and methods below"
toggle.onTintColor = onColor
toggle.backgroundColor = offColor
toggle.layer.cornerRadius = 16
view.addSubview(toggle)
constraintToCenter(toggle: toggle)

Это работает, и я получаю:

UISwitch with off color

Но если я использую appearance, как это:

let toggle = UISwitch()
view.addSubview(toggle)
constraintToCenter(toggle: toggle)
UISwitch.newSetUpDefaultAppearance(onColor: onColor, offColor: offColor)

public extension UISwitch {
    class func newSetUpDefaultAppearance(onColor: UIColor, offColor: UIColor) {
        let defaultAppereance = appearance(whenContainedInInstancesOf: [])
        defaultAppereance.onTintColor = onColor
        defaultAppereance.backgroundColor = offColor
        defaultAppereance.tintColor = offColor
        defaultAppereance.layer.cornerRadius = 16.0
        print (defaultAppereance.layer.cornerRadius) // prints 0.0
    }
}

Я получаю:

enter image description here

Глобальные переменные и методы:

let onColor = UIColor.black
let offColor = UIColor.gray

func constraintToCenter(view: UIView) {
    toggle.translatesAutoresizingMaskIntoConstraints = false        
    NSLayoutConstraint.activate([toggle.centerXAnchor.constraint(equalTo: view.centerXAnchor), toggle.centerYAnchor.constraint(equalTo: view.centerYAnchor)])
}

Кто-то видит, что я делаю неправильно?

1 Ответ

0 голосов
/ 13 июня 2019

Согласно Внешний вид Proxies & Layers , похоже, что это невозможно, поскольку CALayer не соответствует UIAppearance и не имеет метода appearance.

Единственный способ сделать это - ответ Сэнди Чепмена в этом ответе.Вот как это выглядит в Swift и работает:

public class Switch: UISwitch {
    // dynamic is needed for UIAppearance support
    @objc dynamic var cornerRadius: CGFloat = 0.0 {
        didSet {
            self.layer.cornerRadius = cornerRadius
        }
    }

    public class func globalDefaultAppearance() {
        let defaultAppereance = appearance(whenContainedInInstancesOf: [])
        defaultAppereance.onTintColor = .red
        defaultAppereance.backgroundColor = .yellow
        defaultAppereance.tintColor = .red
        defaultAppereance.cornerRadius = 16.0
    }
}

Использование

let toggle = Switch()
UISwitch.globalSetUpDefaultAppearance()

отлично работает.

...