Bounds automatically changes on UIScrollView with content insets
我使用 UIScrollView 作为我的分页滚动视图,
我的
但是,在我滚动
左边是加载时的样子,右边是我拖动几个像素然后放开后的样子,它在导航栏下向上滑动(因为 bounds.origin.y 去了到 0).
问题是我没有任何代码可以改变边界,并且在各种滚动委托方法中也没有任何代码可以做任何事情。我添加了一堆滚动委托方法,并且刚刚添加了 NSLog(),这样我就可以确定更改发生的时间/地点,但它并没有在我的代码中的任何地方发生。
所以,我不知道我可以向您展示什么代码来帮助您帮助我。
编辑:我从头开始构建了一个新项目以删除所有其他变量。我将一个裸 UIViewController 放入 UINavigationController。我将一个 UIScrollView 放入我的视图中,整个视图的大小。以下代码是整个项目。
事实证明,问题(如下所述)仅在 UIScrollView 上启用 PAGING 时才会出现!什么? :)
这里是下载一个基本项目的链接,它只有几行代码来演示这个问题。只需单击滚动视图,您就会看到它随着边界的变化而向上移动。 http://inadaydevelopment.com/stackoverflow/WeirdScrollViews.zip
如何在滚动视图上启用分页,而不会在滚动和移动导航栏下的所有内容时出现边界问题?
可以将导航栏设置为不透明并避免问题,但理想的情况是具有标准的 iOS7 行为,以便在内容视图缩放后,然后允许内容位于导航栏下方,并应通过半透明正常。
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
– (void) viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; NSArray *colors = @[ NSArray *zoomerColors = @[ self.scroller.pagingEnabled = YES; [self.scroller setContentSize:CGSizeMake(self.scroller.frame.size.width*colors.count, self.scroller.frame.size.height)]; CGRect subviewFrame = CGRectMake(0, 0, 160, 240); UIView *subview = [[UIView alloc] initWithFrame:subviewFrame]; CGRect zoomerFrame = CGRectMake(index*self.scroller.frame.size.width, 0, self.scroller.frame.size.width, self.scroller.frame.size.height); UIScrollView *zoomer = [[UIScrollView alloc] initWithFrame:zoomerFrame]; [self.scroller addSubview:zoomer]; } |
只需关闭调整滚动视图插图
这是一个 iOS 错误。我创建了
1
2 3 4 5 6 7 8 9 10 |
@implementation CSScrollView
– (void)setContentOffset:(CGPoint)contentOffset @end |
(并更改了故事板中的视图类)
当你松开手指时,一个名为
作为概念验证黑客,我将代码更改为:
1
2 3 4 5 6 7 8 9 |
@implementation CSScrollView
– (void)setContentOffset:(CGPoint)contentOffset @end |
不出所料,问题就消失了。
您可能不想对
- 这是一个 iOS 错误;
-
通过使用
– setContentOffset: 的适当自定义实现的UIScrollView 子类拒绝无意义的值来解决此问题。
一种合理的通用方法可能是检查
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; } } |
一切正常……
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; |
}
我检查了你的示例项目。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/268657.html