Представить AirPlay маршрут выбора из пользовательского UIButton - PullRequest
1 голос
/ 24 мая 2019

У меня есть стилизованный подкласс UIButton, который я хочу представить стандартным интерфейсом выбора маршрута AirPlay. Я знаю, что AVRoutePickerView доступен, но он не предлагает никаких настроек, кроме как для настройки его оттенка и активного оттенка на iOS.

Есть ли способ представить средство выбора маршрута с помощью собственной кнопки?

Похоже, это приложение могло сделать именно это:

enter image description here

1 Ответ

0 голосов
/ 25 мая 2019

Поскольку AVRoutePickerView - это просто представление, вы можете добавить его к пользовательской кнопке или добавить пользовательские представления поверх нее. Это очень грубый пример

    let frame = CGRect(x: 50, y: 50, width: 100, height: 50)
    let routePickerView = AVRoutePickerView(frame: frame)
    routePickerView.backgroundColor = UIColor.clear
    view.addSubview(routePickerView)
    let label = UILabel(frame: routePickerView.bounds)
    label.backgroundColor = .black
    label.textColor = .white
    routePickerView.addSubview(label)
    label.text = "Rough"

Я поспешно говорил с моими примерами того, как вы могли бы заставить его работать, нажатие на кнопку раздражает, а также пытался использовать распознаватель жестов. Однако я придумал три альтернативных подхода, которые с некоторыми усилиями могут быть использованы. Все они полагаются на добавление представления к средству выбора в качестве подпредставления, как указано выше. Это представление должно иметь .isUserInteractionEnabled = true. Я тестировал с UILabel и просто с UIView, вероятно, это должно быть что-то, что не имеет сенсорной обработки, поэтому избегайте UIControl s. Если у вас есть этот вид, вы можете использовать touchesBegan touchesCancelled и touchesEnded для выполнения любых визуальных настроек или анимации, а затем передавать касания. Как всегда при работе с пользовательскими элементами управления, это может не всегда работать, но в настоящее время это работает для меня и не использует закрытый API, только обходные пути и немного удачи.

Использование пользовательской UILabel в качестве подпредставления

class CustomLabel: UILabel {

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    transform = .init(scaleX: 0.75, y: 0.75)
    super.touchesBegan(touches, with: event)
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    transform = .identity
    super.touchesEnded(touches, with: event)
}

override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
    transform = .identity
    super.touchesCancelled(touches, with: event)
}

}

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

class CustomRoutePicker: AVRoutePickerView {

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    transform = .init(scaleX: 0.75, y: 0.75)
    super.touchesBegan(touches, with: event)
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    transform = .identity
    super.touchesEnded(touches, with: event)
}

override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
    transform = .identity
    super.touchesCancelled(touches, with: event)
}

}

Использование UIViewController со ссылкой на pickerView

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    pickerView?.transform = .init(scaleX: 0.75, y: 0.75)
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    pickerView?.transform = .identity
}

override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
    pickerView?.transform = .identity
}
...