检测touchesMoved在不同的视图上而不是touchesBegan

时间:2015-06-15 07:21:52

标签: ios swift

我正在开发一个带有Swift的iOS应用,其中包含一个包含UIImageView元素网格的视图。基本上我想要做的是启用一种“拖动并突出显示多个元素”的能力,例如,用户可以通过触摸其中一个UIImageView元素而不抬起他/她的手指来开始,可以在一条线/对角线/等方面拖过其他人。

通过应用突出显示或其他一些“被选中”的指示,以这种方式“触摸/滑过”的每个UIImageView元素都会稍微改变。

想象我想要做的另一种方法是对单词搜索拼图进行成像,在那里我可以触摸特定字母,然后拖动多个字母以突出显示我认为我找到的单词。当我拖动每个字母(每个字母都是自己的View)时,它们会突出显示以显示我当前选定的字符组。

我尝试使用touchesMovedtouchesBegan来实现类似的功能,但这些功能似乎只适用于调用它们的原始View。如果我开始触摸一个View然后拖到另一个View touchesBegan/Moved,则永远不会被调用。

有更简单的方法吗?

1 个答案:

答案 0 :(得分:2)

TLDR:覆盖父级的touchesBegan / touchesMoved / touchesEnded,而不是子级。

执行此操作的一种方法是覆盖视图控制器上的touchesBegan / touchesMoved / touchesEnded回调。基本上检查触摸位置再次图像视图的帧。这样的事情应该这样做:

     import UIKit

     class ViewController: UIViewController {

     // this array holds the UIImageViews
     private var imageViews:[UIImageView] = []

     override func viewDidLoad() {
         super.viewDidLoad()
         // here i just created randomly placed image views
         for _ in 0...9 {
             // create random image views
             let iv = UIImageView(image: UIImage(named: "random-image"))
             // random positions
             iv.frame.origin.x = CGFloat(arc4random_uniform(200))
             iv.frame.origin.y = CGFloat(arc4random_uniform(400))
             // add to controller's view
             self.view.addSubview(iv)
             // store in array for later reference
             imageViews.append(iv)
         }
     }

     override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent)
     {
         self.highlightImageViews(touches)
         super.touchesBegan(touches, withEvent: event)
     }

     override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent){
         self.highlightImageViews(touches)
         super.touchesMoved(touches, withEvent: event)
     }

     override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent)
     {
         // do something with the highlighted image views in the imageViewsArray
         super.touchesEnded(touches, withEvent: event)
     }

     func highlightImageViews(touches: Set<NSObject>){
        if let touch = touches.first as? UITouch {
            for iv in imageViews {
                let point = touch.locationInView(self.view)
                if (CGRectContainsPoint(iv.frame, point)) {
                    iv.alpha = 0.5
                }
            }
        }
    }
}