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

2024-01-28

In 一款 iPhone 文字游戏 https://github.com/afarber/ios-newbie/tree/master/Scroll我有一个UIScrollView(保持UIImageView) 和 7 个可拖动自定义UIViews 最初放置在底部(并且在滚动视图之外):

在单曲中视图控制器.m https://github.com/afarber/ios-newbie/blob/master/Scroll/Scroll/ViewController.m我已经覆盖了viewDidLayoutSubviews这样它总是设置zoomScale滚动视图的 - 拥有UIImageView恰好填充屏幕宽度的 100%。

这对于纵向和横向模式都很有效。当应用程序刚刚启动时:

我的问题然而,当我第一次捏/缩放/双击滚动视图,然后移动七个Tile.m https://github.com/afarber/ios-newbie/blob/master/Scroll/Scroll/Tile.m views:

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

这会重置滚动视图的缩放 - 对于用户来说是出乎意料的。

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

是否可以预防viewDidLayoutSubviews当其子级时,父级的调用UIView是否被触摸/拖动?

UPDATE:

我已经移动了zoomScale设置代码来自viewDidLayoutSubviews to didRotateFromInterfaceOrientation滚动视图缩放现在可以了,但是它contentOffset被重置为{0,0},当(并非总是)我拖动一个图块时 - 即滚动视图突然跳转时,该应用程序无法使用。

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

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

viewDidLayoutSubviews每当系统在视图上执行布局时调用(layoutSubviews)。这样做的原因有很多;你可以子类化你的视图,实现一个空的layoutSubviews方法(不要忘记调用super实现!)并在那里放置一个断点以查看是谁导致了布局。您可能还想实施setNeedsLayout and layoutIfNeeded,并在那里放置断点以进行调查,因为这些断点会触发后续运行循环的布局。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在touchesBegan之后调用viewDidLayoutSubviews - 一次又一次 的相关文章

随机推荐