FWIW นี่คือการใช้งานการตั้งค่าการวางแนวด้วยตนเองของฉัน (ไปที่ตัวควบคุมมุมมองรูทของแอปของคุณ natch):
-(void)rotateInterfaceToOrientation:(UIDeviceOrientation)orientation{
CGRect bounds = [[ UIScreen mainScreen ] bounds ];
CGAffineTransform t;
CGFloat r = 0;
switch ( orientation ) {
case UIDeviceOrientationLandscapeRight:
r = -(M_PI / 2);
break;
case UIDeviceOrientationLandscapeLeft:
r = M_PI / 2;
break;
}
if( r != 0 ){
CGSize sz = bounds.size;
bounds.size.width = sz.height;
bounds.size.height = sz.width;
}
t = CGAffineTransformMakeRotation( r );
UIApplication *application = [ UIApplication sharedApplication ];
[ UIView beginAnimations:@"InterfaceOrientation" context: nil ];
[ UIView setAnimationDuration: [ application statusBarOrientationAnimationDuration ] ];
self.view.transform = t;
self.view.bounds = bounds;
[ UIView commitAnimations ];
[ application setStatusBarOrientation: orientation animated: YES ];
}
ควบคู่ไปกับUINavigationControllerDelegate
วิธีการต่อไปนี้(สมมติว่าคุณใช้ a UINavigationController
):
-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated{
UIDeviceOrientation orientation = [[ UIDevice currentDevice ] orientation ];
BOOL bViewControllerDoesSupportCurrentOrientation = [ viewController shouldAutorotateToInterfaceOrientation: orientation ];
if( !bViewControllerDoesSupportCurrentOrientation ){
[ self rotateInterfaceToOrientation: UIDeviceOrientationPortrait ];
}
}
ที่ดูแลการหมุนมุมมองรูทตามว่าขาเข้าUIViewController
รองรับการวางแนวอุปกรณ์ปัจจุบันหรือไม่ สุดท้ายคุณจะต้องเชื่อมrotateInterfaceToOrientation
ต่อกับการเปลี่ยนแปลงการวางแนวอุปกรณ์จริงเพื่อเลียนแบบการทำงานของ iOS มาตรฐาน เพิ่มตัวจัดการเหตุการณ์นี้ไปยังตัวควบคุมมุมมองรูทเดียวกัน:
-(void)onUIDeviceOrientationDidChangeNotification:(NSNotification*)notification{
UIViewController *tvc = self.rootNavigationController.topViewController;
UIDeviceOrientation orientation = [[ UIDevice currentDevice ] orientation ];
if( orientation != [[ UIApplication sharedApplication ] statusBarOrientation ] ){
if( [ tvc shouldAutorotateToInterfaceOrientation: orientation ] ){
[ self rotateInterfaceToOrientation: orientation ];
}
}
}
สุดท้ายลงทะเบียนเพื่อรับการUIDeviceOrientationDidChangeNotification
แจ้งเตือนในinit
หรือloadview
ดังนี้:
[[ NSNotificationCenter defaultCenter ] addObserver: self
selector: @selector(onUIDeviceOrientationDidChangeNotification:)
name: UIDeviceOrientationDidChangeNotification
object: nil ];
[[ UIDevice currentDevice ] beginGeneratingDeviceOrientationNotifications ];