gpt4 book ai didi

ios - UITapGestureRecognizer 在第一个选项卡中不起作用

转载 作者:行者123 更新时间:2023-12-01 18:16:11 30 4
gpt4 key购买 nike

这太奇怪了,我创建了一个新项目来测试我是否要疯了。

您可以在这里查看项目 https://github.com/ojfoggin/TapTest

我创建了一个带有 UITabBarController 的项目作为初始 View 。

第一个 Controller 选项卡有两个 UIimageViews。每个 ImageView 上都有一个 UItapGestureRecognizer,其操作仅记录“Tap 1”或“Tap 2”。

如果不使用 TabBarController,那么一切正常。但是,如果使用 TabBarController,则只有第一个点击识别器有效,第二个无效。

但是,如果您切换到不同的选项卡然后再返回,那么两个识别器都可以工作?!?!?

另外,我尝试在代码中添加 Tao 手势识别器,并且发生了完全相同的事情。

谁能解释为什么会发生这种情况以及如何解决?

最佳答案

TL;DR

打开您的 Storyboard文件作为源代码(xml)并替换

<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>


<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES/>

对于带有图像的 View Controller 。

解释

使用常见的调试工具很容易找到问题:
(lldb) po [[[[UIApplication sharedApplication] delegate] window] recursiveDescription]

节目
<UIWindow: 0x8c6a140; frame = (0 0; 320 480); autoresize = W+H; gestureRecognizers = <NSArray: 0x8c6a820>; layer = <UIWindowLayer: 0x8c66db0>>
| <UILayoutContainerView: 0x8c6a320; frame = (0 0; 320 480); transform = [0, -1, 1, 0, 0, 0]; autoresize = W+H; layer = <CALayer: 0x8c62350>>
| | <UITransitionView: 0x8c6a880; frame = (0 0; 480 320); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x8c50240>>
| | | <UIViewControllerWrapperView: 0x8c6cd70; frame = (0 0; 320 480); autoresize = RM+BM; layer = <CALayer: 0x8c6c840>>
| | | | <UIView: 0x8c51070; frame = (0 0; 480 271); clipsToBounds = YES; autoresize = RM+BM; autoresizesSubviews = NO; layer = <CALayer: 0x8c51d80>>
| | | | | <UIImageView: 0x8c6bdc0; frame = (20 0; 219 160); autoresize = W+H; gestureRecognizers = <NSArray: 0x8c65180>; layer = <CALayer: 0x8c4c930>>
| | | | | <UIImageView: 0x8c6a780; frame = (247 0; 219 160); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x8c62a70>; layer = <CALayer: 0x8c6a9a0>>
| | | | | <_UILayoutGuide: 0x8c6c340; frame = (0 0; 0 20); hidden = YES; layer = <CALayer: 0x8c51110>>
| | | | | <_UILayoutGuide: 0x8c6c760; frame = (0 271; 0 0); hidden = YES; layer = <CALayer: 0x8c6c7d0>>
| | <UITabBar: 0x8c64180; frame = (0 271; 480 49); autoresize = W+TM; layer = <CALayer: 0x8c642a0>>
| | | <_UITabBarBackgroundView: 0x8a48e50; frame = (0 0; 480 49); autoresize = W; userInteractionEnabled = NO; layer = <CALayer: 0x8a48f40>>
| | | <UITabBarButton: 0x8c64980; frame = (2 1; 236 48); opaque = NO; layer = <CALayer: 0x8c684c0>>
| | | | <UITabBarButtonLabel: 0x8c64dd0; frame = (108 35; 21 12); text = 'Item'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x8c64ef0>>
| | | <UITabBarButton: 0x8c69d90; frame = (242 1; 236 48); opaque = NO; layer = <CALayer: 0x8c6a250>>
| | | | <UITabBarButtonLabel: 0x8c69e70; frame = (108 35; 21 12); text = 'Item'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x8c68c20>>
| | | <UIImageView: 0x8a49240; frame = (0 -0.5; 480 0.5); autoresize = W; userInteractionEnabled = NO; layer = <CALayer: 0x8a492d0>>

重要的部分是:
<UILayoutContainerView: 0x8c6a320; frame = (0 0; 320 480); autoresize = W+H;
| | <UITransitionView: 0x8c6a880; frame = (0 0; 480 320);autoresize = W+H
| | | <UIViewControllerWrapperView: 0x8c6cd70; frame = (0 0; 320 480); autoresize = RM+BM;
| | | | <UIView: 0x8c51070; frame = (0 0; 480 271); autoresize = RM+BM

请注意 UIViewControllerWrapperView大小不好,因为它的自动调整大小掩码不是 W+H但是 RM+BM .然而,根本原因是 UIView 的自动调整大小掩码。因为 UIViewControllerWrapperView是动态生成的,并且仅复制掩码。

如果您检查 Storyboard 的源代码,您将看到这一行:
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>

对于第一个 View Controller 中的 View 。
将其替换为
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>

将解决问题。

关于ios - UITapGestureRecognizer 在第一个选项卡中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21782263/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com