代码之家  ›  专栏  ›  技术社区  ›  John Wickham

UIViewController:ExtendedLayouting包括不透明条和滚动视图偏移

  •  5
  • John Wickham  · 技术社区  · 8 年前

    我的应用程序的视图层次结构非常简单:一个 UINavigationController UITableViewController . 导航控制器的导航栏不透明,这导致在导航转换期间表视图出现一些奇怪的插入行为,如下所示:

    Navigation Inset Issue

    为了解决这个问题,我正在设置 extendedLayoutIncludesOpaqueBars true 表格控制器 . 这样做可以适当地扩展导航栏下的视图,但会更改表视图的行为 contentOffset 在某种程度上我不太理解。将此属性设置为 真的 ,表视图的Y值 内容偏移量 报告其偏移量高于导航栏当前高度(即滚动表格视图1pt,报告其y偏移量为-63 pts)。

    这让我觉得导航控制器是在自动管理滚动视图的 contentInset scrollViewDidScroll() . 即使有 automaticallyAdjustsScrollViewInsets 设置为 false 在表视图控制器上,内容偏移不正确,因此似乎与插入无关。

    Apple's documentation about extendedLayoutIncludesOpaqueBars 没有提及对滚动视图内容偏移行为的任何影响。更改 内容插入

    我尝试更改表视图控制器的 edgesForExtendedLayout 属性来强制其扩展而不影响滚动视图,但该属性似乎对不透明条无能为力。

    有什么隐藏的行为吗 这会增加滚动视图的内容偏移量?或者这可能是一个bug?

    3 回复  |  直到 8 年前
        1
  •  4
  •   JoniVR    8 年前

    你试过这个吗?

    if #available(iOS 11, *) {
        tableView.contentInsetAdjustmentBehavior = .never
    }
    
        2
  •  4
  •   JoniVR    8 年前

    正如所指出的 @beebcon 之前,这确实是一个bug(苹果工程师在推特上确认),应该在iOS 11.2中修复。

    first tweet enter image description here

    (很抱歉,我使用了图片,但这种方式不会在推特消失的情况下消失)

        3
  •  3
  •   beebcon    8 年前

    正在发生的事情的背景 ---

    extendedLayoutIncludesOpaqueBars 本质上告诉您的视图的行为就像导航栏是半透明的一样。然后,视图的框架将从导航栏的顶部(下方)开始,而不是从导航栏的底部开始。

    在iOS中 10 ,您可以查询 contentInset 并查看 top = 64 插图。然而,在iOS 11中, 内容插入 严格来说,它适用于您控制的任何自定义插入--您应该使用 adjustedContentInset ,这是自定义插图和任何安全区域插图的总和。

    adjustedContentInset - 
    The insets derived from the content insets and the safe area of the scroll view.
    
    contentInset - 
    The custom distance that the content view is inset from the safe area or scroll view edges.
    

    所以实际上,y偏移-63是有意义的,如果你的条是半透明的,你会看到同样的结果。


    你正在谈论的问题 我认为这是一个bug(请参见 https://stackoverflow.com/a/46397291/2145198 ).

    虽然JoniVR的答案应该有效, 我在我的项目中解决了这个问题 通过设置 extendedLayoutIncludesOpaqueBars = true .

    尽管无论你用哪种方法解决它都可能没什么大不了的,但对我来说,扩展布局感觉更像是一种更好的练习,而不是改变布局 contentInsetAdjustmentBehavior . 将其设置为 never 具有更广泛的潜在影响;你告诉它永远不要关心安全区域,不管安全区域来自哪里。安全区域可能会发生变化(如旋转),或者如果控制器出现在不同的上下文/容器中(如选项卡栏或非选项卡栏)。

    推荐文章