Увеличение и уменьшение доступности не требуется для UISlider - PullRequest
1 голос
/ 06 мая 2019

Я пытаюсь сделать свое приложение более доступным для пользователей Voice Over. У меня есть слайдер с номерами 1-100. Если пользователь с включенным Voice Over проведет пальцем вверх или вниз для изменения значения, пропускаются несколько номеров. Это означает, что точное число не может быть установлено. Я следую предложению этого сайта о создании подклассов UISlider и переопределении accessibilityIncrement() и accessibilityDecrement(), но они не вызываются при изменении значения слайдера. Ниже мой субклассный слайдер. Есть идеи, почему методы не вызываются?

class FontSizeSlider: UISlider {

  required init?(coder: NSCoder) {
    super.init(coder: coder)
    self.isAccessibilityElement = true
    self.accessibilityTraits.insert(.adjustable)
  }

  override init(frame: CGRect) {
    super.init(frame: frame)
  }

  override func accessibilityIncrement() {
    self.value += 1
    self.sendActions(for: .valueChanged)
  }

  override func accessibilityDecrement() {
    self.value -= 1
    self.sendActions(for: .valueChanged)
  }
}

1 Ответ

1 голос
/ 06 мая 2019

Это то, что мне нужно знать для работы, так что это было фантастическое упражнение для меня.Спасибо за размещение вопроса.Во всяком случае, я заставил его работать после того, как заглянул на эту страницу на веб-сайте 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")
}

При каждом изменении значения ваш селектор получитназывается.

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