【问题标题】:UINavigationController loading view incorrectly due to Orientation/ShakeUINavigationController 由于方向/摇晃而错误地加载视图
【发布时间】:2011-07-13 18:22:07
【问题描述】:

背景:应用有摇一摇回家功能。主页视图 仅支持纵向。 如果您比平时更用力地摇动,您所在的视图会开始旋转(这很好),但随后它会检测到摇动并对主视图执行 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;
}

【问题讨论】:

  • 您是如何创建视图的?
  • 主视图(在栏下方,包含内容)由 ViewController 和 XIB 完成。 UINavigationBar 正在 App Delegate 中创建。
  • 它的尺寸是否适合它进入的间隙?
  • 并非如此。 XIB 配置为 320x480。您是否建议我以某种方式使视图实际上是 320 x(480-44-Statusbar 高度?)。现在它可以工作,并且它的设计是通过在加载时允许底部的一些边距空间被切断来工作
  • 我将在周末亲自为您在 IB 中进行挖掘,因为我现在不在我的电脑前。此刻只是抓着稻草......

标签: iphone ios xcode uinavigationbar popviewcontroller


【解决方案1】:

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

所以我会从这个开始......在应用程序中: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]; } }

【讨论】:

  • 当然。我会试试的。 HomeViewController 为应该自动旋转返回 NO。我现在会尝试重新开始。
  • 也试过了。再次没有运气。
  • 我可以提供任何其他必要的信息来了解这一点,但还有什么。这确实应该在委托和视图中
  • 好吧,我有另一个想法。实现- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation。在前者中,将 HomeViewController 中的“旋转”布尔值设置为“是”。在 didRotate 中将其设置为 NO。在motionEnded:withEvent: 中检查它,如果它设置为YES,则不要弹出。在每个中调用两者的超类实现可能是个好主意。
  • 不是延迟——只是忽略。如果他们在摇晃,那没关系,因为可能会发生另一个摇晃事件。我在上面添加了我现有的答案。
【解决方案2】:

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

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

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

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

【讨论】:

  • 那行不通。在特定情况下,当我回头时,我仍然会看到拉伸的主视图
  • 感谢您的尝试。除了标题部分,我仍然需要大部分代码。
  • 也许我只是在构建导航栏的结构错误。我以编程方式创建它,但我弹回到 homeview 控制器。由于我正在弹出到主视图控制器,我可以创建一些其他过渡(淡入淡出吗?)
  • 不,你只能有默认动画(或根本没有任何动画)......关于代码,你正在创建和销毁'HomeViewController's对象......你意识到您使用 alloc init 创建的对象不是您要弹出的“HomeViewController”吗?
  • 这可能只会使您当前的视图控制器在内存中停留的时间更长..有时您需要自动释放对象但我认为您不需要它...即使您的控制器不会泄漏你删除那条线,如果这就是你这样做的原因..
【解决方案3】:

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

【讨论】:

  • 不,我会尽快尝试。谢谢
  • 刚刚试过。我不认为它的状态栏。发生的情况是内容认为它有整个视图要加载,所以它会伸展自己以占据整个屏幕,而没有意识到它上面有一个导航栏。
【解决方案4】:

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

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

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

【讨论】:

  • 似乎无法集成。 LoadingView 到底是什么?我会改用 homeviewcontroller 吗?
  • 我感觉这会起作用,但我似乎无法在没有错误的情况下集成它。
  • 当你的 homeviewcontroller 添加到窗口时,应该执行该行,假设它是根视图控制器。所以它应该在 [window addsubview] 之后进入 AppDelegate.m
  • 向 OP 添加了代码。它仍然崩溃。觉得我在做一些奇怪的事情
  • 应该是 [[[self home] view] setFrame:[[UIScreen mainScreen] applicationFrame]];
猜你喜欢
  • 2011-02-26
  • 2022-01-09
  • 1970-01-01
  • 2015-08-08
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
相关资源
最近更新 更多