ios - Zoom SKSpriteNode in AND out in Swift -


first off, have seen , tried implement other answers similar questions here, here , here. problem started programming ios last year swift , (regrettably) did not learn objc first (yes, it's on to-do list). ;-)

so please take , see if might me see way thru this.

i can pinch zoom whole skscene. can scale skspitenode up/down using other ui gestures (ie. swipes) , skactions.

based off post have applied skaction uipinchgesturerecognizer , works zoom in, cannot zoom out.

what missing?

here code on sample project:

class gamescene: skscene {  var board = skspritenode(color: skcolor.yellowcolor(), size: cgsizemake(200, 200))  func pinched(sender:uipinchgesturerecognizer){     println("pinched \(sender)")     // line below scales entire scene     //sender.view!.transform = cgaffinetransformscale(sender.view!.transform, sender.scale, sender.scale)     sender.scale = 1.01      // line below scales skspritenode     // has no effect unless increase scaling >1     var zoomboard = skaction.scaleby(sender.scale, duration: 0)     board.runaction(zoomboard) }  // line below scales skspritenode func swipedup(sender:uiswipegesturerecognizer){     println("swiped up")     var zoomboard = skaction.scaleby(1.1, duration: 0)     board.runaction(zoomboard) }  // thought perhaps line below scale down skspritenode // has no effect @ func swipeddown(sender:uiswipegesturerecognizer){     println("swiped down")     var zoomboard = skaction.scaleby(0.9, duration: 0)     board.runaction(zoomboard) }  override func didmovetoview(view: skview) {      self.addchild(board)      let pinch:uipinchgesturerecognizer = uipinchgesturerecognizer(target: self, action: selector("pinched:"))     view.addgesturerecognizer(pinch)       let swipeup:uiswipegesturerecognizer = uiswipegesturerecognizer(target: self, action: selector("swipedup:"))     swipeup.direction = .up     view.addgesturerecognizer(swipeup)      let swipedown:uiswipegesturerecognizer = uiswipegesturerecognizer(target: self, action: selector("swipeddown:"))     swipedown.direction = .down     view.addgesturerecognizer(swipedown)   }  override func touchesbegan(touches: set<nsobject>, withevent event: uievent) {     // should using function instead?   } 

thanks @sangony have gotten working finally. thought i'd post working code in case else see in swift.

var board = skspritenode(color: skcolor.yellowcolor(), size: cgsizemake(200, 200))  var previousscale = cgfloat(1.0)  func pinched(sender:uipinchgesturerecognizer){     if sender.scale > previousscale {         previousscale = sender.scale         if(board.size.height < 800) {             var zoomin = skaction.scaleby(1.05, duration:0)             board.runaction(zoomin)         }     }     if sender.scale < previousscale {         previousscale = sender.scale         if(board.size.height > 200) {             var zoomout = skaction.scaleby(0.95, duration:0)             board.runaction(zoomout)         }     } 

i tried code (in objective c) , got zoom in , out using pinch. don't think there's wrong code not taking account scale factors placed on ever changing sprite size.

you can zoom far out or in requires multiple pinch gestures node manageable size. instead of using scale property directly zoom factor, suggest use step process. should have max/min limits scale size.

to use step process create cgfloat ivar previousscale store last scale value determine whether current pinch zooming in or out. compare new passed sender.scale ivar , zoom in or out based on comparison.

apply min , max scale limits stop scaling once reached.

the code below in obj-c i'm sure can gist of it:

first declare ivar float float previousscale;

- (void)handlepinch:(uipinchgesturerecognizer *)sender {      nslog(@"pinchscale:%f",sender.scale);      if(sender.scale > previousscale) {         previousscale = sender.scale;          // scale if node height less 200         if(node0.size.height < 200) {             // step scale factor 0.05             [node0 runaction:[skaction scaleby:1.05 duration:0]];         }     }      if(sender.scale < previousscale) {         previousscale = sender.scale;          // scale down if node height greater 20         if(node0.size.height > 20) {             // step down scale factor 0.05             [node0 runaction:[skaction scaleby:0.95 duration:0]];         }     } } 

Popular posts from this blog