当使用大型标题并点按状态栏以滚动到UIScrollView
或UITableView
的顶部(可能还有UICollectionView
时,尚未对此进行测试)有点太远了。
我已在我的TableView
启用了刷新功能,当点按状态栏时,它会显示为这样并保持这种状态直到我点按屏幕。
我在另一个ScrollView
中有一个ViewController
,如果我点击状态栏,它也会滚动太远,使导航栏太高。当我点击某处或滚动一点点时,这也会恢复正常。
这也只有在我激活大型游戏时才会发生,使用普通游戏时一切正常。
任何想法如何解决这个问题?
如何重新制作:
UIViewController
的{{1}}创建新项目。TableView
UIViewController
上设置约束以固定到TableView
ViewController
TableView
创建插座
ViewController
滚动到顶部现在标题不在它应该的位置,如果你现在向上或向下滚动一点点,它会快速回到正常位置。
tableView
代码:
ViewController
答案 0 :(得分:7)
好的,所以我找到了问题的原因,但没有找到如何解决这个问题。
如果您正在使用大型标题和UITableViewController,导航栏半透明设置为关闭,则会出现问题。 当你再次转回半透明时,问题就会消失。
如果您在普通的UIViewController中使用TableView,则总会出现问题。
修改强>
如果您使用的是半透明导航栏,则设置“extendedLayoutIncludesOpaqueBars = true”会解决问题!
答案 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具有到安全区域的前,后,上,下约束。
要解决此问题,您需要:
答案 3 :(得分:0)
经过数小时的测试,我找到了一个可与UIViewController一起使用的解决方案。
在带有UITableView的UIViewController中,您应该:
此后,如果点击状态栏,则表视图将停在正确的位置。
答案 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