如何旋转UIViews?

时间:2012-09-11 14:00:53

标签: iphone ios xcode cocoa-touch core-animation

Twitter应用程序是iPhone上的标签栏应用程序。任何选项卡中的任何内容都不会旋转,但是,当您单击推文中的链接时,允许旋转顶部的视图控制器。我曾经唯一的旋转是倾斜设备,风景或肖像,但我不明白如何使用2D变换和动画来旋转视图。

如何使用UIView的子类旋转任何视图?

7 个答案:

答案 0 :(得分:14)

您可以使用UIView动画和Transform方法。 旋转90度:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];

imageView.transform = CGAffineTransformMakeRotation(M_PI_2);

[UIView commitAnimations];

答案 1 :(得分:2)

嘿,我有一个类似的旋转问题。我有一个tabbar应用程序,我想保持肖像,但有一个允许所有旋转的视频播放器。

通过对tabbar进行子类化并且只允许纵向旋转,同时将视频播放器连接到允许所有旋转的Root View Controller,我设法做到了这一点。查看我的原始帖子here。希望它有所帮助!

答案 2 :(得分:0)

答案 3 :(得分:0)

这对我来说是最好和最完美的工作,我认为这是正确的答案。

只需给出数字你想在50以上的地方轮换的数量

    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"];

答案 4 :(得分:-1)

参考How to implement UIViewController rotation in response to orientation changes?

我通过拥有一个根视图控制器(这可能是一个UITabBarController)并在其viewDidLoad方法中订阅旋转事件:

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

然后在didRotate:方法中,我看看旋转发生时哪个视图控制器可见,以及手机的方向:

- (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) {






}

}

在didRotate中:你可以看看哪个是可见的viewController并从那里做你想做的事。

当特定视图控制器可见且手机旋转为横向时,我以横向模式呈现模态视图控制器。如果任何其他视图控制器可见,我将忽略该事件。

我强制我的模态视图控制器在其viewWillAppear方法中以横向模式显示 - 如果他们需要,我可以给任何人这个代码。

希望这有帮助。

答案 5 :(得分:-1)

您可以实施 shouldAutorotateToInterfaceOrientation 方法。在Twitter应用程序中,我猜他们只允许tabBarController的纵向方向,但允许使用此方法在modalViewController中的横向。在文档中查找,我认为这很简单。我希望这能回答你的问题!

答案 6 :(得分:-2)

@ Mangesh-Vyas有一些很好的信息,但没有完全回答这个问题(正如我所读)。 Twitter(以及其他应用程序)提供的视图可以在tabbar或navbar不能旋转的原因是因为它们是以模态方式呈现的。以模态方式呈现的视图不受限于呈现它们的控制器的允许方向。

修改 也许您期望股票UIViewController能够轮换。如果是这样,那么你会感到失望,因为只有(据我所知)自定义子类可以旋转到任意interfaceOrientations。以下代码将起到作用:

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

编辑2: 这是让整个事情发生的代码:
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是UIViewController的库存子类,上面带有shouldAutorotate函数。

Nota bene UITabBarControllers可以旋转到给定的界面方向,当且仅当他们的每个子视图控制器返回YES该方向时。如果顶部视图控制器为该界面方向返回UINavigationViewControllersYES可以旋转到给定的界面方向。