UINavigationController中的UITableView在轮换后获得导航栏

时间:2009-12-10 16:14:55

标签: uitableview uinavigationcontroller rotation bounds

这是肖像:

alt text

这是风景

alt text

我在轮换时试过这个但没有成功:

self.tableView.autoresizesSubviews = YES;
self.tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;

8 个答案:

答案 0 :(得分:13)

我最近遇到了这个问题。在我的情况下,这是因为我正在执行不是应用程序窗口的根控制器的导航控制器的旋转。因此,我使用旋转通知侦听器/仿射变换/边界调整方法来更改导航控制器的布局。这很有效,但产生了这里描述的结果。我花了一段时间注意到,当我旋转到横向时,导航栏的高度没有被正确调整大小(即,从44到32像素,框架的横向模式的高度降低)。我的应用的根视图控制器响应 willRotateToInterfaceOrientation didRotateFromInterfaceOrientation 。该视图控制器也已经知道相关的导航控制器。我通过将以下代码添加到 willRotateToInterfaceOrientation 方法来解决问题:

CGRect frame = self.navViewController.navigationBar.frame;
if (toInterfaceOrientation == UIInterfaceOrientationPortrait || toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) {
    frame.size.height = 44;
} else {
    frame.size.height = 32;
}
self.navViewController.navigationBar.frame = frame;

希望这可以在类似的情况下节省一些时间。

答案 1 :(得分:7)

当以root身份使用自定义视图控制器(管理其他视图控制器本身)时,它负责将所有旋转事件转发到当前活动的子控制器(如果我可以这样调用它)。这些事件是:

– willRotateToInterfaceOrientation:duration:

– willAnimateRotationToInterfaceOrientation:duration:

– didRotateFromInterfaceOrientation:

– willAnimateFirstHalfOfRotationToInterfaceOrientation:duration:

– didAnimateFirstHalfOfRotationToInterfaceOrientation:

– willAnimateSecondHalfOfRotationFromInterfaceOrientation:duration:

因此,对于由自定义根控制器管理的导航控制器,将– willAnimateRotationToInterfaceOrientation:duration:转发到导航控制器可以在旋转时修复错误导航栏高度的问题。

答案 2 :(得分:6)

在didRotateFromInterfaceOrientation方法中添加以下行。

[self.navigationController.view layoutSubviews];

我希望这样做。

答案 3 :(得分:2)

我有完全相同的问题,@ jstevenco让我找到了一个非常奇怪的解决方案。 我的视图也会在旋转时自动调整大小,但是tableview似乎并不理解有一个导航控制器坐在那里:

在tableviewcontroller中,添加以下内容:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
[super didRotateFromInterfaceOrientation:fromInterfaceOrientation];
 CGRect frame = navBar.frame;
if (fromInterfaceOrientation == UIInterfaceOrientationPortrait || fromInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) {
    frame.size.height = 31.9;
} else {
    frame.size.height = 44.1;
}
navBar.frame = frame;  

}

31.9和44.1非常重要!离开这些是32和44,没有调整大小,所以它似乎忽略它。为我工作,希望它能帮助别人。

答案 4 :(得分:0)

在方向改变之后,我看起来像桌面视图稍微向下滚动。

您是否尝试过调用scrollToRowAtIndexPath:atScrollPosition:animated:并滚动到最顶行?

答案 5 :(得分:0)

如果您在导航控制器中调用了“willAnimateRotationToInterfaceOrientation:”,但忘记在方法中调用super,则会出现此问题。

你应该有这样的东西:

        - (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
        [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation];
// Your code here

    }

答案 6 :(得分:0)

在这些情况下需要注意的一件事是,如果要手动更改状态栏,请注意方向。如果状态栏未隐藏,并且您在状态栏方向错误时更改了视图框架(在代码中,可能是在更改框架后更新状态栏的方向),它将自动即使您没有自动调整大小,也会错误地调整导航栏的大小。

答案 7 :(得分:0)

当设备方向发生变化时,您的UINavigationController需要收到通知。如果您只将view UINavigationController添加到另一个UIView,则不会发生这种情况。

从iOS 5开始,您只需在父addChildViewController:上调用UIViewController,这将确保方向更改传播到此子视图控制器。