我想通过触摸实现一种可编辑的矩阵。 一系列黑色或白色单元格,如果轻敲开关形成黑色或反之亦然。 为此,我将使用UIImageView排列在堆栈视图中的Tap Gesture Recognizer。但是我怎么知道哪个UIImageView被点击了?在哪种方式我可以改变UIImageView中的UIImage?
答案 0 :(得分:2)
如果它们只是白色和黑色,那么使用UIView
并将其backgroundColor
设置为.white
或.black
会更加简单。您可以使用tag
的{{1}}属性来识别它们。
在您的gestureRecognizer处理程序中,UIView
会告诉您触发该手势的recognizer.view
。
您可以在 Interface Builder 中指定标签。例如,如果您有一个8x8的正方形阵列,则可以使用一个2位数字,其中第一个数字是行,第二个数字是列。因此,您的代码应为view
,11
,...,12
,87
。
88
如果您确实想使用图像,请将图像作为viewController的属性加载,并根据图像的行和列进行分配。在这里,我使用 Outlet Collection 来保存所有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
}
}
}
。在 Interface Builder 中,您将每个单元格连接到UIImageView
属性。
squares
答案 1 :(得分:0)
为每个UIImageView分配标签并在其上添加Tap手势。
点按任意视图后,您可以按以下方式点按图片视图:
UIImageView * imageView = gestureRecogniser.view
答案 2 :(得分:0)
我现在使用的代码是这样,它运作良好。 但我想使用平移手势(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
}
}
}
}
答案 3 :(得分:0)
我解决了将一个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
}
}