iPad Orientation Control help
Any chance anyone knowsvhow i can do one of the following?
- access to rotation lock setting
- force rotation programmatically
i use iPad Air 2 (4,5) on iPadOS 13.4.1 And some basic knowledge of objc_util. I did see the comment by @omz
"Important: The orientations parameter has no effect on iPadOS starting with iOS 10 because it is technically not possible to lock the orientation in an app that supports split-screen multitasking."
But there must be a way to control orientation.. Thank you in advance!
I think what you want is this one
You would need to make a custom view controller class that implements this. Then present that view controller full screen and add your view as a subview... I think @cvp might have examples of how to present custom view controllers?
I think @cvp might have examples of how to present custom view controllers?
Sure? I don't remember but I agree that my memory is older than I am 🤯 😅
@JonB Seriously, the doc says it is an instance property but also says "The system calls this method when presenting the view controller full screen".
Could it be possible to swizzle it?
Tried with this NY monkeypatching instead of swizzle because it is an instance method, not a class method. The def is called but no orientation change, and even no full screen.
Of course, it is not the main view controller. Sure, help will be needed.
from objc_util import * import ui def preferredInterfaceOrientationForPresentation(_self):#, _sel): self = ObjCInstance(_self) # UIViewController print('preferredInterfaceOrientationForPresentation:',self) return 3 # UIInterfaceOrientationLandscapeLeft @on_main_thread def main(): UIViewController = ObjCClass('UIViewController') vc = UIViewController.alloc().init() # monkeypatch of UIViewController class instance method UIViewController.preferredInterfaceOrientationForPresentation = preferredInterfaceOrientationForPresentation(vc) vc.setModalPresentationStyle_(2) # full screen l = ui.Label() l.frame = (10,10,100,32) l.text = 'label' vc.view().addSubview_(ObjCInstance(l)) rootvc = UIApplication.sharedApplication().keyWindow().rootViewController() rootvc.presentViewController_animated_completion_(vc, True, None) if __name__ == '__main__': main()
@cvp Got this to work by create_objc_class on the view controller to override the method, and by letting the system choose the modal presentation style (setting to 0)
changed your method to:
def preferredInterfaceOrientationForPresentation(_self,_cmd): return 3
And changed creation of vc and set modal to:
I think he meant to have an alloc().init() in there somewhere. You need an instance
Yea add an .alloc().init(). The anti-spam bot won’t let me add it on there. Sorry for the confusion
@mcriley821 yes, I already did it
@mcriley821 I tried this script. I'll let @stephen go on 😇
Thanks for your help. I'm happy we have now a new ObjectiveC guru because I only use it with a lot of tries.
Put in gist because refused as spam???
@cvp I’m no guru by any means lmao. It takes many crashes for me before I get something working. I’m steadily learning though.
My only guess on why monkey-patching didn’t work is because we already alloced and inited vc as a regular UIViewController and didn’t create another instance after overwriting the class method. But honestly I’ve never done monkey-patching so I’m not positive what I’m talking about
@mcriley821 But I was overriding an instance method, not a class method. And it worked because the def was called.
@mcriley821 I just tested with my old code and modal style 0, and it works in the same way as your code with the new objc class. The only difference is that the _cmd 2nd parameter is not accepted.
@cvp if you do
you still get 1, but if you
You get 3.
Your monkey-patch overwrites the UIViewController object. But if you do
The print has an error 'int object is not callable'.
Maybe it thinks the method is an attribute, and instead of overwriting the function it just makes an attribute
@mcriley821 you're right. I 🤐 and 😰
Wow.. ok let me go over this data and ill see what i come up with. im still learning ObjC/Swift. Thank ya'll so much for your input and time im off to crash Pythonista a few times lol i hope we can get this because it would be nice for everyone to have this ability without XCode..
@property(nonatomic, readonly) UIInterfaceOrientation preferredInterfaceOrientationForPresentation;
Just to make sure im understanding properly lol..
preferredInterfaceOrientationForPresentationwith 2 or more
UIInterfaceOrientationset on our
UIViewControllerto limit rotation but allowing rotation to differ from
UIStatusBar. and if we dont set this property it will keep the
UIViewControllerset to the current
Instead of trying to make the View's rotation differ from the status bar. why dont we just control the rotation of
UIStatusBaritself? or is that where iPadOS has the issue of ontrolling orientation of apps that supports split-screen multitasking.
@cvp you cannot monkey patch an objc object, without using the objc runtime (swizzleing). Monkey patching just affects calls in python -- when the system calls a selector it doesn't know anything about the python attribute.
There is a way to swizzle in objc, though as I recall, swizzling a single instance is tricky.
@stephen wow 🤔🤯🤕🤒