Xcode&Swift – 在UIScrollView中检测UIView的用户触摸

我正在创build一个类似于“飞扬的鸟”的游戏,但是用户将手指放在屏幕上,避开障碍物,而不是轻拍飞鸟。

我正在做一个UIScrollView,其中UIView被用作障碍。 当用户触摸UIView时,游戏结束。

如何从UIScrollView中检测用户对UIView的触摸? 我正在用Xcode Beta 4使用Swift。

编辑:这是游戏的截图

这是游戏的截图

正如你所看到的,当用户向上滚动时,用户在灰色块(UIViews)之间移动手指。

通过将滚动视图的userInteractionEnabled设置为NO ,视图控制器将开始接收触摸事件,因为UIViewControllerUIResponder的子类。 您可以在视图控制器中重写以下一个或多个方法来响应这些触摸:

  • touchesBegan:withEvent:
  • touchesMoved:withEvent:
  • touchesEnded:withEvent:
  • touchesCancelled:withEvent:

我创build了一些示例代码来演示如何做到这一点:

 class ViewController: UIViewController { @IBOutlet weak var scrollView: UIScrollView! // This array keeps track of all obstacle views var obstacleViews : [UIView] = [] override func viewDidLoad() { super.viewDidLoad() // Create an obstacle view and add it to the scroll view for testing purposes let obstacleView = UIView(frame: CGRectMake(100,100,100,100)) obstacleView.backgroundColor = UIColor.redColor() scrollView.addSubview(obstacleView) // Add the obstacle view to the array obstacleViews += obstacleView } override func touchesBegan(touches: NSSet!, withEvent event: UIEvent!) { testTouches(touches) } override func touchesMoved(touches: NSSet!, withEvent event: UIEvent!) { testTouches(touches) } func testTouches(touches: NSSet!) { // Get the first touch and its location in this view controller's view coordinate system let touch = touches.allObjects[0] as UITouch let touchLocation = touch.locationInView(self.view) for obstacleView in obstacleViews { // Convert the location of the obstacle view to this view controller's view coordinate system let obstacleViewFrame = self.view.convertRect(obstacleView.frame, fromView: obstacleView.superview) // Check if the touch is inside the obstacle view if CGRectContainsPoint(obstacleViewFrame, touchLocation) { println("Game over!") } } } } 

您可以按照以下方式以编程方式添加手势识别器

 var touch = UITapGestureRecognizer(target:self, action:"action") scrollView.addGestureRecognizer(touch) 

但是,这个手势识别器不适合你。 UITapGestureRecognizer只会返回一个水龙头,而不是一个水龙头,UILongPressGestureRecognizer不会提供关于位置的信息,所以你想使用UIPanGestureRecognizer。 它不断告诉你触摸已经移动了多远。

 var touch = UIPanGestureRecognizer(target:self, action:"handlePan") scrollView.addGestureRecognizer(touch) @IBAction func handlePan(recognizer:UIPanGestureRecognizer) { let translation = recognizer.translationInView(self.view) recognizer.setTranslation(CGPointZero, inView: self.view) } 

你可以使用常量“平移”来移动你的物体,它代表了人物滑动手指的距离。 使用加上你的鸟的位置将鸟移动到一个新的点。 调用此函数后,必须将翻译重置为零。

编辑:用你的游戏的格式,这个代码应该是最好的方法。

所以,所有在一起,find你的手指位置的代码应该如下。

 override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { for touch: AnyObject in touches { let location = touch.locationInView(yourScrollView) } } @IBAction func handlePan(recognizer:UIPanGestureRecognizer) { let translation = recognizer.translationInView(self.view) var currentLocation : CGPoint = CGPointMake(location.x+translation.x, location.y+translation.y) recognizer.setTranslation(CGPointZero, inView: self.view) } 

currentLocation是一个包含当前触摸位置的CGPoint,无论手指滑动到何处。 由于我不知道如何创build要避免的视图,因此必须使用currentLocation的y坐标来确定要避免的视图的x边界,并使用<或>比较器来确定如果触摸的x边界在任何一个视图内。

注意:您必须声明位置,以便可以在handlePan中访问它

 var location : CGPoint = CGPointZero