【问题标题】:Gesture not recognized (2 finger double tap) : Xcode 9.1手势无法识别(2 指双击):Xcode 9.1
【发布时间】:2017-11-23 22:43:53
【问题描述】:

问题:升级到更新的 Xcode 并支持 ios 11。 (我的应用不需要它,但 Apple 强制不再支持界面构建器文件 - 尝试将应用上传到应用商店时收到错误消息)。

代码看起来很简单(并非总是如此!)。 我创建了一个最小的示例并附上了它。 简单的单页应用程序。加载视图并识别一些手势。 所以单击手势有效。双击没有。 双击被识别为 2 次单击(可能是合理的)。 我删除了单击 getsure 并尝试触发 2 指 2 轻击手势的处理程序。 得不到认可。 两者都使用空 nib 文件为 ios5.x 工作。

这里是 appDelegate 文件:

#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end

实现:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds] ;
    self.appViewController = [[myViewController alloc] initWithNibName:nil bundle:nil];
    self.window.rootViewController = self.appViewController;
    //@property(nullable, nonatomic,strong) UIViewController *rootViewController NS_AVAILABLE_IOS(4_0);  // from "UIWindow"

    [self.window makeKeyAndVisible];
    self.window.backgroundColor = [UIColor redColor];

    return YES;
}

视图控制器:

@interface ViewController ()
@property (retain,readwrite) UITapGestureRecognizer       *twoFingerDoubleTap_yyz;
@property (retain,readwrite) UITapGestureRecognizer       *oneFinger;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    //add gesture Double tap to open a view.

    self.twoFingerDoubleTap_yyz = [[UITapGestureRecognizer alloc]initWithTarget:(id)self action:@selector ( twoFingerDoubleTap:) ];
    [self.view addGestureRecognizer:self.twoFingerDoubleTap_yyz];
    self.twoFingerDoubleTap_yyz.numberOfTapsRequired = 2;
    self.twoFingerDoubleTap_yyz.numberOfTouchesRequired = 2;

    /*
    self.oneFinger = [[UITapGestureRecognizer alloc]initWithTarget:(id)self action:@selector ( oneFingerTap:) ];
    [self.view addGestureRecognizer:self.oneFinger];
    self.oneFinger.numberOfTapsRequired = 1;
    self.oneFinger.numberOfTouchesRequired = 1;
*/
}


-(IBAction)twoFingerDoubleTap:        (UITapGestureRecognizer *) sender
{
    NSLog(@"i'm here 2 !");
}

-(IBAction)oneFingerTap:        (UITapGestureRecognizer *) sender
{
    NSLog(@"i'm here 1 !");
}

@end

代码看起来很简单,所以我想将问题归咎于Xcode(可能新9.1不识别双击?)或ios11。但由于我没有看到其他人有这个问题,我不得不认为我错过了一些东西——甚至可能很明显? (注意:我没有在真实设备上尝试过,因为目前我没有运行超过 ios7.x 的任何东西。我原来的 iPad 需要升级 - 终于!?)

更新:(从评论部分移到此处,因为它非常相关)两指单击也可以在测试中使用。只是不是两指双击!

【问题讨论】:

    标签: ios objective-c xcode


    【解决方案1】:

    经过进一步测试,我得出的结论是模拟器是罪魁祸首。通常要模拟 2 个手指,您按下选项键。以前的模拟器一切都按预期工作。在这个模拟器中,选项键的按住在第一次点击后“取消”。 在过去,我能够按住选项键并双击键盘。不适用于 Xcode 9.1。 解决方法:(更难做/使用)是尝试同时双击选项键和键盘。做起来难度很大,所以测试起来很不方便。 我已经提出了苹果错误报告,现在将使用此信息对其进行更新。错误号:#35671917 (有没有办法查看该网站上的错误(其他人),还是“只写”隐藏所有问题的网站?)

    进一步说明:我还确认在使用 ios9.3.5 的真实设备上运行时没有问题。手势都按预期被识别。

    更新:

    Apple 声称这是一个现有错误的副本,(尽管我们无法知道,因为它是一个绝密数据库,世界无法浏览(除了您自己的问题报告),但可以添加记录to)所以也许正在修复或者没有修复 - 他们不会泄露那种类型的信息。

    【讨论】:

    • 我在 Xcode 13.2.1 上还是同样的问题
    【解决方案2】:

    我刚刚测试了这段代码,如果你删除以下行:

    self.twoFingerDoubleTap_yyz.numberOfTouchesRequired = 2;
    

    这一切似乎都很好。

    【讨论】:

    • 但我确实想要一个 2 指双击。我也试过你说的,id对我不起作用!?嗯?更正 - 单指双击确实有效。但是,它是 2 指版本不起作用。
    • 它的工作原理是取出触摸次数但保持点击次数。
    • 是的,它也适用于 2 个手指 1 个水龙头。 - 也试过了。这消除了我对 xcode 无法识别双击的想法。
    • 在 appDelegate 中缺少一些代码。现在刚刚添加。我开始认为问题与以某种方式链接 UIResponder 有关?
    • Apple 已经承认了一个错误,但以他们通常的秘密/不承认错误的方式 - Apple 表示问题是“31829654 重复”。状态:打开。没有关于日期的进一步细节。无法查看错误描述或状态。 (那是 2017 年 12 月 4 日)
    【解决方案3】:

    点击和触摸是不同的。点击告诉点击次数(单,双等)。 Touches 表示每次点击的手指数。因此,您需要为每个抽头编号提供两个抽头手势识别器。您可以在 uiview 上添加任意数量的识别器

    【讨论】:

      【解决方案4】:

      我正在使用Swift 4,在Xcode 9.01 的模拟器(iPhone 8 Plus)和Xcode 9.2 的模拟器中,两指双击对我不起作用。我尝试了你的解决方法,但我无法让它工作(编辑:好吧,我终于让它工作了几次!)。将鼠标指针放在 ImageView 上并在我的 Macbook Pro 触控板上单击两次,单指双击即可正常工作。

      我正在使用 ImageView 来识别手势。感谢Ray Wenderlich 指出默认情况下ImageView 不允许用户交互——您必须打开属性检查器并检查User Interaction Enabled 手势才能工作。我已经向 ImageView 添加了手势,以便单指双击将显示下一个图像,而两指双击应该显示上一个图像。这是我的代码:

      class ViewController: UIViewController
      {
      
          let images = [
              "IMG_0306.jpg",
              "IMG_0319.jpg",
              "IMG_0293.jpg"
          ]
          var imageIndex = 0
      
          @IBOutlet weak var imageView: UIImageView!
      
          override func viewDidLoad() {
              super.viewDidLoad()
              // Do any additional setup after loading the view, typically from a nib.
      
              let tapRecognizer1 = UITapGestureRecognizer(target: self, action: #selector(handleTap))
              tapRecognizer1.numberOfTapsRequired = 2
              tapRecognizer1.numberOfTouchesRequired = 1  //number of fingers
              imageView.addGestureRecognizer(tapRecognizer1)
      
              ///
      
              let tapRecognizer2 = UITapGestureRecognizer(target: self, action: #selector(handleTap))
              tapRecognizer2.numberOfTapsRequired = 2
              tapRecognizer2.numberOfTouchesRequired = 2
              imageView.addGestureRecognizer(tapRecognizer2)
      
          }
      
      
          @objc func handleTap(_ sender: UITapGestureRecognizer) {
              print("in handle tap")
      
              if (sender.numberOfTouchesRequired == 1) {
                  print("\t -- number of fingers == 1")
      
                  imageIndex += 1
                  if imageIndex == images.count {
                      imageIndex = 0
                  }
              } else if sender.numberOfTouchesRequired == 2 {
                  print("\t -- number of fingers == 2")
      
                  imageIndex -= 1
                  if imageIndex == -1 {
                      imageIndex = images.count - 1
                  }
              }
      
              imageView.image = UIImage(named: images[imageIndex])
          }
      }
      

      在 Xcode 中,我看到这样的输出:

      in handle tap
           -- number of fingers == 1
      in handle tap
       -- number of fingers == 2   //It's hard to make this happen!
      

      在我的项目中,我有一个包含三张图片的文件夹:

      【讨论】:

      • 感谢您的评论。它似乎完全符合我的发现。我还学到了 UIView 和 UIImageView 不共享相同的交互默认值的艰难方式。在我提交问题之前,我刚刚回到那个版本以确认我确实为我的真实代码(而不是本网站的示例)设置了这个(正确) - 是的,我做到了。到目前为止,我还没有收到有关 Apple 数据库中错误状态的任何更新。 (我也不屏住呼吸......哈哈)
      猜你喜欢
      • 2021-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-13
      • 1970-01-01
      • 1970-01-01
      • 2016-12-26
      • 1970-01-01
      相关资源
      最近更新 更多