Twitter应用程序是iPhone上的标签栏应用程序。任何选项卡中的任何内容都不会旋转,但是,当您单击推文中的链接时,允许旋转顶部的视图控制器。我曾经唯一的旋转是倾斜设备,风景或肖像,但我不明白如何使用2D变换和动画来旋转视图。
如何使用UIView的子类旋转任何视图?
答案 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)
查看本教程,我认为这就是你想要做的事情
http://www.raywenderlich.com/9864/how-to-create-a-rotating-wheel-control-with-uikit
http://www.raywenderlich.com/5478/uiview-animation-tutorial-practical-recipes
答案 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)interfaceOrientation
{
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
该方向时。如果顶部视图控制器为该界面方向返回UINavigationViewControllers
,YES
可以旋转到给定的界面方向。