Ich weiß, es gibt viele Fragen zu diesem Problem in SO, aber ich habe nichts nützliches für mich gefunden.Index außerhalb des Bereichs Fehler in Swift 3
Ich mache eine App, die Bewegung auf dem Bildschirm erkennen kann. Aber Apple Gesten Recognizer sind zu präzise für meinen Gebrauch, also mache ich meine eigenen.
Es ist fast fertig und funktioniert.
Ich würde gerne Multitouch-Geste (wie Pinch) behandeln und ich muss die Richtung jedes Fingers auf dem Bildschirm bekommen, dafür dachte ich, jede Richtung in einem Array einzuschließen, damit ich sie leicht danach vergleichen werde . Aber ich bekomme diesen Indexfehler außer Reichweite, und ich weiß nicht, wo ich falsch liege. Ich bin ziemlich neu zu swift (selbstlernend seit 1 Monat), so kann es offensichtlich oder sogar ein dummer Fehler sein ...
Wenn Sie mir bitte dabei helfen könnten, würde ich mich freuen. Danke!
Hier ist mein vollständiger Code:
import UIKit
class ViewController: UIViewController {
//@IBOutlet weak var statusLabel: UILabel!
@IBOutlet weak var StatusLabel: UILabel!
var fingers = [String?](repeating: nil, count:10)
var finger1 = [CGFloat]()
var finger2 = [CGFloat]()
var finger3 = [CGFloat]()
var finger4 = [CGFloat]()
var finger5 = [CGFloat]()
var direction: String = ""
var direction1 = [String]()
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
direction = ""
direction1 = []
finger1 = []
finger2 = []
finger3 = []
finger4 = []
finger5 = []
for touch in touches{
let point = touch.location(in: self.view)
for (index,finger) in fingers.enumerated() {
if finger == nil {
fingers[index] = String(format: "%p", touch)
print("finger \(index+1): x=\(point.x) , y=\(point.y)")
break
}
}
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesMoved(touches, with: event)
for touch in touches {
let point = touch.location(in: self.view)
for (index,finger) in fingers.enumerated() {
if let finger = finger, finger == String(format: "%p", touch) {
switch (index){
case 0 :
finger1 += [point.x, point.y]
case 1 :
finger2 += [point.x, point.y]
case 2 :
finger3 += [point.x, point.y]
case 3 :
finger4 += [point.x, point.y]
case 4 :
finger5 += [point.x, point.y]
default :
break
}
}
}
}
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesEnded(touches, with: event)
for touch in touches {
for (index,finger) in fingers.enumerated() {
if let finger = finger, finger == String(format: "%p", touch) {
fingers[index] = nil
break
}
}
}
if finger1.count != 0 {
direction1[0] += GestureRecognizer(coordinates: finger1, index: 0)
}
if finger2.count != 0 {
direction1[1] += GestureRecognizer(coordinates: finger2, index: 1)
}
if finger3.count != 0 {
direction1[2] += GestureRecognizer(coordinates: finger3, index: 2)
}
if finger4.count != 0 {
direction1[3] += GestureRecognizer(coordinates: finger4, index: 3)
}
if finger5.count != 0 {
direction1[4] += GestureRecognizer(coordinates: finger5, index: 4)
}
print("1 " + direction1[0] + "2 " + direction1[1] + "3 " + direction1[2] + "4 " + direction1[3] + "5 " + direction1[4])
StatusLabel.text = direction1[1]
}
func GestureRecognizer (coordinates: [CGFloat], index: Int) -> String {
if (coordinates[0] - coordinates[coordinates.count-2]) > 100 && (coordinates[1] - coordinates[coordinates.count-1]) < (-100) {
print("Vers la gauche et bas")
direction1[0] = "downleft"
}
else if (coordinates[0] - coordinates[coordinates.count-2]) < (-100) && (coordinates[1] - coordinates[coordinates.count-1]) > 100{
print("Vers la droite et haut")
direction1[index] = "upright"
}
else if (coordinates[0] - coordinates[coordinates.count-2]) < (-100) && (coordinates[1] - coordinates[coordinates.count-1]) < (-100){
print("Vers la droite et bas")
direction1[index] = "downright"
}
else if (coordinates[0] - coordinates[coordinates.count-2]) > 100 && (coordinates[1] - coordinates[coordinates.count-1]) > 100 {
print("Vers la gauche et haut")
direction1[index] = "upleft"
}
else if (-100..<100).contains(coordinates[0] - coordinates[coordinates.count-2]) && (coordinates[1] - coordinates[coordinates.count-1]) > 100 {
print("Swipe up")
direction1[index] = "swipeup"
}
else if (-100..<100).contains(coordinates[0] - coordinates[coordinates.count-2]) && (coordinates[1] - coordinates[coordinates.count-1]) < -100 {
print("Swipe Down")
direction1[index] = "swipedown"
}
else if (coordinates[0] - coordinates[coordinates.count-2]) > 100 && (-100..<100).contains(coordinates[1] - coordinates[coordinates.count-1]){
print("Swipe left")
direction1[index] = "swipeleft"
}
else if (coordinates[0] - coordinates[coordinates.count-2]) < -100 && (-100..<100).contains(coordinates[1] - coordinates[coordinates.count-1]){
print("Swipe right")
direction1[index] = "swiperight"
}
else {
direction1[index] = "failed"
}
return direction1[index]
}
}
Es gibt viele Arrays wurden used.please Debug-Check es zu initialisieren, wo Sie Index außerhalb des zulässigen Bereichs bekommen. –
@DSDharma Du hast Recht, mein Schlechter. Dann rufe ich die Funktion GestureRecognizer in der Zeile: direction1 [index] = "Something" auf. Dort bekomme ich den Fehler. – Hawkydoky