You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
session-ios/Session/Media Viewing & Editing/MediaGalleryNavigationContr...

107 lines
3.6 KiB
Swift

// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
import UIKit
import SignalUtilitiesKit
import SessionUIKit
class MediaGalleryNavigationController: UINavigationController {
// HACK: Though we don't have an input accessory view, the VC we are presented above (ConversationVC) does.
// If the app is backgrounded and then foregrounded, when OWSWindowManager calls mainWindow.makeKeyAndVisible
// the ConversationVC's inputAccessoryView will appear *above* us unless we'd previously become first responder.
override public var canBecomeFirstResponder: Bool {
return true
}
// MARK: - UI
private lazy var backgroundView: UIView = {
let result: UIView = UIView()
result.themeBackgroundColor = .newConversation_background
return result
}()
// MARK: - View Lifecycle
override var preferredStatusBarStyle: UIStatusBarStyle { return ThemeManager.currentTheme.statusBarStyle }
override func viewDidLoad() {
super.viewDidLoad()
view.themeBackgroundColor = .newConversation_background
// Insert a view to ensure the nav bar colour goes to the top of the screen
relayoutBackgroundView()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// If the user's device is already rotated, try to respect that by rotating to landscape now
UIViewController.attemptRotationToDeviceOrientation()
}
// MARK: - Orientation
public override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
if UIDevice.current.isIPad {
return .all
}
return .allButUpsideDown
}
// MARK: - Functions
private func relayoutBackgroundView() {
guard !backgroundView.isHidden else {
backgroundView.removeFromSuperview()
return
}
view.insertSubview(backgroundView, belowSubview: navigationBar)
backgroundView.pin(.top, to: .top, of: view)
backgroundView.pin(.left, to: .left, of: navigationBar)
backgroundView.pin(.right, to: .right, of: navigationBar)
backgroundView.pin(.bottom, to: .bottom, of: navigationBar)
}
override func setNavigationBarHidden(_ hidden: Bool, animated: Bool) {
super.setNavigationBarHidden(hidden, animated: animated)
backgroundView.isHidden = hidden
relayoutBackgroundView()
}
}
// MARK: - SwiftUI
import SwiftUI
struct MediaGalleryNavigationController_SwiftUI: UIViewControllerRepresentable {
typealias UIViewControllerType = MediaGalleryNavigationController
public var viewControllers: [UIViewController]
private let transitioningDelegate: UIViewControllerTransitioningDelegate?
public init(
viewControllers: [UIViewController],
transitioningDelegate: UIViewControllerTransitioningDelegate? = nil
) {
self.viewControllers = viewControllers
self.transitioningDelegate = transitioningDelegate
}
func makeUIViewController(context: Context) -> MediaGalleryNavigationController {
let mediaGalleryNavigationController = MediaGalleryNavigationController()
mediaGalleryNavigationController.modalPresentationStyle = .fullScreen
mediaGalleryNavigationController.transitioningDelegate = transitioningDelegate
return mediaGalleryNavigationController
}
func updateUIViewController(_ mediaGalleryNavigationController: MediaGalleryNavigationController, context: Context) {
mediaGalleryNavigationController.viewControllers = viewControllers
}
}