터치로 편집 가능한 일종의 행렬을 실현하고 싶습니다. 검정색 또는 흰색 셀로 일련의 스위치를 누르면 검은 색 또는 그 반대 또는 검은 색으로 변합니다. 이렇게하려면 탭 제스처 인식기 스택보기로 정렬 된 UIImageView를 사용합니다. 하지만 UIImageView가 두드려 졌다는 것을 어떻게 알 수 있습니까? 그리고 어떤면에서 UIImageView에서 UIImage를 변경할 수 있습니까?내가 사용했던 UIImageview를 어떻게 인식합니까?
답변
흰색과 검정색이면 UIView
을 사용하고 backgroundColor
을 .white
또는 .black
으로 설정하는 것이 훨씬 간단합니다. UIView
의 tag
속성을 사용하여 식별 할 수 있습니다.
gestureRecognizer 처리기에서 recognizer.view
은 제스처를 실행 한 view
을 알려줍니다.
인터페이스 빌더에서 태그를 할당 할 수 있습니다. 예를 들어 8x8 제곱의 정사각형 배열이있는 경우 첫 번째 숫자가 행이고 두 번째 숫자가 열인 두 자리 숫자를 사용할 수 있습니다. 따라서 태그는 11
, 12
, ..., 87
, 88
이됩니다.
그런 다음, 이미지를 사용하여의 ViewController의 속성으로 이미지를로드하고 이미지의 행과 열을 기반을 할당 할 경우
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
}
}
}
. 여기에서는
콘센트 콜렉션을 사용하여
UIImageView
을 모두 보유했습니다.
인터페이스 빌더에서는 각 셀을
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
}
}
}
}
내 문제는 두 UIImage 가지고있는 경우 인터페이스 작성기 두 UITapGestureRecognizer, 각 UIImage 하나 추가하고 동일한 IBAction 두 UITapGestureRecognizer 연결하는 데 필요한 것입니다. 신속한 작업 ... 코드를 자세히 구현하는 방법을 보여줄 수 있습니까? –
각 UIImageView에는 자체 UITapGestureRecognizer가 필요합니다. 보드 설정 루틴에서 프로그래밍 방식으로 추가 할 수 있습니다. 한 번만 추가하면됩니다. 보드 설정이 두 번 이상 실행되는 경우 제스처 만 추가하면 처음 인식됩니다. VC에 Bool 속성을 추가하여 추가되었는지 추적 할 수 있습니다. Interface Builder에서 각 UIImageViews를 사각형 IBOutlet 컬렉션에 연결하고 태그를 할당하십시오. – vacawama
신참 한 실수는 하나의 UITapGestureRecognizer를 만들고 여러보기에 추가하려고하는 것입니다.그것은 작동하지 않습니다. 각보기에는 자체보기가 필요하므로 설정 루프 안에 인식기를 만드십시오. – vacawama
각 UIImageView에 태그를 지정하고 탭 제스처를 추가하십시오. = gestureRecogniser.view 내가 지금 사용하고 코드는 이것이다
, 그것은 잘 작동
있는 UIImageView의 *의 이미지 뷰 : 어떤 뷰 탭하면
, 당신은 도청 이미지보기를 얻을 수 있습니다. 그러나 팬 제스처 (UIPanGetureRecognizer)를 사용하여 UIView의 색상을 변경하고 싶습니다. 어떻게해야합니까? principalStackView에 난 색을 변경해야하는도 알아야 할 그러나 hitTest하여이 함수를 사용하여보다 PanGestureRecognizer 추가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
}
}
}
}
I'solved.
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
}
}
안녕하세요. –