我创建了一个简单的项目来演示这种奇怪的行为。我在界面生成器中创建了所有这些,而没有触及代码,以便您轻松重现。
起始页嵌入在只有一个按钮的导航 Controller 中,单击它时,屏幕将定向到选项卡 View (顶部有导航栏)。
运行程序时发生了 2 件奇怪的事情。
1) 选项卡 item2 的表格 View 位于导航栏下方,因为 item1 的显示正确。
与
正如你所看到的,虽然两个表格 View 被放置在完全相同的位置,但是当程序运行时,第二个甚至因为不正确的对齐而隐藏了搜索栏。
2) 当点击选项卡item1中的搜索栏时,默认行为不隐藏导航栏(导航栏隐藏,搜索栏显示)。
由于导航栏是半透明的,我可以在导航栏下方看到“取消”按钮。(任何眼力好的人都可以看到屏幕截图右上角的蓝色调)。这意味着搜索栏会转到正确的位置,但导航栏不会消失。
另外,请注意,当搜索栏处于事件状态时,表格 View 不会随着搜索栏向上移动(同样,默认行为)。
PS:我正在使用 XCode 6。我还尝试向 tableviewcontrollers 添加约束,但没有骰子。
对此有什么想法吗?提前致谢。
最佳答案
正如 logixologist 所建议的,您可以为每个选项卡放置一个导航 Controller 作为选项卡的第一个 Controller 。如果您不想这样做,可以在第二项 View Controller 的 viewDidLoad 中添加以下代码。
CGFloat shiftDist = CGRectGetHeight(self.navigationController.navigationBar.frame) + CGRectGetHeight([UIApplication sharedApplication].statusBarFrame);
self.tableView.contentInset = UIEdgeInsetsMake(shiftDist,0, 0, 0.0f);
self.tableView.contentOffset = CGPointMake(0, -shiftDist);
之后,旋转出现问题。您会注意到,如果您旋转到横向,搜索栏不会固定在导航栏下方。以下是修复方法。
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinator NS_AVAILABLE_IOS(8_0);{
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
CGFloat heightBeforeRotation = CGRectGetHeight(self.navigationController.navigationBar.frame) + CGRectGetHeight([UIApplication sharedApplication].statusBarFrame);
CGFloat offsetY = self.tableView.contentOffset.y;
[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context)
{
} completion:^(id<UIViewControllerTransitionCoordinatorContext> context)
{
CGFloat heightAfterRotation = CGRectGetHeight(self.navigationController.navigationBar.frame) + CGRectGetHeight([UIApplication sharedApplication].statusBarFrame);
self.tableView.contentInset = UIEdgeInsetsMake(heightAfterRotation,0, 0, 0.0f);
self.tableView.contentOffset = CGPointMake(0, heightBeforeRotation + offsetY - heightAfterRotation);
}];
}
关于objective-c - 两个相同选项卡 View 中的 UITableView 表现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26669901/