iOS 7表视图无法自动调整内容插入

Ton*_*ung 38 iphone objective-c uitableview ios7

我正在将我的项目转移到iOS7.我正面临着与半透明导航栏相关的奇怪问题.

我有一个视图控制器,它有一个tableview作为子视图(让我们称之为ControllerA).我使用controllerA初始化一个新的uinavigationcontroller并使用presentviewcontroller以模态方式呈现它.导航栏会阻止显示的视图控制器的表视图.我将automaticAdjustsScrollViewInsets设置为YES,但结果没有改变.我知道我可以将edgesForExtendedLayout设置为UIRectEdgeNone,但它会使导航栏不再是半透明的.

表视图被阻止

之后,我尝试创建一个新的视图控制器进行测试.它包含几乎相同的元素.但结果却大相径庭.表视图内容不会被阻止.

在此输入图像描述

结论

  1. 两个View Controllers的automaticAdjustsScrollViewInsets设置为YES
  2. 该项目不使用故事板
  3. 第一个是在Xcode 4.6上创建的,第二个是在Xcode 5上新创建的
  4. 我比较了两个类xib和代码,没有太大的不同

Ton*_*ung 55

我在苹果开发者论坛上找到了答案.有两种不同的情况.

第一个,添加的视图控制器是一个UITableViewController. 这个问题不应该出现,因为苹果会自动填充它.

第二个,视图控制器不是UITableViewController. 在视图层次结构中,它包含一个UITableView.在这种情况下,如果UITableview(或ScrollView)是viewController的主视图或主视图的第一个子视图,它将起作用.否则,视图控制器不知道要填充哪个滚动视图,它将发生问题.

在我的例子中,视图控制器是第二个.并且有一个背景图像视图作为主视图的第一个子视图.所以,它失败了.

这是Apple开发者论坛链接(需要开发者帐户才能访问):https: //devforums.apple.com/message/900138#900138

  • 那你为什么不分享修复? (17认同)
  • 我有同样的问题,由于背景图像视图,scrollview是主视图中的第二个子视图.你找到了解决方法吗? (2认同)

Chr*_*lay 47

如果您希望视图低于导航栏,但也希望它定位,以便默认情况下滚动视图内容的顶部位于导航栏下方,您可以在布局视图后手动添加顶部插入.这基本上是顶级视图是滚动视图时视图布局系统所执行的操作.

-(void)viewDidLayoutSubviews {
    if ([self respondsToSelector:@selector(topLayoutGuide)]) {
        UIEdgeInsets currentInsets = self.scrollView.contentInset;
        self.scrollView.contentInset = (UIEdgeInsets){
            .top = self.topLayoutGuide.length,
            .bottom = currentInsets.bottom,
            .left = currentInsets.left,
            .right = currentInsets.right
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这对我的特殊情况很有用:我在`UIPageViewController`中有一个`UICollectionViewController`,后者被推送到`UINavigationController`.pageViewController的内部scrollView阻止`automaticAdjustsScrollviewInsets`正常工作.不幸的是,`topLayoutGuide`也没有正确设置,但我仍然可以手动获取导航栏的偏移量:`CGFloat topOffset = self.navigationController.navigationBar.frame.origin.y + self.navigationController.navigationBar.frame. size.height` (3认同)