[英]How recognize which UIImageview I've tapped?
我想實現一種可通過觸摸編輯的矩陣。 一系列黑色或白色單元格,如果輕按開關可形成黑色或相反。 為此,我將使用排列在堆棧視圖中的UIImageView輕擊手勢識別器。 但是我怎么知道哪個UIImageView被點擊了呢? 我可以通過哪種方式在UIImageView中更改UIImage?
如果他們只是白色和黑色,這將是更易於使用一個UIView
,並設置其backgroundColor
來.white
或.black
。 您可以使用UIView
的tag
屬性來識別它們。
在你gestureRecognizer處理程序,則recognizer.view
告訴你的view
是觸發了該姿勢。
您可以在Interface Builder中分配標簽。 例如,如果您有一個8x8的正方形數組,則可以使用2位數字,其中第一個數字是行,第二個數字是列。 因此,您的代碼將是11
, 12
,..., 87
, 88
。
func squareTapped(recognizer: UIGestureRecognizer) {
if let view = recognizer.view {
let tag = view.tag
let row = tag / 10
let col = tag % 10
print("The view at row \(row), column \(col) was tapped")
if view.backgroundColor == .black {
view.backgroundColor = .white
} else {
view.backgroundColor = .black
}
}
}
如果確實要使用圖像,則將圖像作為viewController的屬性加載,並根據圖像的行和列進行分配。 在這里,我使用了一個Outlet Collection來保存所有UIImageView
。 在Interface Builder中 ,將每個單元格連接到squares
屬性。
class BoardViewController: UIViewController {
let blackImage = UIImage(named: "blackImage")!
let whiteImage = UIImage(named: "whiteImage")!
@IBOutlet var squares: [UIImageView]!
var recognizersAdded = false
func setUpBoard() {
for imageview in squares {
if !recognizersAdded {
let recognizer = UITapGestureRecognizer(target: self, action: #selector(squareTapped))
imageview.addGestureRecognizer(recognizer)
imageview.isUserInteractionEnabled = true
}
let tag = view.tag
let row = tag / 10
let col = tag % 10
// Just for demo purposes, set up a checkerboard pattern
if (row + col) % 2 == 0 {
imageview.image = blackImage
} else {
imageview.image = whiteImage
}
}
recognizersAdded = true
}
func squareTapped(recognizer: UIGestureRecognizer) {
if let view = recognizer.view as? UIImageView {
let tag = view.tag
let row = tag / 10
let col = tag % 10
print("The view at row \(row), column \(col) was tapped")
if view.image == blackImage {
view.image = whiteImage
} else {
view.image = blackImage
}
}
}
}
為每個UIImageView分配一個標簽,並在其上添加Tap手勢。
點擊任意視圖時,可以通過以下方式點擊圖像視圖:
UIImageView *imageView = gestureRecogniser.view
我現在使用的代碼是這樣,它運行良好。 但是我想使用平移手勢(UIPanGetureRecognizer)更改UIView的顏色。 我能怎么做?
class ViewController: UIViewController {
@IBOutlet weak var PrincipalRowStack: UIStackView!
let rowsNumber=10
let colsNumber=10
override func viewDidLoad() {
// Do any additional setup after loading the view, typically from a nib.
super.viewDidLoad()
var rowsStack = [UIStackView]()
var images = [[UIView]]()
var gestRec = [[UITapGestureRecognizer]]()
for r in 0...rowsNumber-1 {
rowsStack.append(UIStackView())
rowsStack[r].axis = .horizontal
rowsStack[r].distribution = .fillEqually
images.append([UIView]())
gestRec.append([UITapGestureRecognizer]())
for c in 0...colsNumber-1{
images[r].append(UIView())
gestRec[r].append(UITapGestureRecognizer())
gestRec[r][c].addTarget(self, action: #selector(ViewController.Tap(_:)))
images[r][c].contentMode = .scaleToFill
images[r][c].layer.borderWidth = 1
images[r][c].layer.borderColor = UIColor(red:0.5, green:0.5, blue:0.5, alpha: 1.0).cgColor
images[r][c].addGestureRecognizer(gestRec[r][c])
rowsStack[r].addArrangedSubview(images[r][c])
}
}
for s in rowsStack{
PrincipalRowStack.addArrangedSubview(s)
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func Tap(_ recognizer: UITapGestureRecognizer) {
if let view = recognizer.view {
//let tag = view.tag
//let row = tag / 10
//let col = tag % 10
print("Tapped!")
if view.backgroundColor == .black {
view.backgroundColor = .white
} else {
view.backgroundColor = .black
}
}
}
}
我解決了將PanGestureRecognizer添加到PrincipalStackView的問題,然后我將此函數與hitTest一起使用,以了解哪個視圖應該更改顏色。
func pan(_ recognizer: UIPanGestureRecognizer){
if (recognizer.state == .began ||
recognizer.state == .changed)
{
let loc = recognizer.location(in: principalRowStack)
let view = principalRowStack.hitTest(loc, with: UIEvent())
view?.backgroundColor = .black
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.