旋转后 UITapGestureRecognizer 不会触发

Posted

技术标签:

【中文标题】旋转后 UITapGestureRecognizer 不会触发【英文标题】:UITapGestureRecognizer doesn't fire after rotate 【发布时间】:2013-11-18 11:03:08 【问题描述】:

我有一个TabBarController,它有两个标签。在每个选项卡中,我都有UICollectionViewUITapGestureRecognizer,每次点击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 不会触发的主要内容,如果未能解决你的问题,请参考以下文章

屏幕旋转后获取自动旋转 UIView 的尺寸?

手机重启后软件不能旋转了是啥原因?

旋转 UIView 并在旋转后保持纵横比

旋转更改后 UINavigationBar 消失

拉达旋转动画在 stop() 后保持旋转一秒钟

旋转后图像变质