【问题标题】:automaticallyAdjustsScrollViewInsets not working自动调整滚动视图插入不起作用
【发布时间】:2014-01-30 21:33:44
【问题描述】:

我创建了一个非常简单的演示应用程序来测试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 中的错误吗?如果没有,我做错了什么?

【问题讨论】:

    标签: ios objective-c ios7 uiscrollview uitabbar


    【解决方案1】:

    我刚刚用 iOS 11 和 swift 4 解决了这个问题,我目前的问题是 iOS11 有一个新属性可以在 ScrollView 确实存在时验证插入,该属性是 contentInsetAdjustmentBehavior,它是 ScrollView 的属性和默认属性是automatic 所以我的代码是:

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

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

    【讨论】:

    • 这里的myScroll 是什么?
    • 这将是一个简单的滚动视图或表格视图,集合视图...看看这个developer.apple.com/documentation/uikit/uiscrollview/…
    • 我只是想知道在 iOS 11 中 automaticallyAdjustsScrollViewInsets 发生了什么......谢谢!
    • 它刚刚被弃用,肯定是因为从自身而不是 ViewController 的属性来处理 Scroll 的行为更有意义
    【解决方案2】:

    我遇到了同样的问题,表格视图带有不需要的顶部填充。

    所有答案都说通过设置automaticallyAdjustsScrollViewInsets = NO 来修复,但这并没有消除我的填充。

    与此处的其他答案类似,如果您使用的是非标准视图层次结构,则需要稍微调整这些方向。

    我有一个带有嵌入式 UITableViewController 的 UIViewController。在 Table View Controller 上设置 automaticallyAdjustsScrollViewInsets 不起作用。

    相反,我在 parent UIViewController 上设置了 automaticallyAdjustsScrollViewInsets = NO,该 UIViewController 嵌入了我的 Table View Controller。这成功地消除了 Table View 上的填充。

    【讨论】:

      【解决方案3】:

      我认为 automaticallyAdjustsScrollViewInsets 仅在您的控制器 viewUIScrollView 时才有效(表视图就是其中之一)。

      你的问题似乎是你的控制器的view 是一个普通的UIView 而你的UITableView 只是一个子视图,所以你必须要么:

      • 将表格视图设为“根”视图。

      • 手动调整插图:

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

      编辑:

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

      到目前为止,当 UIScrollViewUIWebViewscrollView 是索引 0 处的子视图时,它适用于它们。

      无论如何,这可能会在未来的 iOS 版本中发生变化,因此您自己调整插图会更安全。

      【讨论】:

      • 我发现只有在 viewcontroller 的视图子视图的索引 0 处有滚动视图时它才有效
      • 现在刚刚确认。 UIWebView 的有趣之处在于滚动视图在视图层次结构中更深。
      • +1 表示索引 0 位;帮助我解决了未调整网络视图的问题。
      • 更重要的是,我发现如果您的视图层次结构中有多个滚动视图(即使目前只安装了一个),即使滚动视图是在子视图中的索引 0 处。它仅在我从情节提要中完全删除其他滚动视图时才起作用。所以这个属性对我来说是一团糟......
      • 在 iOS 11 上,您可以在父级(标签栏控制器)上设置additionalSafeAreaInsets,而不是插入每个子控制器的滚动视图,所有子级都会继承它
      【解决方案4】:

      您的视图控制器必须直接位于 UINavigaitonController 的堆栈上,automaticallyAdjustsScrollViewInsets 才能工作(即不是子视图控制器)

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

      self.parentViewController.automaticallyAdjustsScrollViewInsets = NO;
      

      【讨论】:

      • 这个答案对我有帮助。在我的例子中,管理表视图的视图控制器是使用addChildViewController 添加到其父级的。在孩子身上设置self.automaticallyAdjustsScrollViewInsets = NO; 是不够的。您也必须在父级上设置它,因为它似乎递归地向下钻取并定位所有滚动视图以自动设置其插图。
      【解决方案5】:

      我有这个层次结构:

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

      2. 自定义 tabbarcontroller 包含多个控制器

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

      我必须将 AutomaticAdjustsScrollViewInsets 设置为 NO

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

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

      【讨论】:

      • 我也对一个简单的 UITextView 有奇怪的行为。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-25
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 2017-07-09
      • 1970-01-01
      相关资源
      最近更新 更多