automaticallyAdjustsScrollViewInsets属性无效

31

我已经创建了一个非常简单的演示应用程序来测试automaticallyAdjustsScrollViewInsets的功能,但tableView的最后一行被我的标签栏覆盖。

我的AppDelegate代码:

UITabBarController *tabControl = [[UITabBarController alloc] init];
tabControl.tabBar.translucent = YES;
testViewController *test = [[testViewController alloc] init];
[tabControl setViewControllers:@[test]];

[self.window setRootViewController:tabControl];

我的 testViewController(UITableViewController 的子类)代码:

- (void)viewDidLoad
{
[super viewDidLoad];
self.automaticallyAdjustsScrollViewInsets = YES;
self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
self.tableView.dataSource = self;
self.tableView.scrollIndicatorInsets = self.tableView.contentInset;
//[self.view addSubview:self.tableView];

// Do any additional setup after loading the view.
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 20;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@""];
cell.textLabel.text = @"test";
return cell;
}

这是iOS 7的一个bug吗?如果不是,那我做错了什么?


TLDR:automaticallyAdjustsScrollViewInsets在iOS 11中已被弃用。苹果公司表示:“请使用UIScrollView的contentInsetAdjustmentBehavior代替”。 - PDK
5个回答

57
我认为automaticallyAdjustsScrollViewInsets只在您的控制器的viewUIScrollView(例如表视图)时才起作用。
您的问题似乎是您的控制器的view是普通的UIView,而您的UITableView只是一个子视图,所以您必须:
  • 使表视图成为“根”视图。

  • 手动调整插图:

    UIEdgeInsets insets = UIEdgeInsetsMake(controller.topLayoutGuide.length,
                                           0.0,
                                           controller.bottomLayoutGuide.length,
                                           0.0);
    scrollView.contentInset = insets;
    

编辑:

似乎 SDK 能够调整一些滚动视图,尽管它不是控制器的根视图。

到目前为止,它与 UIScrollViewUIWebViewscrollView 配合使用时,它们需要是子视图中的第一个。

无论如何,在将来的 iOS 发布中,这可能会发生变化,因此最好自己调整插图。


25
我发现只有在视图控制器的视图子视图中索引为0的位置有一个滚动视图时,它才起作用。 - Thomas Keuleers
刚刚确认了。UIWebView的滚动视图在视图层次结构中更深,这很有趣。 - Rivera
+1 表示索引 0 位;帮助我解决了一个关于网页视图未被调整的问题。 - Sixten Otto
简直不敢相信那个0索引的问题。我遇到这个设置问题的次数太多了,现在才发现原来是这么愚蠢的事情。苹果真的需要警告你这个限制。无论如何,我可以确认这也适用于UICollectionView。 - Mark Bridges
2
此外,我发现如果您的视图层次结构中有多个滚动视图(即使目前只安装了一个),它也不起作用,即使滚动视图在子视图中的索引为0。只有当我完全从storyboard中删除其他滚动视图时,它才能正常工作。所以这个属性对我来说是一团糟... - manicaesar
2
在iOS 11上,你可以在父控制器(标签栏控制器)上设置additionalSafeAreaInsets,而不是插入每个子控制器的滚动视图,这样所有的子控制器都会继承它。 - beebcon

22

为了使 automaticallyAdjustsScrollViewInsets 正常工作,你的视图控制器必须直接在UINavigationController的堆栈上,也就是说,它不能作为另一个视图控制器中的子视图控制器。

如果它是另一个视图控制器的子视图控制器,并且该视图控制器在导航堆栈中,则可以在父视图控制器上设置 automaticallyAdjustsScrollViewInsets = NO。或者你可以这样做:

self.parentViewController.automaticallyAdjustsScrollViewInsets = NO;

这个答案对我很有帮助。在我的情况下,管理表视图的视图控制器是使用addChildViewController添加到其父视图中的。在子视图上设置self.automaticallyAdjustsScrollViewInsets = NO;是不够的。你还需要在父视图上设置它,因为它似乎会递归地查找并定位所有滚动视图以自动设置其插入。 - Pwner

18

我刚刚解决了iOS 11和Swift 4的这个问题。我的当前问题是,当ScrollView存在时,iOS11有一个新属性来验证插图,那就是contentInsetAdjustmentBehavior,这是ScrollView的一个属性,其默认属性为automatic,所以我的代码如下:

if #available(iOS 11, *) {
    myScroll.contentInsetAdjustmentBehavior = .never
} else {
    self.automaticallyAdjustsScrollViewInsets = false
}

我希望这也能解决你的问题...


这里的 myScroll 是什么? - Mando
这可能是一个简单的滚动视图或表视图,集合视图...请看这个 https://developer.apple.com/documentation/uikit/uiscrollview/2902261-contentinsetadjustmentbehavior - DariusV
我只是想知道在iOS 11中automaticallyAdjustsScrollViewInsets发生了什么事..谢谢! - ace_ventura
它刚刚被弃用了,肯定是因为从自身处理滚动行为比从ViewController的属性处理更有意义。 - DariusV

2

我有这样的层次结构:

  1. 自定义导航控制器包含自定义标签栏控制器

  2. 自定义标签栏控制器包含多个控制器

  3. 这些控制器包含子视图,其中一个子视图包含uiscrollview的子类。

我必须将automaticallyAdjustsScrollViewInsets设置为NO。

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    self.automaticallyAdjustsScrollViewInsets = NO;

在自定义的tabbarcontroller中。层次结构中的其他控制器对嵌套滚动视图的行为没有任何影响。


我也曾经在一个简单的UITextView上遇到过奇怪的行为。 - race_carr

2
我遇到了同样的问题,即带有不必要的顶部填充的表视图。
所有答案都说通过设置`automaticallyAdjustsScrollViewInsets = NO`来修复,但对我来说并没有消除填充。
与其他答案类似,如果您使用非标准视图层次结构,则需要略微调整这些方向。
我有一个带有嵌入式UITableViewController的UIViewController。在Table View Controller上设置`automaticallyAdjustsScrollViewInsets`无效。
相反,我在嵌入我的Table View Controller的UIViewController上设置了`automaticallyAdjustsScrollViewInsets = NO`。这成功地消除了表视图上的填充。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接