我有一个非常简单的UIViewController,我正在试图弄清楚如何使用willRotateToInterfaceOrientation。我的UIViewController有一个非常简单的viewDidLoad方法:
-(void)viewDidLoad {
[super viewDidLoad];
theBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 48.0f)];
theBar.tintColor = [UIColor orangeColor];
UINavigationItem *item = [[UINavigationItem alloc] initWithTitle:@"The Title"];
item.hidesBackButton = YES;
[theBar pushNavigationItem:item animated:YES];
[item release];
[self.view addSubview:theBar];
}
基本上,我只是在控制器的顶部有一个UINavigationBar。而已。根据我在网上找到的内容,我实现了一些轮换方法:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return YES;
}
-(void)willRotateToInterfaceOrientation: (UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration {
if ((orientation == UIInterfaceOrientationLandscapeLeft) || (orientation == UIInterfaceOrientationLandscapeRight)) {
theBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, 640, 48)];
}
}
所以,我以纵向模式启动应用程序,然后在横向模式下进入。基本上,theBar
仍然保持正常大小,并且不会调整大小。我确信这是一个愚蠢的问题,但使用旋转功能的正确方法是什么?我希望这样做,如果应用程序以横向模式启动它也可以。在UIViewController首次启动时初始化组件的最佳方法是什么,请记住我希望支持两种方向,同时请记住,我希望能够在整个持续时间内根据方向更改来更改所有内容的大小UIViewController的生命周期?谢谢!
答案 0 :(得分:7)
您要做的是更改现有theBar对象的框架,而不是实例化新框架。你可以这样做:
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)orientation
duration:(NSTimeInterval)duration {
CGRect f = CGRectMake(0,
0,
CGRectGetWidth(self.view.frame),
CGRectGetHeight(theBar.frame);
theBar.frame = f;
}
请注意,使用self.view.frame
的值,其中包含旋转后的值。另请注意,我在这里使用的功能与您的功能不同。我没有使用你正在使用的功能测试它,所以我不能说这是否有效。最后,您可以通过在viewDidLoad
中的theBar上设置autoresizingmask来完全避免这种情况:
[theBar setAutoresizingMask:UIViewAutoresizingFlexibleRightMargin];