旋转后 UITapGestureRecognizer 不会触发
Posted
技术标签:
【中文标题】旋转后 UITapGestureRecognizer 不会触发【英文标题】:UITapGestureRecognizer doesn't fire after rotate 【发布时间】:2013-11-18 11:03:08 【问题描述】:我有一个TabBarController
,它有两个标签。在每个选项卡中,我都有UICollectionView
和UITapGestureRecognizer
,每次点击collectionView
时都会触发。应用程序启动后一切正常。但是如果我旋转到横向,TapGestureRecognizer
只会在collectionView
的旧框架中触发。它绝对忽略了屏幕的右侧。
但是,如果我切换到另一个选项卡然后再返回,它也适用于横向。我只是不明白我做错了什么。
这就是我改变collectionView
的方向模式的方式:
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
[super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
[self.cardCollectionView.collectionViewLayout invalidateLayout];
【问题讨论】:
旋转后检查父视图的大小。 父视图的大小在旋转后是正确的,但识别器仍然只能在旋转前的框架中工作。在我切换到另一个选项卡并返回后,它立即开始正常工作。 我也有同样的问题。旋转后,如果设备为纵向,TapGestureRecognizer 将不起作用。如果设备是横向的,它就可以工作。 【参考方案1】:invalidateLayout 实际上不会使集合视图本身的布局无效,它会强制使内部单元格布局无效并重新计算 - doc
要处理集合视图框架更改,您必须像对待常规视图一样考虑它。尝试设置集合视图的自动调整大小掩码(例如在 viewDidLoad 中),例如:
self.cardCollectionView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
更新
尝试将您的收藏视图的自动调整大小设置为http://d.pr/i/nk3o,代码如下:
self.cardCollectionView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin|UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight|
;
UIViewAutoresizingFlexibleBottomMargin 重要的是说 UIKit 从哪里计算位置
【讨论】:
改变方向后,我看到collectionViewCelles 已经被淹没并填满了所有collectionView,但是tapRecognizer 没有触发。我已经尝试过您的解决方案,但它也不起作用。 尝试将您的collectionView 的backgroundColor 设置为[UIColor redColor] 之类的东西,看看collection view 的实际框架是什么——旋转后是否正确? 我做到了,集合视图的大小是正确的,但仍然有触发 tapGesture 的问题 如何添加手势?你删除 invalidateLayout 吗? 我通过界面添加手势。现在,UITapGestureRecognizer 的属性看起来像 this 并且我清除了我的方法willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
仍然可以正常旋转,但识别器在启动后无法正常工作,只有在我更改标签后。以上是关于旋转后 UITapGestureRecognizer 不会触发的主要内容,如果未能解决你的问题,请参考以下文章