2016-02-20 64 views
0

在我目前的項目中,我正在使用UITapGestureRecognizer。我已經對它進行了編碼,以便當屏幕的左側被輕敲時,一個對象會移動,並且當輕擊屏幕的右側時,另一個對象會移動。但是,手勢識別器僅在右側輕敲時才起作用。另外,我想這樣做,以便SKActions可以執行,如果雙方同時攻擊。我不明白我做錯了什麼。我的代碼如下。在此先感謝UITapGestureRecognizer將無法正常執行

在viewDidLoad中

UITapGestureRecognizer *tap1 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap1:)]; 

[tap1 setNumberOfTapsRequired:1]; 
[self.view addGestureRecognizer:tap1]; 


view.multipleTouchEnabled = YES; 





    -(void)tap1:(UIGestureRecognizer *)gestureRecognizer { 


SKNode *person11 = [self childNodeWithName:@"person1"]; 
SKNode *person2 = [self childNodeWithName:@"person2"]; 

CGPoint pt = [gestureRecognizer locationInView:self.view]; 





if (pt.x > (self.view.bounds.size.width/2)) 
{ 
    if (person2.position.x == CGRectGetMidX(self.frame) + 400) { 
     SKAction *moveLeft2 = [SKAction moveTo:CGPointMake(CGRectGetMidX(self.frame) + 90, CGRectGetMidY(self.frame) + 200) duration:0.1f]; 
     [person2 runAction:moveLeft2]; 
    } 
    if (person2.position.x == CGRectGetMidX(self.frame) + 90) { 
     SKAction *moveRight2 = [SKAction moveTo:CGPointMake(CGRectGetMidX(self.frame) + 400, CGRectGetMidY(self.frame) + 200) duration:0.1f]; 
     [person2 runAction:moveRight2]; 
    } 
} 
    if (pt.x < (self.view.bounds.size.width/2)){ 
    if (person11.position.x == CGRectGetMidX(self.frame) - 90) { 
     SKAction *moveLeft2 = [SKAction moveTo:CGPointMake(CGRectGetMidX(self.frame) - 400, CGRectGetMidY(self.frame) + 200) duration:0.1f]; 
     [person11 runAction:moveLeft2]; 
    } 
    if (person11.position.x == CGRectGetMidX(self.frame) - 400) { 
     SKAction *moveRight2 = [SKAction moveTo:CGPointMake(CGRectGetMidX(self.frame) - 90, CGRectGetMidY(self.frame) + 200) duration:0.1f]; 
     [person11 runAction:moveRight2]; 
    } 

} 
} 

回答

1

取代手勢識別器,在touchesEnded中執行該工作。這裏有一個例子:

斯威夫特

override func viewDidLoad() { 
     super.viewDidLoad() 
     self.view.multipleTouchEnabled = true 
} 

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    for touch in touches { 
     if(touch.locationInView(self.view).x<self.view.frame.midX) { 
      print("On the left half") // run the respective SKAction 
     } else { 
      print("On the right half") // run the respective SKAction 
     } 
    } 
} 

目標C(應該工作,但是我用斯威夫特和翻譯我的手機上,所以這可能並不完美)

-(void)viewDidLoad { 
    self.view.multipleTouchEnabled = YES 
} 

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { 
    for (UITouch* touch in touches) { 
     if(touch.locationInView(self.view).x<self.view.frame.midX) { 
      printf("On the left half\n"); // run the respective SKAction 
     } else { 
      printf("On the right half\n"); // run the respective SKAction 
     } 
    } 
} 

這將做到你想要的。

漂亮的自我解釋:允許多次觸摸,然後,當觸摸被釋放時,它檢查其在視圖中的相對水平位置(.x),並查看它是否在視圖的左半部分或右半部分。不需要手勢識別器!

我會盡量在後面仔細檢查Objective C代碼,但Swift絕對有效。

如果您有任何問題,請告訴我!

+0

謝謝你的幫助,該方法的作品。無論使用什麼方法,Person1都不會被識別。 SKAction不影響person1。我不知道這是爲什麼,你知道我可能做錯了什麼? – d33

+0

@ d33,你是否嘗試過調試(打印到控制檯以查看代碼是否執行)。 – Dopapp

0

嘗試把這個(斯威夫特):

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool { 
     return true 
    } 

對不起,我用斯威夫特經常...我想你可以簡單地找到一個內置也在Objective-C上使用gestureRecognizer()。