我正在开发一个带有Swift的iOS应用,其中包含一个包含UIImageView
元素网格的视图。基本上我想要做的是启用一种“拖动并突出显示多个元素”的能力,例如,用户可以通过触摸其中一个UIImageView
元素而不抬起他/她的手指来开始,可以在一条线/对角线/等方面拖过其他人。
通过应用突出显示或其他一些“被选中”的指示,以这种方式“触摸/滑过”的每个UIImageView
元素都会稍微改变。
想象我想要做的另一种方法是对单词搜索拼图进行成像,在那里我可以触摸特定字母,然后拖动多个字母以突出显示我认为我找到的单词。当我拖动每个字母(每个字母都是自己的View
)时,它们会突出显示以显示我当前选定的字符组。
我尝试使用touchesMoved
和touchesBegan
来实现类似的功能,但这些功能似乎只适用于调用它们的原始View
。如果我开始触摸一个View
然后拖到另一个View
touchesBegan/Moved
,则永远不会被调用。
有更简单的方法吗?
答案 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
}
}
}
}
}