Swift 2.0,SpriteKit - 滚动视图不使用页面. [英] Swift 2.0, SpriteKit - Scrollview to not use pages.

查看:14
本文介绍了Swift 2.0,SpriteKit - 滚动视图不使用页面.的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

好的,所以我有一个滚动视图,它已经被子类化,可以应用于我在这里提出的上一个问题中的任何场景:

Ok so I have a scrollView which has been subclassed to be able to be applied to any scene which is from a previous question I asked here:

SpriteKit,Swift 2.0 - 反向滚动视图

import Foundation
import SpriteKit

/// Nodes touched
var nodesTouched: [AnyObject] = [] // global

/// Scroll direction
enum ScrollDirection: Int {
case None = 0
case Vertical
case Horizontal
}

class CustomScrollView: UIScrollView {

// MARK: - Static Properties

/// Touches allowed
static var disabledTouches = false

/// Scroll view
private static var scrollView: UIScrollView!

// MARK: - Properties

/// Current scene
private weak var currentScene: SKScene?

/// Moveable node
private var moveableNode: SKNode?

/// Scroll direction
private var scrollDirection = ScrollDirection.None

// MARK: - Init
init(frame: CGRect, scene: SKScene, moveableNode: SKNode, scrollDirection: ScrollDirection) {
    print("Scroll View init")
    super.init(frame: frame)

    CustomScrollView.scrollView = self
    self.scrollDirection = scrollDirection
    self.currentScene = scene
    self.moveableNode = moveableNode
    self.frame = frame
    indicatorStyle = .White
    scrollEnabled = true
    //self.minimumZoomScale = 1
    //self.maximumZoomScale = 3
    canCancelContentTouches = false
    userInteractionEnabled = true
    delegate = self

    // flip for spritekit (only needed for horizontal)
    if self.scrollDirection == .Horizontal {
        let flip = CGAffineTransformMakeScale(-1,-1)
        self.transform = flip
    }
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
    }
}

 // MARK: - Touches
 extension CustomScrollView {

/// began
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    print("Touch began scroll view")

    guard !CustomScrollView.disabledTouches else { return }
    currentScene?.touchesBegan(touches, withEvent: event)
}

/// moved
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
    print("Touch moved scroll view")

    guard !CustomScrollView.disabledTouches else { return }
    currentScene?.touchesMoved(touches, withEvent: event)
}

/// ended
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
    print("Touch ended scroll view")

    guard !CustomScrollView.disabledTouches else { return }
    currentScene?.touchesEnded(touches, withEvent: event)
}

/// cancelled
override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) {
    print("Touch cancelled scroll view")

    guard !CustomScrollView.disabledTouches else { return }
    currentScene?.touchesCancelled(touches, withEvent: event)
   }
}

 // MARK: - Touch Controls
 extension CustomScrollView {

/// Disable
class func disable() {
    print("Disabled scroll view")
    CustomScrollView.scrollView?.userInteractionEnabled = false
    CustomScrollView.disabledTouches = true
}

/// Enable
class func enable() {
    print("Enabled scroll view")
    CustomScrollView.scrollView?.userInteractionEnabled = true
    CustomScrollView.disabledTouches = false
   }
 }

 // MARK: - Delegates
 extension CustomScrollView: UIScrollViewDelegate {

/// did scroll
func scrollViewDidScroll(scrollView: UIScrollView) {
    print("Scroll view did scroll")

    if scrollDirection == .Horizontal {
        moveableNode!.position.x = scrollView.contentOffset.x
    } else {
        moveableNode!.position.y = scrollView.contentOffset.y
      }
    }
 }

唯一的问题是滚动视图使用页面,而我希望它看起来的方式只滚动精灵,就像 raywenderlich 一样,其中所有精灵都是唯一移动的东西,所以我不必滚动多个页面以找到一个精灵.

The only problem is that the scrollview uses pages, while, the way I want it to look, scrolls only through the sprites, like the raywenderlich one where all the sprites are the only things moving and so I don't have to scroll across multiple pages to get to a sprite.

项目可以在这里找到:

Raywenderlich 项目

因为他们使用他们的 gameViewController,所以我无法像上面那样通过子类滚动视图来实现它.

Because they use their gameViewController I am having trouble figuring out how to implement it through a subclass scrollview like I have above.

推荐答案

我不明白你在这里问什么.我刚刚检查了 RayWenderlich 教程,它与我的 GitHub 示例项目完全相同.他们只是让精灵更靠近在一起,在我的项目中为了演示目的,我将每个精灵放在一个新页面上.

I dont understand what you are asking here. I just checked the RayWenderlich tutorial and its exactly the same as my GitHub sample project. They just keep the sprites closer together where as in my project for demonstration purposes I put each sprite on a new page.

如果您只想让精灵滚动,只需将精灵添加到可移动节点,其余的照常直接添加到场景中.

If you just want sprites to scroll that just add the sprites to the moveableNode and the rest as usual to the scene directly.

addChild(background)
moveableNode.addChild(sprite1)

改变精灵的位置,使它们更靠近.您基本上将第一个精灵添加到滚动视图中的第一页,然后根据先前的精灵 x 位置定位其他精灵.您也可以将这些精灵添加到 sprite1.

Than change the sprite positions so they are closer together. You basically add the 1st sprite to the 1st page in the scrollView and than position the other sprites based on the previous sprites x position. You add these sprites to sprite1 as well.

let sprite1 = SKSpriteNode(color: SKColor.redColor(), size: CGSize(width: 50, height: 50))
sprite1.position = CGPointMake(0, 0)
page1ScrollView.addChild(sprite1)

let sprite2 = SKSpriteNode(color: SKColor.redColor(), size: CGSize(width: 50, height: 50))
sprite2.position = CGPointMake(sprite1.position.x + (sprite2.size.width * 1.5), sprite1.position.y)
sprite1.addChild(sprite2)

let sprite3 = SKSpriteNode(color: SKColor.redColor(), size: CGSize(width: 50, height: 50))
sprite3.position = CGPointMake(sprite2.position.x + (sprite3.size.width * 1.5), sprite1.position.y)
sprite1.addChild(sprite3)

我更新了我的 gitHub 项目以实际展示这一点https://github.com/crashoverride777/Swift2-SpriteKit-UIScrollView-Helper

I updated my gitHub project to show this in action https://github.com/crashoverride777/Swift2-SpriteKit-UIScrollView-Helper

这篇关于Swift 2.0,SpriteKit - 滚动视图不使用页面.的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆