【问题标题】:Restrict user to one finger touch on UIView to avoid frame issues限制用户用一根手指触摸 UIView 以避免框架问题
【发布时间】:2014-01-22 05:59:23
【问题描述】:

我知道有很多关于多指触摸和限制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];
    }
}

即使这样似乎也行不通。

EDIT-设置最大和最小触摸次数

我还将平移手势的最大和最小触摸次数也设置为 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];
            }
        }
    }
}

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

谁能帮我解决这个问题。

提前谢谢大家:)

【问题讨论】:

  • 您是否也将手势识别器的 minimumNumberOfTouches 和 maximumNumberOfTouches 设置为 1?
  • 是的也试过了@lukya

标签: iphone uiview multi-touch


【解决方案1】:

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

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

希望对大家有所帮助,谢谢:)

【讨论】:

    【解决方案2】:

    根据UIView Class Reference 中属性multipleTouchEnabled 的苹果文档

    multipleTouchEnabled

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

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

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

    【讨论】:

    • 我尝试设置独占触摸并在触摸开始或我正在处理平移触摸的地方为游戏视图禁用多点触摸,这两种方式都不起作用!!!
    猜你喜欢
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多