Как обрабатывать слайдер в 3 этапа? - PullRequest
0 голосов
/ 08 января 2020

У меня есть объект UISlider в приложении iOS, инициализированный следующим кодом:

theSlider = UISlider ()

С базовыми функциями c все в порядке, но что Мне нужно четко обработать эти три события по отдельности:

  • событие, когда пользователь начинает перемещать ползунок.
  • событие, когда пользователь перемещает ползунок.
  • событие, когда пользователь прекращает перемещение ползунка.

В настоящее время я использую этот код:

theSlider.addTarget(self, action: #selector(sliderHandle(_:)), 
                    for: .valueChanged)

, и это нормально для обработки второго события. Но для первого и третьего, я полагаю, мне нужно подкласс UISlider, не будучи уверенным. Любой совет будет приветствоваться.

Ответы [ 2 ]

1 голос
/ 08 января 2020

UIControl.Event имеет много других значений, кроме .valueChanged. .touchDown может сообщить вам, когда пользователь начинает взаимодействовать с ползунком, а пара . touchUpInside и .touchUpOutside может сообщить вам, когда пользователь закончит перетаскивание. Вот пример детской площадки:

import SwiftUI
import PlaygroundSupport

class V: UIViewController {
  let slider = UISlider(frame: .init(origin: .zero, size: .init(width: 200, height: 50)))
  override func viewDidLoad() {
    super.viewDidLoad()
    slider.minimumValue = 0
    slider.maximumValue = 100
    slider.value = 50
    slider.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(slider)
    slider.addTarget(self, action: #selector(changed), for: .valueChanged)
    slider.addTarget(self, action: #selector(began), for: .touchDown)
    slider.addTarget(self, action: #selector(ended), for: .touchUpInside)
    slider.addTarget(self, action: #selector(ended), for: .touchUpOutside)
  }
  @objc private func changed(sender: UISlider) {
    print("Changed")
  }
  @objc private func began(sender: UISlider) {
    print("Began")
  }
  @objc private func ended(sender: UISlider) {
    print("Ended")
  }
}
PlaygroundPage.current.liveView = V()
1 голос
/ 08 января 2020

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

Вам не обязательно создавать подкласс UISlider, но вы можете захотеть создать его подкласс или, в зависимости от того, что вы делаете, UIControl, если вы считаете, что повторное использование целесообразно.

UISlider является подклассом UIControl, который является подклассом UIView. UIControl является «виджетизированным» UIView, другими словами, поскольку он предоставляет методы, в первую очередь облегчающие обнаружение пользовательского ввода и поддержку отправки событий, функции, которые обычно бывают общими для любого виджета управления пользовательским интерфейсом.

Для определения движения и положения класс UIControl имеет методы beginTracking(), continueTracking(), endTracking(), cancelTracking(), isTracking(), isTouchInside(). Они доступны непосредственно из объекта UISlider.

Аналогично, вы можете явно инициировать действия (события) с sendAction() и sendActions(), сделав publi c на UIControl, таким образом, неявно доступными для UISlider.

Если вы не нужно создавать подклассы, вы можете написать «одноразовый» (например, app-Speci c) бит кода, чтобы использовать вышеупомянутые методы непосредственно через ваш экземпляр UISlider, отслеживая «прикосновения» к виджету и доставки событий на ключевые позиции вдоль траектории слайда или с определенными поведениями c, которые вы обнаружите.

См. Этот вопрос, "IPhone: как определить конец перетаскивания ползунка" для идей реализации.

Apple Документация UIControl имеет раздел примечаний по подклассам, объясняющий, как использовать механизм целевого действия.

...