Bounds automatically changes on UIScrollView with content insets
我使用 UIScrollView 作为我的分页滚动视图,pagesScrollView。在其中,我放置了专门用于缩放的单个 UIScrollView。在其中的每一个中,我都有一个视图,它是应该可以缩放的页面项目。所有这些都在带有半透明导航栏的 UINavigationController 中。
我的 pagesScrollView 有 contentInset.top = 64 和 bounds.origin.y = -64 (这对我来说似乎很奇怪,但这是系统自动为我设置的),这很好用。我的屏幕看起来很棒!
但是,在我滚动 pagesScrollView 一点点之后,只要调用 scrollViewWillEndDragging,pagesScrollView 就会开始从 bounds.origin.y = -64 到 bounds.origin.y = 0 的动画变化,这会导致我的页面项目被遮挡通过导航栏。
左边是加载时的样子,右边是我拖动几个像素然后放开后的样子,它在导航栏下向上滑动(因为 bounds.origin.y 去了到 0).
问题是我没有任何代码可以改变边界,并且在各种滚动委托方法中也没有任何代码可以做任何事情。我添加了一堆滚动委托方法,并且刚刚添加了 NSLog(),这样我就可以确定更改发生的时间/地点,但它并没有在我的代码中的任何地方发生。
所以,我不知道我可以向您展示什么代码来帮助您帮助我。
编辑:我从头开始构建了一个新项目以删除所有其他变量。我将一个裸 UIViewController 放入 UINavigationController。我将一个 UIScrollView 放入我的视图中,整个视图的大小。以下代码是整个项目。
事实证明,问题(如下所述)仅在 UIScrollView 上启用 PAGING 时才会出现!什么? :)
It turns out the issue (described below) only appears once PAGING IS ENABLED on the UIScrollView! Wtf? :)
正如你所说,如果启用滚动分页,UIScrollView 将在拖动或任何移动后停止在分页边缘,这是框架Promise的。 Bounds.origin.y 设置为零意味着第一页边缘与滚动视图框架边缘匹配,因为那里有 64 个 contentInsets。所以这不是错误,就是这样。而且由于您的栏是半透明的,请记住滚动视图的框架边缘在哪里,它在栏下方。总而言之,我认为这不是错误,而是滚动分页的效果。
我已经检查了您在 viewController.m 文件中使用以下代码的示例
1
2 3 4 5 6 |
–(void)viewDidLoad
{ if ([[UIDevice currentDevice] systemVersion].floatValue>=7.0) { self.edgesForExtendedLayout = UIRectEdgeNone; } } |
一切正常……
- 它确实阻止了该错误的出现,但那是因为它禁用了 iOS7 ui 的核心功能。当 UI 扩展时,它也应该正常运行。
My pagesScrollView has contentInset.top = 64 and bounds.origin.y = -64 (that seems weird to me, but that’s what the system is setting automatically for me), and this works just fine. My screen looks great!
这是因为 iOS 7 在所有滚动视图上将 contentInset.top 设置为 64。
只需将这行代码添加到您的视图控制器中,一切都会按预期工作:
1
2 |
–(UIRectEdge)edgesForExtendedLayout {
return UIRectEdgeNone; |
}
我检查了你的示例项目。
- 感谢您的回复。不幸的是,这个答案只是避免了问题,而不是真正解决问题。当内容视图被缩放和平移时,理想情况下,内容应该位于导航栏下方,并以标准的 iOS7 方式显示。我可以使导航栏不透明并很好地避免该问题,但这并不是真正的理想。这实际上可能是一个 iOS 错误。
来源:https://www.codenong.com/23487269/