viewDidLayoutSubviews在touchesBegan之后调用 - 一次又一次

时间:2014-03-06 22:15:26

标签: ios iphone uiscrollview uiimageview touchesbegan

an iPhone word game我有一个UIScrollView(持有UIImageView)和7个可拖动的自定义UIView,最初位于底部(在滚动视图外):

app screenshot

在我已覆盖viewDidLayoutSubviews的单ViewController.m内,以便始终设置滚动视图的zoomScale - 让UIImageView完全填满屏幕的100%宽度。

这适用于纵向和横向模式。当应用程序刚刚启动时:

portrait

landscape

我的问题是,当我第一次捏合/缩放/双击滚动视图然后移动七个Tile.m视图中的一个时:

viewDidLayoutSubviews之后突然(不是每次)touchesBegan被调用。

这会重置滚动视图的缩放 - 意外地为用户。

我的问题是否有任何方法可以禁用此行为?

当触摸/拖动其子viewDidLayoutSubviews时,是否可以阻止父级UIView调用?

更新

我已将zoomScale设置代码从viewDidLayoutSubviews移至didRotateFromInterfaceOrientation,滚动视图缩放现在可以正常,但其contentOffset重置为{0,0} ,当(并非总是)我拖动Tile时 - 即滚动视图突然跳跃,应用程序无法使用。

将以下内容添加到viewDidLoad并没有帮助:

if ([self respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)])
   self.automaticallyAdjustsScrollViewInsets = NO;

1 个答案:

答案 0 :(得分:10)

只要系统在视图(viewDidLayoutSubviews)上执行布局,就会调用

layoutSubviews。出于多种原因可以称之为;您可以对视图进行子类化,实现一个空的layoutSubviews方法(不要忘记调用super实现!)并在那里放置断点以查看导致布局的原因。您可能还想实现setNeedsLayoutlayoutIfNeeded,并在那里设置断点以供调查,因为这些触发布局会在后续runloops上进行。

但是你永远无法阻止布局。系统会在您无法控制的许多场合执行布局。例如,如果用户拨打电话,则存在手机应用并返回到您的应用;由于窗口的边界和框架已更改,因此会触发布局。通话结束;再次触发布局,因为现在窗口已恢复到之前的大小。

您应该负责确定何时设置缩放比例。例如,如果用户启动手势,即使执行了布局,也应该发信号通知您的代码不执行更改。