¿Cómo rotar UIViews?

La aplicación de Twitter es una aplicación de barra de tabs en el iPhone. Nada en ninguna de las tabs girará, sin embargo, cuando hace clic en un enlace de un tweet, el controller de vista que está presionado encima de él puede girar. Las únicas rotaciones que he hecho es inclinar el dispositivo, el paisaje o el retrato, pero no entiendo cómo usar transformaciones 2D y animaciones para rotar vistas.

¿Cómo rotar cualquier vista con una subclass de UIView?

Oye, tuve un problema similar con la rotation. Tuve una aplicación de tabbar que quería seguir siendo retrato, pero tengo un reproductor de video que permite todas las rotaciones.

Logré hacer esto bastante fácilmente subclasificando la barra de tabs y solo permitiendo la rotation del retrato mientras adjunto el reproductor de video al controller de la vista raíz que permite todas las rotaciones. Mira mi publicación original aquí . Espero que sea de alguna ayuda!

Puede usar las animaciones UIView y los methods Transformar. Para girar 90 grados:

[UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.5]; imageView.transform = CGAffineTransformMakeRotation(M_PI_2); [UIView commitAnimations]; 

Este es el mejor y perfecto trabajo para mí y creo que esta es la respuesta correcta.

Simplemente ingrese el número de veces que quiere rotar en lugar de 50 en el valor

  CABasicAnimation *rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; NSNumber *currentAngle = [CircleView.layer.presentationLayer valueForKeyPath:@"transform.rotation"]; rotationAnimation.fromValue = currentAngle; rotationAnimation.toValue = @(50*M_PI); rotationAnimation.duration = 50.0f; // this might be too fast rotationAnimation.repeatCount = HUGE_VALF; // HUGE_VALF is defined in math.h so import it [CircleView.layer addAnimation:rotationAnimation forKey:@"rotationAnimationleft"]; 

Ref desde ¿Cómo implementar la rotation de UIViewController en respuesta a los cambios de orientación?

Lo hago con un controller de vista raíz (esto podría ser un UITabBarController) y en su método viewDidLoad me suscribo a events de rotation:

 [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(didRotate:) name:@"UIDeviceOrientationDidChangeNotification" object:nil]; 

Luego, en el método didRotate: miro qué controller de vista es visible cuando ocurrió la rotation y en qué orientación está el teléfono:

 - (void) didRotate:(NSNotification *)notification { UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; /* DEVICE JUST ROTATED TO PORTRAIT MODE orientation == UIDeviceOrientationFaceUp || orientation == UIDeviceOrientationFaceDown */ if(orientation == UIDeviceOrientationPortrait) { /* DEVICE JUST ROTATED TO LANDSCAPE MODE */ }else if(orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) { } } 

Dentro de eso hizo Rotate: puedes ver cuál es el viewController visible y hacer lo que quieras desde allí.

Presento un controller de vista modal en modo horizontal cuando un controller de vista particular está visible y el teléfono gira en paisaje. Si hay otro controller de vista visible, ignoro el evento.

Obligaré a mi controller de vista modal a que se muestre en modo horizontal en su método viewWillAppear: puedo darle a cualquier persona este código si lo desean.

Espero que esto ayude.

Puede implementar el método shouldAutorotateToInterfaceOrientation . En la aplicación de Twitter supongo que solo permiten la orientación vertical para el tabBarController, pero permiten el paisaje en modalViewController usando este método. Lo busco en la documentation, es bastante simple, creo. ¡Espero que esto responda tu pregunta!

@ Mangesh-Vyas tiene buena información, pero no responde la pregunta (como la he leído). La razón por la que las vistas que Twitter (entre otras aplicaciones) presenta puede rotar, cuando la barra de tabs o la barra de navigation no pueden, se debe a que se presentan de manera modal. Las vistas que se presentan de manera modal no están restringidas a las orientaciones admisibles del controller que las presentó.

Editar: Quizás espere que un UIViewController stock gire. Si es así, se sentirá decepcionado, ya que solo (a mi leal saber y entender) se pueden hacer subclasss personalizadas para rotar a interfaces de interfaz arbitrarias. El siguiente código hará el truco:

  - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOr‌​ientation { return YES; } 

Edición 2: aquí está el código que hace que todo termine:
AppDelegate.m

 #import "RotateViewController.h" @interface AppDelegate () { UINavigationController* nc; } - (void)pushVC; - (void)openVC; @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; UIViewController* vc = [[UIViewController alloc] init]; vc.view.backgroundColor = [UIColor blueColor]; vc.title = @"Root"; UIButton* b = [UIButton buttonWithType:UIButtonTypeRoundedRect]; b.frame = CGRectMake(50, 150, 220, 40); [b.titleLabel setText:@"Push VC"]; [b addTarget:self action:@selector(pushVC) forControlEvents:UIControlEventTouchUpInside]; [vc.view addSubview:b]; b = [UIButton buttonWithType:UIButtonTypeRoundedRect]; b.frame = CGRectMake(50, 200, 220, 40); [b.titleLabel setText:@"Modal VC"]; [b addTarget:self action:@selector(openVC) forControlEvents:UIControlEventTouchUpInside]; [vc.view addSubview:b]; nc = [[UINavigationController alloc] initWithRootViewController:vc]; UITabBarController* tc = [[UITabBarController alloc] init]; [tc addChildViewController:nc]; // uncomment this line to see this work in a nav controller // [self.window setRootViewController:nc]; [self.window setRootViewController:tc]; // Override point for customization after application launch. self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; return YES; } - (void)openVC { RotateViewController* rc = [[RotateViewController alloc] init]; [nc presentModalViewController:rc animated:YES]; } - (void)pushVC { RotateViewController* rc = [[RotateViewController alloc] init]; [nc pushViewController:rc animated:YES]; } 

RotateViewController es una subclass de UIViewController de UIViewController con la function shouldAutorotate desde arriba.

Nota bene UITabBarControllers puede rotar a una orientación de interfaz dada si, y solo si, cada uno de sus controlleres de vista secundarios devuelve YES para esa orientación. UINavigationViewControllers puede rotar a una orientación de interfaz dada si su controller de vista superior devuelve YES para esa orientación de interfaz.