2015-07-20 4 views
0

Я разрабатываю приложение SpriteKit в iOS, используя Swift, и я применил жесты и жесты для моей карты. Код выглядит следующим образом:Позвоните в iOS pan и pinch распознаватель из другого класса

//Zoom recognizer 
    let pinch: UIPinchGestureRecognizer = UIPinchGestureRecognizer(target: self, action: Selector("pinch:")) 
    view.addGestureRecognizer(pinch) 

    // Move recognizer 
    let pan: UIPanGestureRecognizer = UIPanGestureRecognizer(target: self, action: Selector("pan:")) 
    view.addGestureRecognizer(pan) 


func pinch(sender: UIPinchGestureRecognizer){ 

    var anchorPoint: CGPoint = sender.locationInView(sender.view) 
    anchorPoint = convertPointFromView(anchorPoint) 

    if (sender.state == UIGestureRecognizerState.Changed) { 

     let anchorPointInMySKNode: CGPoint = world!.convertPoint(anchorPoint, fromNode: self) 
     world!.setScale(world!.xScale * sender.scale) 

     let mySKNodeAnchorPointInScene: CGPoint = self.convertPoint(anchorPointInMySKNode, fromNode: world!) 
     let translationOfAnchorInScene = CGPointSubtract(anchorPoint, point2: mySKNodeAnchorPointInScene) 

     world!.position = CGPointAdd(world!.position, point2: translationOfAnchorInScene) 

     sender.scale = 1.0 
    } 
} 

func pan(sender: UIPanGestureRecognizer){ 

    if(sender.state == UIGestureRecognizerState.Began){ 

     sender.setTranslation(CGPointZero, inView: sender.view) 
    } 

    else if (sender.state == UIGestureRecognizerState.Changed){ 

     var translation: CGPoint = sender.translationInView(sender.view!) 
     translation = CGPointMake(-translation.x, translation.y) 

     world!.position = CGPointSubtract(world!.position, point2: translation) 
     sender.setTranslation(CGPointZero, inView: sender.view) 
    } 
} 

код работает нормально, но в настоящее время написано в классе GameScene.swift, однако было бы лучше, если бы можно было создать отдельный класс под названием Gestures.swift и просто позвонить, когда-либо жест I хотеть. Я пробовал несколько подходов, но никто из них не работает. Две основные проблемы: как выбрать селектор в функции GestureRecognizer и как передать родительский узел, который в моем случае был инициализирован миром внутри GameScene.swift

ответ

1

Вам нужно использовать делегирование. Я использовал что-то подобное в своих играх (но в obj-c). Делегация - это путь.

Вот несколько ресурсов, которые я бы рекомендовал. https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html

http://code.tutsplus.com/tutorials/swift-from-scratch-delegation-and-properties--cms-23445

https://www.youtube.com/watch?v=AHx4nE7EMic

http://swift.exomachina.com/swift-tutorial-8-from-one-scene-to-another-using-delegate-protocol/

Смежные вопросы