使用大型游戏时,iOS 11滚动到顶部无法正常工作

时间:2018-05-31 13:14:18

标签: ios swift uinavigationbar statusbar large-title

当使用大型标题并点按状态栏以滚动到UIScrollViewUITableView的顶部(可能还有UICollectionView时,尚未对此进行测试)有点太远了。

我已在我的TableView启用了刷新功能,当点按状态栏时,它会显示为这样并保持这种状态直到我点按屏幕。

enter image description here

我在另一个ScrollView中有一个ViewController,如果我点击状态栏,它也会滚动太远,使导航栏太高。当我点击某处或滚动一点点时,这也会恢复正常。

正常: enter image description here

点击状态栏后: enter image description here

这也只有在我激活大型游戏时才会发生,使用普通游戏时一切正常。

任何想法如何解决这个问题?

如何重新制作:

  1. 使用导航控制器和内置UIViewController的{​​{1}}创建新项目。
  2. 将导航控制器设置为首选大型标题。半透明。在TableView
  3. 上设置标题
  4. UIViewController上设置约束以固定到TableView
  5. 的边缘
  6. ViewController
  7. 中为TableView创建插座
  8. 实施委托并设置多个行,例如100
  9. 启动应用
  10. 向下滚动,以便大标题成为正常标题
  11. 点按状态栏,以便ViewController滚动到顶部
  12. 现在标题不在它应该的位置,如果你现在向上或向下滚动一点点,它会快速回到正常位置。

    tableView代码:

    ViewController

5 个答案:

答案 0 :(得分:7)

好的,所以我找到了问题的原因,但没有找到如何解决这个问题。

如果您正在使用大型标题和UITableViewController,导航栏半透明设置为关闭,则会出现问题。 当你再次转回半透明时,问题就会消失。

如果您在普通的UIViewController中使用TableView,则总会出现问题。

修改

如果您使用的是半透明导航栏,则设置“extendedLayoutIncludesOpaqueBars = true”会解决问题!

类似的问题:UIRefreshControl() in iOS 11 Glitchy effect

答案 1 :(得分:1)

我已通过将滚动到顶部后将contentOffset设置为0来解决此问题。

func scrollViewShouldScrollToTop(_ scrollView: UIScrollView) -> Bool {
    return true
}

func scrollViewDidScrollToTop(_ scrollView: UIScrollView) {
    scrollView.contentOffset.y = 0.0
}

答案 2 :(得分:1)

我遇到了同样的问题。我在嵌入在UINavigationController中的UIViewController中有一个collectionview。 Collectionview具有到安全区域的前,后,上,下约束。

要解决此问题,您需要:

  1. 将collectionview的最高约束更改为受监管(不是安全区域)
  2. 在viewDidLoad方法中设置extendedLayoutIncludesOpaqueBars = true

答案 3 :(得分:0)

经过数小时的测试,我找到了一个可与UIViewController一起使用的解决方案。

在带有UITableView的UIViewController中,您应该:

  • 在viewDidLoad中设置extendedLayoutIncludesOpaqueBars = true
  • 在故事板pin tableView顶部约束中,常量为0的超级视图顶部(导航栏为半透明时,tableView将位于导航栏和状态栏下方)

此后,如果点击状态栏,则表视图将停在正确的位置。

enter image description here

答案 4 :(得分:0)

在您的ViewController中声明一个Bool类型的var didBeginScrollToTop。 将控制器分配为scrollView的委托。然后

func scrollViewShouldScrollToTop(_ scrollView: UIScrollView) -> Bool {
    didBeginScrollToTop = true
    return true
}

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    guard didBeginScrollToTop, scrollToTopGestureTargetView?.contentOffset.y ?? 0 < -25 else { return }

    scrollToTopGestureTargetView?.setContentOffset(.zero, animated: true)
}

func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
    didBeginScrollToTop = false
}

这是在弹跳时调整您的内容偏移量。该标志在那里捕获住scrollToTop手势,并在滚动时重置。您还可以在设置.zero偏移量后将其关闭。如果您有使用子级VC的实现,那么在覆盖这3个委托方法时不要忘记调用super。 现在,我的第一种方法是跟踪内容offSet <0的时间,但是在某些设备上,它没有扩展导航项,魔术-25似乎可以在所有模拟器上使用。您可以将此方法与返回导航栏大小并替换它的实现结合起来,但是据我所知,没有一种简单的方法可以如此轻松地获得导航栏框架/边界。

请注意,您可能还需要处理以下问题:Strange velocity prefers large title