从自定义 UIButton 显示 AirPlay 路由选择器
Present AirPlay route picker from a custom UIButton
我有一个程式化的 UIButton
子类,我想在点击时显示标准的 AirPlay 路由选择界面。我知道 AVRoutePickerView
可用,但它似乎没有提供任何定制,除了在 iOS.
上配置其色调和活动色调颜色
有没有办法使用您自己的按钮显示路线选择器?
看来这个应用程序能够做到这一点:
由于 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
}
我有一个程式化的 UIButton
子类,我想在点击时显示标准的 AirPlay 路由选择界面。我知道 AVRoutePickerView
可用,但它似乎没有提供任何定制,除了在 iOS.
有没有办法使用您自己的按钮显示路线选择器?
看来这个应用程序能够做到这一点:
由于 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
}