限制用户在UIView上用手指触摸以避免帧问题

时间:2014-01-22 05:59:23

标签: iphone uiview multi-touch

我知道有很多关于多指触摸和限制herethere的问题,但是它们似乎都不起作用。他们建议的是尝试设置独占触摸并禁用多点触控,即:

[self.view.subviews makeObjectsPerformSelector:@selector(setExclusiveTouch:) withObject:[NSNumber numberWithBool:YES]];
[self.view setMultipleTouchEnabled:NO];

注意: Initially when I used self.view.exclusiveTouch = NO; ,it didn't work for me.Mr.Hlung's comment in the 1st link provided some useful info of enabling the subviews exclusive touch through selector.

但它们似乎工作不完整。我有一个游戏视图,左边有多个图像,右边有相应的图像。用户必须将左图拖到相应的右图并匹配它。我正在使用UIPanGestureRecognizer这样做。这是一个场景,这是我办公室的测试人员进行一些皮疹测试的结果:)

当用户对图像进行加扰时,即用他/她的几个手指笨拙地玩,发生的是帧被扰乱或者几个图像彼此重叠。这都是因为有些用户仍然可以使用多个触摸。因此我想要消除该功能。我是还知道有一个名为-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event的方法,我们可以通过它检测用户触摸的数量。如果计数大于1,我删除所有用户触摸,即如果检测到超过1个手指触摸!!!

但我发现没有办法去除那里的触摸,我也尝试将最后一个触摸对象分配给我的图像视图,我认为通过该图像视图会忽略检测到的其余触摸,即:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    if ([event allTouches].count>1)
    {
        UITouch *touch = [[touches allObjects] lastObject];
        self.dragObjectImageView = (UIImageView *)[touch view];
    }
}

即使这似乎也不起作用。

编辑 - 设置最大和最小触摸次数

我还将摇摄手势的最大值和最小触摸次数设置为1,即:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.view.subviews makeObjectsPerformSelector:@selector(setExclusiveTouch:) withObject:[NSNumber numberWithBool:YES]];

       for(UIImageView *iView in self.movableArray){
           if ([iView isMemberOfClass:[UIImageView class]]){
                UIPanGestureRecognizer * recognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
                recognizer.minimumNumberOfTouches = 1;
                recognizer.maximumNumberOfTouches = 1;
                iView.multipleTouchEnabled = NO;
                [iView addGestureRecognizer:recognizer];
                [iView setUserInteractionEnabled:YES];
                recognizer.delegate = self;
            }
        }
}

尝试了另一种在检测到多次触摸时禁用图像用户交互的策略,但徒劳无功!

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    if ([event allTouches].count > 1)
    {
        for (UIView* view in self.view.subviews)
        {
            if ([view isKindOfClass:[UIImageView class]])
            {
                [view setUserInteractionEnabled:NO];
            }
        }
    }
    else
    {
        for (UIView* view in self.view.subviews)
        {
            if ([view isKindOfClass:[UIImageView class]])
            {
                [view setUserInteractionEnabled:YES];
            }
        }
    }
}

有些人可能会说用户不会使用多个手指来玩。但我被要求解决问题,开发人员也必须遵守并尊重测试人员的观点。

有人可以帮我摆脱这个问题。

提前感谢每一位:)

2 个答案:

答案 0 :(得分:1)

不是为我们自己的视图设置独占触摸,而是为子视图或我们分配给self.view的视图打开相同的工作,在我的情况下它是......

[gameView.subviews makeObjectsPerformSelector:@selector(setExclusiveTouch:) withObject:[NSNumber numberWithBool:YES]];

希望它有所帮助,谢谢:)

答案 1 :(得分:0)

根据UIView Class Reference

中属性multipleTouchEnabled的Apple文档
  

<强> multipleTouchEnabled

     

同一窗口中的其他视图仍然可以在接收时触摸事件   这个属性是NO。如果您希望此视图处理多点触控   事件独占,设置此属性和值的值   exclusiveTouch属性为YES。

我在您的代码中看到,您已将setExclusiveTouch设置为所有子视图,但setMultipleTouchEnabled仅针对容器视图而非所有图像视图。在设置独占触摸之前/之后添加以下行,单触可能正常工作。

[self.view.subviews makeObjectsPerformSelector:@selector(setMultipleTouchEnabled:) withObject:[NSNumber numberWithBool:NO]];