2

Twitter 应用程序是 iPhone 上的标签栏应用程序。任何选项卡中的任何内容都不会旋转,但是,当您单击推文中的链接时,被推到其顶部的视图控制器是允许旋转的。我做过的唯一旋转是倾斜设备、横向或纵向,但我不明白如何使用 2d 转换和动画来旋转视图。

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

4

7 回答 7

14

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

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

imageView.transform = CGAffineTransformMakeRotation(M_PI_2);

[UIView commitAnimations];
于 2012-09-25T09:24:17.710 回答
2

嘿,我在旋转时遇到了类似的问题。我有一个标签栏应用程序,我想保持纵向,但有一个允许所有旋转的视频播放器。

我设法通过对标签栏进行子类化并仅允许纵向旋转,同时将视频播放器连接到允许所有旋转的根视图控制器来相当容易地做到这一点。在这里查看我的原始帖子。希望对您有所帮助!

于 2012-09-26T12:06:11.993 回答
0

检查本教程,我认为这就是您想要做的
http://www.raywenderlich.com/9864/how-to-create-a-rotating-wheel-control-with-uikit
http://www.raywenderlich。 com/5478/uiview-animation-tutorial-practical-recipes

于 2012-09-25T05:41:21.360 回答
0

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

只需在 toValue 中给出您想要旋转多少次而不是 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"];
于 2016-01-16T09:25:30.413 回答
-1

参考 如何实现 UIViewController 旋转以响应方向变化?

我通过拥有一个根视图控制器(这可能是一个 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 方法中以横向模式显示 - 如果他们想要,我可以给任何人这个代码。

希望这可以帮助。

于 2012-09-11T14:08:42.613 回答
-1

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

于 2012-09-11T15:04:53.717 回答
-2

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

编辑: 也许您期望股票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 才能旋转到给定的界面方向。 如果他们的顶视图控制器返回该界面方向,则可以旋转到给定的界面方向。UITabBarControllersYESUINavigationViewControllersYES

于 2012-09-11T14:20:40.857 回答