2014-03-06 24 views
3

an iPhone word game我有一个UIScrollView(保持UIImageView)和7可拖动定制UIView小号最初放置在底部(和外滚动视图):viewDidLayoutSubviews的touchesBegan之后调用 - 一次又一次

app screenshot

在单个ViewController.m我已覆盖viewDidLayoutSubviews,以便始终设置滚动视图的zoomScale - 使UIImageView正好填充屏幕宽度的100%。

这种效果很好 - 适用于纵向和横向模式。当应用程序刚刚开始:

portrait

landscape

但是我的问题是,当我第一次捏/缩放/双击滚动视图,然后移动七Tile.m之一意见:

突然(并非每次)viewDidLayoutSubviews之后调用touchesBegan

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

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

是否有可能阻止viewDidLayoutSubviews父母的调用,当其子UIView被触摸/拖动?

UPDATE:

我搬到从viewDidLayoutSubviewszoomScale设置代码didRotateFromInterfaceOrientation和滚动视图缩放现在是好的,但其contentOffset重置为{0,0},当(并不总是)我拖砖 - 即滚动视图突然跳跃,应用程序无法使用。

加入以下viewDidLoad并没有帮助:

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

回答

10

viewDidLayoutSubviews称为每当系统对图(layoutSubviews)布局。这可以被称为多种原因;你可以继承你的视图,实现一个空的layoutSubviews方法(不要忘记调用super实现!)并在那里放置一个断点来查看谁引起了布局。您可能还需要执行setNeedsLayoutlayoutIfNeeded,并在此处放置断点以供您调查,因为这些触发器会在后续跳转循环中触发布局。

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

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

+0

+1谢谢。我已经将'zoomScale'设置代码移动到'didRotateFromInterfaceOrientation'并且滚动视图缩放现在可以,但是当(不是总是)我拖动一个Tile时,'contentOffset'重置为'{0,0}' - 即滚动视图突然跳跃,应用程序无法使用。 –

+1

@AlexanderFarber为scrollview创建子类并查看谁将其设置为{0,0}。我甚至不得不锁定我的滚动视图以忽略来自不需要的系统决策的滚动。但是你必须弄清楚谁在做这件事。 –

+1

@AlexanderFarber那是什么造成了它? –