【问题标题】:Help with touchesMoved when dragging fingers拖动手指时的 touchesMoved 帮助
【发布时间】:2011-04-30 09:19:53
【问题描述】:

我正在几个 UIButton 上实现 touchesMoved、touchesBegan 和 touchesEnded,以便我可以将手指滑过它们并让它们调用适当的操作。

它似乎几乎按预期工作,但是,如果我将两个手指按在两个按钮的框架之外,然后同时将它们滑入按钮的框架中,则 touchesMoved 中的函数会被多次调用。相反,它应该只在按钮的框架中调用每个按钮的函数一次。

下面是我的代码。

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

{

for(UITouch *t in touches) {

CGPoint location = [t locationInView:t.view];

if(CGRectContainsPoint(Button1.frame, location)) 
{
    if (!Button1.isHighlighted){
        if(!button1Highlighted) {
            [self doAction1];
        }
        [Button1 setHighlighted:YES];
        button1Highlighted = YES;
    }
}
else {
    [Button1 setHighlighted:NO];
    button1Highlighted = NO;
}
if(CGRectContainsPoint(Button2.frame, location)) 
{
    if (!Button2.isHighlighted){
        if(!button2Highlighted) {
            [self doAction2];
        }
        [Button2 setHighlighted:YES];
        button2Highlighted = YES;
    }
}
else {
    [Button2 setHighlighted:NO];
    button2Highlighted = NO;
}

}

}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

for(UITouch *t in touches) {

    CGPoint location = [t locationInView:t.view];

    if(CGRectContainsPoint(Button1.frame, location)) 
    {
        [Button1 setHighlighted:YES];
        button1Highlighted = YES;
        [self doAction1];
    }
    if(CGRectContainsPoint(Button2.frame, location)) 
    {
        [Button2 setHighlighted:YES];
        button2Highlighted = YES;
        [self doAction2];
    }
}

}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

for(UITouch *t in touches) {

    CGPoint location = [t locationInView:t.view];

    if(CGRectContainsPoint(Button1.frame, location)) 
    {
        [Button1 setHighlighted:NO];
        button1Highlighted = NO;
    }
    if(CGRectContainsPoint(Button2.frame, location)) 
    {
        [Button2 setHighlighted:NO];
        Button2Highlighted = NO;
            }
}

}

非常感谢任何帮助。谢谢!

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

    如果 -touchesMoved: 被多次触摸调用,这样在 Button1 上有一个触摸,在 Button2 上有另一个触摸,并且两个按钮都没有突出显示,那么 Button1 上的触摸将突出显示 Button1 并且 取消突出显示 Button2。同时,在同一个循环中对 -touchesMoved: 的同一个调用中,对 Button2 的触摸实际上会将 Button1 的高亮状态重置为未高亮。

    -touchesMoved:只要有触摸就会被调用,每次调用都会再次循环两个按钮。

    也许您需要为您的按钮添加一个“hasBeenHighlighted”属性。我不确定如何最好地将所有按钮的此属性初始化为 NO。但需要在 -setHighlighted: 内将其设置为 YES,并且需要在调用 -doActionX 之前对其进行检查

    我不确定我是否完全理解您想要实现的目标,但我希望这对您有所帮助。

    【讨论】:

    • 这是有道理的。我创建了一个 BOOL button1hasbeenHighlighted,并按照您所说的做了,但是当两个手指同时在按钮内移动时,它仍然存在同样的问题。还有其他建议吗?
    • 好吧,-touchesMoved:应该被调用很多次。问题是 doAction1 和 doAction2 被重复调用,对吗?您可能希望在 -touchesBegan:、-touchesMoved: 和 -touchedEnded: 的入口处添加一些 NSLog() 行。此外,在 doActionX 方法中。如果您在每次对 touchesMoved 的调用中都看到对 doActionX 的调用,那么这就是问题所在。没有看到代码,很难知道我是否理解问题。
    • 嘿 westsider,对 doActionX 的调用绝对是问题所在。我只是不确定如何解决它。我已经更新了上面的代码。我真的很感谢你为我调查这个。谢谢。
    • 尝试删除 button1Highlighted = NO;和 button2Highlighted = NO;来自-touchesMoved:。这有什么区别吗?
    • 这似乎已经解决了两个手指导致 doActionX 被触发这么多的问题。但是,现在它只允许我以一种方式将手指滑过这两个按钮,但如果我在不抬起手指的情况下滑过两个按钮,它就不会再次触发动作。
    【解决方案2】:

    我最终通过将屏幕上的触摸次数存储在一个名为 touchesCount 的变量中来使其工作。然后我在 touchesBegan 中增加它,并在 touchesEnded 中减少它。然后在调用doActionX之前的touchesMoved中,我检查以确保touchesCount

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-23
      • 1970-01-01
      • 1970-01-01
      • 2014-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多