背景:App有一个回家的功能。主视图仅支持纵向。 如果你比平时更加晃动,你所看到的视图开始旋转(这很好),但随后它会检测到一个震动,并将popViewControlller发送到主视图。当它这样做时它加载导航控制器就好了,但是(主页内容)下的视图被加载到栏后面并被拉伸(它基本上是在导航栏下方加载,因此它会被拉伸)
后退按钮从横向到纵向处理这个很好(因为它不是中间过渡)
我应该如何处理这个方向更改(从摇动),以便我可以弹回到根视图控制器,而无需在导航栏下加载视图?
编辑:正在发生的事情是内容认为它有整个视图要加载,因此它会自我伸展以占据整个屏幕,而不是实现它上面的导航栏。我可以看出,因为图像加载已拉长
增加了50的赏金。
编辑这里我是如何检测摇晃和弹出
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
if ( event.subtype == UIEventSubtypeMotionShake )
{
UINavigationController *navController = self.navigationController;
[[self retain] autorelease];
HomeViewController *home = [[HomeViewController alloc]init];
[navController popViewControllerAnimated:YES];
home.title =@"Home View Controller";
[home release];
}
if ( [super respondsToSelector:@selector(motionEnded:withEvent:)] )
[super motionEnded:motion withEvent:event];
}
这是我的App代表:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
navController = [[UINavigationController alloc]init];
[self.window addSubview:navController.view];
HomeViewController *home = [[HomeViewController alloc]init];
[[self home] setFrame:[[UIScreen mainScreen] applicationFrame]];
我会在这里加一个模型。
普通视图:
摇晃/流行后的拉伸视图:
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
}
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return YES;
}
答案 0 :(得分:2)
您是否尝试在家庭视图控制器中调用[[UIApplication sharedApplication] setStatusBarOrientation: UIInterfaceOrientationPortrait animated:YES];
?您也可以尝试将其置于检测到震动的位置。
答案 1 :(得分:2)
在您的主视图控制器的xib中,转到视图的inspector
并将顶部栏设置为导航栏..并在视图中加载集self.navigationBarHidden = NO;
...
注意: 你发布的代码有很多问题..但是没有一个导致方向问题......实际上这似乎是你在该方法中需要的唯一代码:
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
if (event.subtype == UIEventSubtypeMotionShake)
{
[navController popViewControllerAnimated:YES];
}
}
因此您可能也想要更改此代码..
答案 2 :(得分:2)
我在导航栏下面遇到了这个问题。我不确定是什么导致它,但你可以通过调用来解决它,
[[self loadingView] setFrame:[[UIScreen mainScreen] applicationFrame]];
将问题视图添加到应用程序委托中的窗口后。
答案 3 :(得分:2)
我对你的代码感到有些困惑,所以我真的建议从头开始。正如Lukya所说,没有理由重新创建HomeViewController。我也对“[[自我保留]自动释放]感到困惑;”位。除非你在其他地方做错了,否则这不应该是必要的。
所以我会从这开始...在应用程序中:didFinishLaunchingWithOptions:做这样的事情:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { HomeViewController *home = [[[HomeViewController alloc] init] autorelease]; UINavigationController *navController = [[[UINavigationController alloc] initWithRootViewController:home] autorelease]; [self.window addSubview:navController.view]; }
该窗口将保留您的导航控制器,导航控制器将保留您的HomeViewController。
然后在motionEnded:withEvent:做类似的事情:
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event { if (event.subtype == UIEventSubtypeMotionShake) { [self.navigationController popViewControllerAnimated:YES]; } }
应该是它。
如果这不起作用,那么你可以提供任何其他信息吗?例如,HomeViewController是否在shouldAutorotateToInterfaceOrientation中实现(并返回YES):?如果是这样,你可以返回no,因为你的第一行显示“Home view Only支持肖像”,它不会旋转吗?
修改:willRotateToInterfaceOrientation:duration:
和didRotateFromInterfaceOrientation:
的示例。
在你正在检测抖动的控制器的标题中添加一个布尔值:
BOOL isRotating;
在您的实现文件中添加我们要覆盖的两个UIViewController方法 - 类似于:
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; isRotating = YES; } - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { [super didRotateFromInterfaceOrientation:fromInterfaceOrientation]; isRotating = NO; }
现在,为您的事件处理程序执行以下操作:
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event { if (event.subtype == UIEventSubtypeMotionShake && !isRotating) { [self.navigationController popViewControllerAnimated:YES]; } }