This is an automated email from the ASF dual-hosted git repository.
erisu pushed a commit to branch master
in repository
https://gitbox.apache.org/repos/asf/cordova-plugin-screen-orientation.git
The following commit(s) were added to refs/heads/master by this push:
new b444df6 feat(ios): add support for ios 16 (#107)
b444df6 is described below
commit b444df630bdf204c2cb124cb261e51d73f33abbb
Author: oofaish <[email protected]>
AuthorDate: Mon Dec 12 00:55:43 2022 +0000
feat(ios): add support for ios 16 (#107)
* Include iOS 16 Support
* Fix the unlock/lock issue by always calling setSupportedOrientations but
only call setNeedsUpdateOfSupportedInterfaceOrientations at the end to avoid
refreshing orientation twice
---
src/ios/CDVOrientation.m | 123 +++++++++++++++++++++++++++++++++++------------
1 file changed, 93 insertions(+), 30 deletions(-)
diff --git a/src/ios/CDVOrientation.m b/src/ios/CDVOrientation.m
index ff718f8..b481114 100644
--- a/src/ios/CDVOrientation.m
+++ b/src/ios/CDVOrientation.m
@@ -28,6 +28,97 @@
@implementation CDVOrientation
+
+-(void)handleBelowEqualIos15WithOrientationMask:(NSInteger) orientationMask
viewController: (CDVViewController*) vc result:(NSMutableArray*) result
selector:(SEL) selector
+{
+ NSValue *value;
+ if (orientationMask != 15) {
+ if (!_isLocked) {
+ _lastOrientation = [UIApplication
sharedApplication].statusBarOrientation;
+ }
+ UIInterfaceOrientation deviceOrientation = [UIApplication
sharedApplication].statusBarOrientation;
+ if(orientationMask == 8 || (orientationMask == 12 &&
!UIInterfaceOrientationIsLandscape(deviceOrientation))) {
+ value = [NSNumber
numberWithInt:UIInterfaceOrientationLandscapeLeft];
+ } else if (orientationMask == 4){
+ value = [NSNumber
numberWithInt:UIInterfaceOrientationLandscapeRight];
+ } else if (orientationMask == 1 || (orientationMask == 3 &&
!UIInterfaceOrientationIsPortrait(deviceOrientation))) {
+ value = [NSNumber numberWithInt:UIInterfaceOrientationPortrait];
+ } else if (orientationMask == 2) {
+ value = [NSNumber
numberWithInt:UIInterfaceOrientationPortraitUpsideDown];
+ }
+ } else {
+ if (_lastOrientation != UIInterfaceOrientationUnknown) {
+ [[UIDevice currentDevice] setValue:[NSNumber
numberWithInt:_lastOrientation] forKey:@"orientation"];
+ ((void (*)(CDVViewController*, SEL,
NSMutableArray*))objc_msgSend)(vc,selector,result);
+ [UINavigationController attemptRotationToDeviceOrientation];
+ }
+ }
+ if (value != nil) {
+ _isLocked = true;
+ [[UIDevice currentDevice] setValue:value forKey:@"orientation"];
+ } else {
+ _isLocked = false;
+ }
+}
+
+#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 160000
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wunguarded-availability-new"
+// this will stop it complaining about new iOS16 APIs being used.
+-(void)handleAboveEqualIos16WithOrientationMask:(NSInteger) orientationMask
viewController: (CDVViewController*) vc result:(NSMutableArray*) result
selector:(SEL) selector
+{
+ NSObject *value;
+ // oritentationMask 15 is "unlock" the orientation lock.
+ if (orientationMask != 15) {
+ if (!_isLocked) {
+ _lastOrientation = [UIApplication
sharedApplication].statusBarOrientation;
+ }
+ UIInterfaceOrientation deviceOrientation = [UIApplication
sharedApplication].statusBarOrientation;
+ if(orientationMask == 8 || (orientationMask == 12 &&
!UIInterfaceOrientationIsLandscape(deviceOrientation))) {
+ value = [[UIWindowSceneGeometryPreferencesIOS alloc]
initWithInterfaceOrientations:UIInterfaceOrientationMaskLandscapeLeft];
+ } else if (orientationMask == 4){
+ value = [[UIWindowSceneGeometryPreferencesIOS alloc]
initWithInterfaceOrientations:UIInterfaceOrientationMaskLandscapeRight];
+ } else if (orientationMask == 1 || (orientationMask == 3 &&
!UIInterfaceOrientationIsPortrait(deviceOrientation))) {
+ value = [[UIWindowSceneGeometryPreferencesIOS alloc]
initWithInterfaceOrientations:UIInterfaceOrientationMaskPortrait];
+ } else if (orientationMask == 2) {
+ value = [[UIWindowSceneGeometryPreferencesIOS alloc]
initWithInterfaceOrientations:UIInterfaceOrientationMaskPortraitUpsideDown];
+ }
+ } else {
+ ((void (*)(CDVViewController*, SEL,
NSMutableArray*))objc_msgSend)(vc,selector,result);
+ }
+ if (value != nil) {
+ _isLocked = true;
+ UIWindowScene *scene =
(UIWindowScene*)[[UIApplication.sharedApplication connectedScenes] anyObject];
+ [scene
requestGeometryUpdateWithPreferences:(UIWindowSceneGeometryPreferencesIOS*)value
errorHandler:^(NSError * _Nonnull error) {
+ NSLog(@"Failed to change orientation %@ %@", error, [error
userInfo]);
+ }];
+ } else {
+ _isLocked = false;
+ }
+}
+#pragma clang diagnostic pop
+
+-(void)handleWithOrientationMask:(NSInteger) orientationMask viewController:
(CDVViewController*) vc result:(NSMutableArray*) result selector:(SEL) selector
+{
+ if (@available(iOS 16.0, *)) {
+ [self handleAboveEqualIos16WithOrientationMask:orientationMask
viewController:vc result:result selector:selector];
+ // always double check the supported interfaces, so we update if needed
+ // but do it right at the end here to avoid the "double" rotation
issue reported in
+ // https://github.com/apache/cordova-plugin-screen-orientation/pull/107
+ [self.viewController setNeedsUpdateOfSupportedInterfaceOrientations];
+ } else {
+ [self handleBelowEqualIos15WithOrientationMask:orientationMask
viewController:vc result:result selector:selector];
+ }
+
+}
+#else
+-(void)handleWithOrientationMask:(NSInteger) orientationMask viewController:
(CDVViewController*) vc result:(NSMutableArray*) result selector:(SEL) selector
+{
+ [self handleBelowEqualIos15WithOrientationMask:orientationMask
viewController:vc result:result selector:selector];
+}
+#endif
+
+
-(void)screenOrientation:(CDVInvokedUrlCommand *)command
{
CDVPluginResult* pluginResult;
@@ -47,43 +138,15 @@
if(orientationMask & 8) {
[result addObject:[NSNumber
numberWithInt:UIInterfaceOrientationLandscapeLeft]];
}
-
SEL selector = NSSelectorFromString(@"setSupportedOrientations:");
if([vc respondsToSelector:selector]) {
if (orientationMask != 15 || [UIDevice currentDevice] == nil) {
((void (*)(CDVViewController*, SEL,
NSMutableArray*))objc_msgSend)(vc,selector,result);
}
-
+
if ([UIDevice currentDevice] != nil){
- NSNumber *value = nil;
- if (orientationMask != 15) {
- if (!_isLocked) {
- _lastOrientation = [UIApplication
sharedApplication].statusBarOrientation;
- }
- UIInterfaceOrientation deviceOrientation = [UIApplication
sharedApplication].statusBarOrientation;
- if(orientationMask == 8 || (orientationMask == 12 &&
!UIInterfaceOrientationIsLandscape(deviceOrientation))) {
- value = [NSNumber
numberWithInt:UIInterfaceOrientationLandscapeLeft];
- } else if (orientationMask == 4){
- value = [NSNumber
numberWithInt:UIInterfaceOrientationLandscapeRight];
- } else if (orientationMask == 1 || (orientationMask == 3 &&
!UIInterfaceOrientationIsPortrait(deviceOrientation))) {
- value = [NSNumber
numberWithInt:UIInterfaceOrientationPortrait];
- } else if (orientationMask == 2) {
- value = [NSNumber
numberWithInt:UIInterfaceOrientationPortraitUpsideDown];
- }
- } else {
- if (_lastOrientation != UIInterfaceOrientationUnknown) {
- [[UIDevice currentDevice] setValue:[NSNumber
numberWithInt:_lastOrientation] forKey:@"orientation"];
- ((void (*)(CDVViewController*, SEL,
NSMutableArray*))objc_msgSend)(vc,selector,result);
- [UINavigationController
attemptRotationToDeviceOrientation];
- }
- }
- if (value != nil) {
- _isLocked = true;
- [[UIDevice currentDevice] setValue:value
forKey:@"orientation"];
- } else {
- _isLocked = false;
- }
+ [self handleWithOrientationMask:orientationMask viewController:vc
result:result selector:selector];
}
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]