Это то, что мне нужно знать для работы, так что это было фантастическое упражнение для меня.Спасибо за размещение вопроса.Во всяком случае, я заставил его работать после того, как заглянул на эту страницу на веб-сайте Apple.
Я также не смог заставить вызываться методы увеличения / уменьшения.Я подозреваю, что они специфичны для степпера.Вызывается свойство value
, OTOH.
Вот код, который я придумал, чтобы заставить его работать:
class FontSizeSlider: UISlider {
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
func setup() {
isAccessibilityElement = true
accessibilityLabel = "Font Size Slider"
accessibilityIdentifier = "fontSizeSlider"
// accessibilityIdentifier = AccessibilityConstants.fontSizeSlider.rawValue
minimumValue = 0
maximumValue = 100
isContinuous = true
}
override var accessibilityValue: String? {
get {
return sliderValueString
}
set {
super.accessibilityValue = sliderValueString
}
}
override var accessibilityTraits: UIAccessibilityTraits {
get {
return .adjustable
}
set {
super.accessibilityTraits = newValue
}
}
// Nobody needs to know about this outside the class, so marked it private
private var sliderValueString: String {
let stringValue = String(Int(value))
return "The font size is \(stringValue)"
}
}
Вы заметите, что я использовал метод setup()
, который делает то же самое для обоих инициализаторов.Вы можете настроить свои значения так, как считаете нужным для минимальных / максимальных значений.
Вы заметите, что я добавил accessibilityLabel
, поэтому он не считывает, что это универсальный слайдер.Я тоже добавил туда accessibilityIdentifier
.Это то, что можно использовать для тестов пользовательского интерфейса, чтобы можно было идентифицировать элемент.
Возможно, вы захотите поместить accessibilityIdentifier
где-нибудь, где «все» смогут его увидеть.Возможно enum
.Вот как должна выглядеть реализация enum
:
enum AccessibilityConstants: String {
case fontSizeSlider
}
// Usage
accessibilityIdentifier = AccessibilityConstants.fontSizeSlider.rawValue
Я перекрыл accessibilityValue
пользовательским установщиком и получателем.Кроме того, я создал вычисленную var
для строки, считываемой при обновлении accessibilityValue
.Вот код для этой части.Заметьте, я сделал это private
, потому что никто за пределами класса не должен знать об этом:
// I adapted this from Apple's accessibility page that I posted above
override var accessibilityValue: String? {
get {
return sliderValueString
}
set {
super.accessibilityValue = sliderValueString
}
}
private var sliderValueString: String {
let stringValue = String(Int(value))
return "The font size is \(stringValue)"
}
И последнее ... вам не нужно self
везде, если вы не обращаетесь к свойствуваш пользовательский UISlider
внутри замыкания, такой как блок анимации или блок завершения.
Обновление
Удалено ...
Обновление2
Итак, предположим, что вы находитесь в вашем viewController, вы можете добавить целевое действие к ползунку, например, так:
slider.addTarget(self, action: #selector(doSomething), for: .valueChanged)
@objc func doSomething() {
print("How much wood could a wood chuck chuck if a wood chuck could chuck wood")
}
При каждом изменении значения ваш селектор получитназывается.