Xcode&Swift – 在UIScrollView中检测UIView的用户触摸
我正在创build一个类似于“飞扬的鸟”的游戏,但是用户将手指放在屏幕上,避开障碍物,而不是轻拍飞鸟。
我正在做一个UIScrollView,其中UIView被用作障碍。 当用户触摸UIView时,游戏结束。
如何从UIScrollView中检测用户对UIView的触摸? 我正在用Xcode Beta 4使用Swift。
编辑:这是游戏的截图
正如你所看到的,当用户向上滚动时,用户在灰色块(UIViews)之间移动手指。
通过将滚动视图的userInteractionEnabled
设置为NO
,视图控制器将开始接收触摸事件,因为UIViewController
是UIResponder
的子类。 您可以在视图控制器中重写以下一个或多个方法来响应这些触摸:
- 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