UIScrollView:内部视图不合适,奇怪的行为,视图在触摸时重新恢复

Posted

技术标签:

【中文标题】UIScrollView:内部视图不合适,奇怪的行为,视图在触摸时重新恢复【英文标题】:UIScrollView: View inside don't fit properly, weird behaviour, view snaps back on touch 【发布时间】:2015-11-28 01:26:38 【问题描述】:

我在使用 UIScrollView 时遇到问题...我进行了很多研究并发现了相似的案例,但解决方案似乎从未奏效,所以这里有一点解释(很难解释)

我有一个包含 UIScrollView 的视图控制器,我在该 uiscrollview 中加载了几个视图控制器...我将它们初始化,然后像这样将它们添加到 scrollView...

viewController1.view.frame = scrollView1.bounds
var frame0 = viewController1.view.frame
frame0.origin.x = 0
viewController1.view.frame = frame0

self.addChildViewController(viewController1)
self.scrollView1.addSubview(viewController1.view)
viewController1.didMoveToParentViewController(self)

viewController2.view.frame = scrollView1.bounds
var frame01 = viewController2.view.frame
frame01.origin.x = self.view.frame.size.width
viewController2.view.frame = frame01

self.addChildViewController(viewController2)
self.scrollView1.addSubview(viewController2.view)
viewController2.didMoveToParentViewController(self)

...

之后我将滚动视图配置如下

self.scrollView1.contentSize  = CGSizeMake(self.view.frame.width * 5, self.view.frame.height)
scrollView1.delaysContentTouches = false

乘以 5,因为有 5 个 ViewControllers

(滚动视图已启用分页)

现在这种方法效果很好,所有视图都加载到滚动视图中,我可以在视图中滑动,但问题就在这里。 我的第一个视图加载正常,然后当我向右滑动时,我看到第二个视图偏移到顶部并且它的一部分被隐藏了,然后当我触摸视图内的一个按钮时,它突然捕捉到它的底部地方...这真的很烦人,因为它使用户界面真的很烦人,因为它的一部分被隐藏了...

我已经做了一个说明:http://imgur.com/xHRwXt4

我尝试了很多设置,比如设置

self.automaticallyAdjustsScrollViewInsets = false

self.scrollView1.clipsToBounds = true

但仍然会出现同样的问题。我还认为这是我的导航栏,因为包含滚动视图的视图位于具有导航栏的 ViewController 内(来自 uinavigationcontroller)

因此出于测试目的,我在没有导航控制器和栏的情况下尝试了它,但仍然出现了同样的问题。这真的很令人沮丧,我似乎找不到解决方案。

但是我不得不说当滚动视图位于带有导航栏的 ViewController 内时,我设置了

self.scrollView1.contentSize  = CGSizeMake(self.view.frame.width * 5, self.view.frame.height - 66) 

(注意 -66) 然后没有发生捕捉问题,但这不是我想要的效果,因为滚动视图需要填满整个视图,而且 UIScrollView 内部的视图也不是完全可见的,所以这不是解决方案要么。

我还教过这可能是因为我在加载的一个视图控制器上设置了不同的约束,所以我尝试了几次启动相同类型的视图控制器,但还是出现了同样的问题......

(所以我尝试了很多,但无论我尝试做什么,它都会变得更糟,或者每个视图向任一方向移动都会出现另一个问题,然后我添加 self.automaticallyAdjustsScrollViewInsets = false 但随后捕捉返回等等等等)

希望有人有一些建议来解决这个问题 (如果我需要更多插图等,我也会提供这些。)

谢谢

【问题讨论】:

参考上面的代码,添加purchaseAmountViewController的目的是什么? 这是一个错误也必须是 ViewController1 我将我的代码更改为 ViewController1 等,以便更清楚可能忘记更改那个谢谢!我会改正的。 【参考方案1】:

从表面上看,有 2 件事可以尝试:

    某些子视图控制器可能包含滚动视图,并且除了父视图控制器之外,还需要设置它们的 automaticAdjustsScrollViewInsets = false 一个非常有用的查找方法是打开视图调试。运行项目,然后转到 Xcode > View Debugging > Show View Frames。查看子视图控制器的子视图是否沿顶部未对齐。如果它们正确对齐(顶部全部刷新),则意味着问题出在各个子视图中。

【讨论】:

谢谢,我一定会尝试第二点。我知道其中没有任何滚动视图...

以上是关于UIScrollView:内部视图不合适,奇怪的行为,视图在触摸时重新恢复的主要内容,如果未能解决你的问题,请参考以下文章

ios - UIScrollView中的iOS编程缩放不起作用

iOS - UICollectionViewCell 内的 UIScrollView - 内部视图的动画不正确(延迟)

UIScrollView 行为奇怪

子类化 UIScrollView 时的奇怪行为

使用 UIScrollView 旋转后出现奇怪的行为

UIScrollView 内的行选择 UITableView 的问题