6

背景:应用程序具有摇一摇回家功能。主页视图 仅支持纵向。如果您比平时更用力地摇动,您所在的视图会开始旋转(这很好),但随后它会检测到摇动并对主视图执行 popViewController。当它这样做时,它加载导航控制器就好了,但是(主页内容)下的视图被加载到栏后面并被拉伸(它基本上是在导航栏下面加载,所以它被拉伸了)

后退按钮可以很好地处理从横向到纵向的处理(因为它不是中间过渡)

我应该如何处理这种方向变化(从摇动),以便我可以弹回根视图控制器,而无需在导航栏下加载视图?

编辑:发生的事情是内容认为它有整个视图要加载,所以它会伸展自己以占据整个屏幕,而没有意识到它上面有一个导航栏。我可以知道,因为加载的图像被拉伸了

增加了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];
}

这是我的应用程序代表:

    - (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;
}
4

4 回答 4

2

我遇到了与导航栏重叠的问题。我不确定是什么原因造成的,但你可以通过调用来解决它,

[[self loadingView] setFrame:[[UIScreen mainScreen] applicationFrame]];

将问题视图添加到应用程序委托中的窗口后。

于 2011-07-25T22:59:16.480 回答
2

我对你的代码有点困惑,所以我真的建议从头开始。正如 Lukya 所提到的,没有理由重新创建 HomeViewController。我也对“[[self retain] autorelease];”感到困惑。少量。除非您在其他地方做错了事情,否则这不是必需的。

所以我会从这个开始......在 application: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 所以它不会旋转,因为你的第一行说“主视图只支持纵向”?

willRotateToInterfaceOrientation:duration:编辑:和的一个例子didRotateFromInterfaceOrientation:

在您检测到抖动的任何控制器的标题中添加一个布尔值:

    BOOL 正在旋转;

在你的实现文件中添加我们想要覆盖的两个 UIViewController 方法——比如:

    - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 持续时间:(NSTimeInterval)duration {
        [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
        isRotating = YES;
    }

    - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
        [super didRotateFromInterfaceOrientation:fromInterfaceOrientation];
        isRotating = 否;
    }

现在,为您的事件处理程序做这样的事情:

    - (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
    {
        if (event.subtype == UIEventSubtypeMotionShake && !isRotating)
        {
            [self.navigationController popViewControllerAnimated:YES];
        }
    }
于 2011-07-26T23:31:40.233 回答
2

您是否尝试过调用[[UIApplication sharedApplication] setStatusBarOrientation: UIInterfaceOrientationPortrait animated:YES];您的主视图控制器?你也可以试着把它放在你检测到震动的地方。

于 2011-07-13T22:22:34.830 回答
2

在您的主视图控制器的 xib 中,转到inspector视图并将顶部栏设置为导航栏.. 并在视图中加载设置self.navigationBarHidden = NO;...

注意:您发布的代码有很多问题......但它们都不会导致方向问题......事实上,这似乎是您在该方法中需要的唯一代码:

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    if (event.subtype == UIEventSubtypeMotionShake)
    {
        [navController popViewControllerAnimated:YES];
    }
}

所以您可能也想更改此代码..

于 2011-07-25T10:10:22.403 回答