Skip to content

Commit

Permalink
feat(ios): update the way to get keyWindow (#3448)
Browse files Browse the repository at this point in the history
* feat(ios): update the way to get `keyWindow`

* lint
  • Loading branch information
KrzysztofMoch committed Dec 28, 2023
1 parent 1a9ea82 commit f35727f
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 5 deletions.
12 changes: 12 additions & 0 deletions ios/Video/Features/RCTVideoUtils.swift
Original file line number Diff line number Diff line change
Expand Up @@ -348,4 +348,16 @@ enum RCTVideoUtils {

return nil
}

static func getCurrentWindow() -> UIWindow? {
if #available(iOS 13.0, tvOS 13, *) {
return UIApplication.shared.connectedScenes
.flatMap { ($0 as? UIWindowScene)?.windows ?? [] }
.last { $0.isKeyWindow }
} else {
#if !os(visionOS)
return UIApplication.shared.keyWindow
#endif
}
}
}
10 changes: 7 additions & 3 deletions ios/Video/RCTVideo.swift
Original file line number Diff line number Diff line change
Expand Up @@ -792,7 +792,8 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
// Find the nearest view controller
var viewController: UIViewController! = self.firstAvailableUIViewController()
if viewController == nil {
let keyWindow: UIWindow! = UIApplication.shared.keyWindow
guard let keyWindow = RCTVideoUtils.getCurrentWindow() else { return }

viewController = keyWindow.rootViewController
if !viewController.children.isEmpty {
viewController = viewController.children.last
Expand Down Expand Up @@ -1291,9 +1292,12 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
func handleViewControllerOverlayViewFrameChange(overlayView _: UIView, change: NSKeyValueObservedChange<CGRect>) {
let oldRect = change.oldValue
let newRect = change.newValue

guard let bounds = RCTVideoUtils.getCurrentWindow()?.bounds else { return }

if !oldRect!.equalTo(newRect!) {
// https://github.com/react-native-video/react-native-video/issues/3085#issuecomment-1557293391
if newRect!.equalTo(UIScreen.main.bounds) {
if newRect!.equalTo(bounds) {
RCTLog("in fullscreen")
if !_fullscreenUncontrolPlayerPresented {
_fullscreenUncontrolPlayerPresented = true
Expand All @@ -1311,7 +1315,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
}
}

self.reactViewController().view.frame = UIScreen.main.bounds
self.reactViewController().view.frame = bounds
self.reactViewController().view.setNeedsLayout()
}
}
Expand Down
9 changes: 7 additions & 2 deletions ios/Video/RCTVideoPlayerViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,13 @@ class RCTVideoPlayerViewController: AVPlayerViewController {
return .portrait
} else {
// default case
let orientation = UIApplication.shared.statusBarOrientation
return orientation
if #available(iOS 13, tvOS 13, *) {
return RCTVideoUtils.getCurrentWindow()?.windowScene?.interfaceOrientation ?? .unknown
} else {
#if !os(visionOS)
return UIApplication.shared.statusBarOrientation
#endif
}
}
}

Expand Down

0 comments on commit f35727f

Please sign in to comment.