MediaNavigationBar.swift 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. /*****************************************************************************
  2. * MediaNavigationBar.swift
  3. *
  4. * Copyright © 2019 VLC authors and VideoLAN
  5. *
  6. * Authors: Robert Gordon <robwaynegordon # gmail.com>
  7. *
  8. *
  9. * Refer to the COPYING file of the official project for license.
  10. *****************************************************************************/
  11. import AVKit
  12. @objc (VLCMediaNavigationBarDelegate)
  13. protocol MediaNavigationBarDelegate {
  14. func mediaNavigationBarDidMinimizePlayback(_ navigationBar: MediaNavigationBar)
  15. func mediaNavigationBarDidToggleChromeCast(_ navigationBar: MediaNavigationBar)
  16. }
  17. @objc (VLCMediaNavigationBar)
  18. @objcMembers class MediaNavigationBar: UIView {
  19. // MARK: Instance Variables
  20. weak var delegate: MediaNavigationBarDelegate?
  21. lazy var minimizePlaybackButton: UIButton = {
  22. var minButton = UIButton(type: .system)
  23. minButton.addTarget(self, action: #selector(minimizePlayback), for: .touchUpInside)
  24. minButton.setImage(UIImage(named: "iconChevron"), for: .normal)
  25. minButton.tintColor = .white
  26. minButton.translatesAutoresizingMaskIntoConstraints = false
  27. return minButton
  28. }()
  29. private var mediaTitleTextLabel: UILabel = {
  30. var label = UILabel()
  31. label.numberOfLines = 1
  32. label.lineBreakMode = .byTruncatingTail
  33. label.textColor = .white
  34. label.font = UIFont(name: "SFProDisplay-Medium", size: 17)
  35. label.text = NSLocalizedString("TITLE", comment: "Video Title")
  36. label.translatesAutoresizingMaskIntoConstraints = false
  37. return label
  38. }()
  39. lazy var chromeCastButton: UIButton = {
  40. var chromeButton = UIButton(type: .system)
  41. chromeButton.addTarget(self, action: #selector(toggleChromeCast), for: .touchUpInside)
  42. chromeButton.setImage(UIImage(named: "renderer"), for: .normal)
  43. chromeButton.tintColor = .white
  44. chromeButton.translatesAutoresizingMaskIntoConstraints = false
  45. return chromeButton
  46. }()
  47. @available(iOS 11.0, *)
  48. lazy var airplayRoutePickerView: AVRoutePickerView = {
  49. var airPlayRoutePicker = AVRoutePickerView(frame: .zero)
  50. airPlayRoutePicker.activeTintColor = .orange
  51. airPlayRoutePicker.tintColor = .white
  52. airPlayRoutePicker.translatesAutoresizingMaskIntoConstraints = false
  53. return airPlayRoutePicker
  54. }()
  55. lazy var airplayVolumeView: MPVolumeView = {
  56. var airplayVolumeView = MPVolumeView()
  57. airplayVolumeView.tintColor = .white
  58. airplayVolumeView.translatesAutoresizingMaskIntoConstraints = false
  59. airplayVolumeView.showsVolumeSlider = false
  60. return airplayVolumeView
  61. }()
  62. // MARK: Initializers
  63. required init(coder: NSCoder) {
  64. fatalError("init(coder: NSCoder) not implemented")
  65. }
  66. override init(frame: CGRect) {
  67. super.init(frame: frame)
  68. setupViews()
  69. setupConstraints()
  70. }
  71. // MARK: Instance Methods
  72. func setMediaTitleLabelText(_ titleText: String) {
  73. mediaTitleTextLabel.text = titleText
  74. }
  75. private func setupConstraints() {
  76. let margin: CGFloat = 35.0
  77. var airplayView: UIView
  78. if #available(iOS 11.0, *) {
  79. airplayView = airplayRoutePickerView
  80. } else {
  81. airplayView = airplayVolumeView
  82. }
  83. let constraints: [NSLayoutConstraint] = [
  84. minimizePlaybackButton.leadingAnchor.constraint(equalTo: leadingAnchor),
  85. minimizePlaybackButton.topAnchor.constraint(equalTo: topAnchor),
  86. minimizePlaybackButton.bottomAnchor.constraint(equalTo: bottomAnchor),
  87. mediaTitleTextLabel.leadingAnchor.constraint(equalTo: minimizePlaybackButton.trailingAnchor, constant: margin),
  88. mediaTitleTextLabel.topAnchor.constraint(equalTo: topAnchor),
  89. mediaTitleTextLabel.trailingAnchor.constraint(lessThanOrEqualTo: chromeCastButton.leadingAnchor, constant: margin),
  90. chromeCastButton.topAnchor.constraint(equalTo: topAnchor),
  91. chromeCastButton.trailingAnchor.constraint(equalTo: airplayView.leadingAnchor, constant: margin),
  92. airplayView.trailingAnchor.constraint(equalTo: trailingAnchor, constant: margin),
  93. airplayView.topAnchor.constraint(equalTo: topAnchor)
  94. ]
  95. NSLayoutConstraint.activate(constraints)
  96. }
  97. private func setupViews() {
  98. addSubview(minimizePlaybackButton)
  99. addSubview(mediaTitleTextLabel)
  100. addSubview(chromeCastButton)
  101. if #available(iOS 11.0, *) {
  102. addSubview(airplayRoutePickerView)
  103. } else {
  104. addSubview(airplayVolumeView)
  105. }
  106. }
  107. // MARK: Button Actions
  108. func minimizePlayback() {
  109. assert(delegate != nil, "Delegate not set for MediaNavigationBar")
  110. delegate?.mediaNavigationBarDidMinimizePlayback(self)
  111. }
  112. func toggleChromeCast() {
  113. assert(delegate != nil, "Delegate not set for MediaNavigationBar")
  114. delegate?.mediaNavigationBarDidToggleChromeCast(self)
  115. }
  116. }