MediaNavigationBar.swift 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  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. @objc (VLCMediaNavigationBarDelegate)
  12. protocol VLCMediaNavigationBarDelegate {
  13. func didMinimizePlayback(_ navigationBar: MediaNavigationBar)
  14. func didToggleChromeCast(_ navigationBar: MediaNavigationBar)
  15. func didToggleAirPlay(_ navigationBar: MediaNavigationBar)
  16. }
  17. @objc (VLCMediaNavigationBar)
  18. @objcMembers class MediaNavigationBar: UIView {
  19. // MARK: Instance Variables
  20. weak var delegate: VLCMediaNavigationBarDelegate?
  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: "minimizePlayback"), for: .normal)
  25. minButton.tintColor = .white
  26. // Constraints
  27. minButton.translatesAutoresizingMaskIntoConstraints = false
  28. return minButton
  29. }()
  30. private var mediaTitleTextLabel: UILabel = {
  31. var label = UILabel()
  32. label.numberOfLines = 1
  33. label.textColor = .white
  34. label.font = UIFont(name: "SFProDisplay-Medium", size: 17)
  35. label.text = NSLocalizedString("TITLE", comment: "Video Title")
  36. label.isUserInteractionEnabled = false
  37. label.translatesAutoresizingMaskIntoConstraints = false
  38. return label
  39. }()
  40. lazy var chromeCastButton: UIButton = {
  41. var chromeButton = UIButton(type: .system)
  42. chromeButton.addTarget(self, action: #selector(toggleChromeCast), for: .touchUpInside)
  43. chromeButton.setImage(UIImage(named: "renderer"), for: .normal)
  44. chromeButton.tintColor = .white
  45. chromeButton.translatesAutoresizingMaskIntoConstraints = false
  46. return chromeButton
  47. }()
  48. lazy var airPlayButton: UIButton = {
  49. var airPlayButton = UIButton(type: .system)
  50. airPlayButton.addTarget(self, action: #selector(toggleAirPlay), for: .touchUpInside)
  51. airPlayButton.setImage(UIImage(named: "TVBroadcastIcon"), for: .normal)
  52. airPlayButton.tintColor = .white
  53. airPlayButton.translatesAutoresizingMaskIntoConstraints = false
  54. return airPlayButton
  55. }()
  56. private func setupConstraints() {
  57. NSLayoutConstraint.activate([
  58. minimizePlaybackButton.leadingAnchor.constraint(equalTo: self.leadingAnchor),
  59. minimizePlaybackButton.topAnchor.constraint(equalTo: self.topAnchor),
  60. minimizePlaybackButton.widthAnchor.constraint(equalToConstant: minimizePlaybackButton.frame.width),
  61. minimizePlaybackButton.bottomAnchor.constraint(equalTo: self.bottomAnchor),
  62. mediaTitleTextLabel.leadingAnchor.constraint(equalTo: minimizePlaybackButton.trailingAnchor, constant: 16),
  63. mediaTitleTextLabel.topAnchor.constraint(equalTo: self.topAnchor),
  64. mediaTitleTextLabel.trailingAnchor.constraint(equalTo: chromeCastButton.leadingAnchor, constant: 50),
  65. chromeCastButton.trailingAnchor.constraint(equalTo: airPlayButton.leadingAnchor, constant: 20),
  66. chromeCastButton.topAnchor.constraint(equalTo: self.topAnchor),
  67. chromeCastButton.widthAnchor.constraint(equalToConstant: 24),
  68. airPlayButton.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: 20),
  69. airPlayButton.topAnchor.constraint(equalTo: self.topAnchor),
  70. airPlayButton.widthAnchor.constraint(equalToConstant: 24)
  71. ])
  72. }
  73. private func setupViews() {
  74. self.addSubview(minimizePlaybackButton)
  75. self.addSubview(mediaTitleTextLabel)
  76. self.addSubview(chromeCastButton)
  77. self.addSubview(airPlayButton)
  78. if UIApplication.shared.statusBarOrientation.isLandscape {
  79. mediaTitleTextLabel.isHidden = true
  80. }
  81. }
  82. // MARK: Initializers
  83. required init(coder: NSCoder) {
  84. fatalError("init(coder: NSCoder) not implemented")
  85. }
  86. init() {
  87. super.init(frame: .zero)
  88. setupViews()
  89. setupConstraints()
  90. }
  91. // MARK: Instance Methods
  92. func setMediaTitleLabelText(_ titleText: String) {
  93. mediaTitleTextLabel.text = titleText
  94. }
  95. // Mark: Button Actions
  96. func minimizePlayback() {
  97. guard let delegate = delegate else {
  98. print("Delegate not set for MediaNavigationBar")
  99. return
  100. }
  101. delegate.didMinimizePlayback(self)
  102. }
  103. func toggleChromeCast() {
  104. guard let delegate = delegate else {
  105. print("Delegate not set for MediaNavigationBar")
  106. return
  107. }
  108. delegate.didToggleChromeCast(self)
  109. }
  110. func toggleAirPlay() {
  111. guard let delegate = delegate else {
  112. print("Delegate not set for MediaNavigationBar")
  113. return
  114. }
  115. delegate.didToggleAirPlay(self)
  116. }
  117. }