SpriteKit,Swift 2.0 – ScrollView相反

我设法得到一个滚动视图工作和滚动,但现在当我去滚动它只滚动从右到左,并想知道如何去扭转它,所以它从左到右滚动。

这是我的菜单代码,其中包含我的滚动视图:

var moveableNode = SKNode() var scrollView: CustomScrollView! private var spriteSize = CGSize.zero let kMargin: CGFloat = 40 var sprite = SKSpriteNode() class Menu: SKScene { override func didMoveToView(view: SKView) { addChild(moveableNode) spriteSize = SKSpriteNode (imageNamed: "card_level01").size let initialMargin = size.width/2 let marginPerImage = kMargin + spriteSize.width scrollView = CustomScrollView(frame: CGRect(x: 0, y: 0, width: self.frame.size.width, height: self.frame.size.height), scene: self, moveableNode: moveableNode) scrollView.contentSize = CGSizeMake(initialMargin*2 + (marginPerImage * 7), size.height) // scrollView.contentSize = CGSizeMake(self.frame.size.width * 2, self.frame.size.height) view.addSubview(scrollView) for i in 1...8 { let sprite = SKSpriteNode(imageNamed: String(format: "card_level%02d", i)) sprite.position = CGPoint (x: initialMargin + (marginPerImage * (CGFloat(i) - 1)), y: size.height / 2) moveableNode.addChild(sprite) } 

这是我的scrollView类,它是UIScrollView的子类:

  var nodesTouched: [AnyObject] = [] // global class CustomScrollView: UIScrollView { // MARK: - Static Properties /// Touches allowed static var disabledTouches = false /// Scroll view private static var scrollView: UIScrollView! private static var contentView: UIView! // MARK: - Properties /// Current scene private var currentScene: SKScene? /// Moveable node private var moveableNode: SKNode? // MARK: - Init init(frame: CGRect, scene: SKScene, moveableNode: SKNode) { print("Scroll View init") super.init(frame: frame) CustomScrollView.scrollView = 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) let verticalFlip = CGAffineTransformMakeScale(-1,-1) self.transform = verticalFlip } 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") moveableNode!.position.x = scrollView.contentOffset.x // Left/Right //moveableNode!.position.y = scrollView.contentOffset.y // Up/Dowm } } 

在阅读剩下的内容之前,您需要先在gitHub(v1.1)上获得我的更新助手。

当你的场景缩放模式(gameViewController)被设置为时,我的帮手才能真正工作

 .ResizeFill 

所以你的场景不裁剪。 如果您使用不同的scaleMode如

 .AspectFill 

比它可能会裁剪你的scrollView,你需要调整的东西。

如果你的游戏/应用程序同时支持纵向和横向,这对游戏来说也是不太可能的。

所以正如我所说,你也注意到当在spriteKit中使用ScrollView时,与UIKit相比,坐标是不同的。 对于垂直滚动,这并不意味着任何事情,但是对于水平滚动,所有事情都是相反的。 所以要解决这个问题,你要做以下的事情

设置你的scrollView水平滚动,传递新的scrollDirection属性(在这种情况下.Horizo​​ntal)

 scrollView = CustomScrollView(frame: CGRect(x: 0, y: 0, width: self.frame.size.width, height: self.frame.size.height), scene: self, moveableNode: moveableNode, scrollDirection: .Horizontal) scrollView.contentSize = CGSizeMake(self.frame.size.width * 3, self.frame.size.height) // * 3 makes it twice as wide as screen view.addSubview(scrollView) 

在将其添加到视图中之后,还需要添加这一行代码。

 scrollView.setContentOffset(CGPoint(x: 0 + self.frame.size.width * 2, y: 0), animated: true) 

这是你用来告诉ScrollView在哪个页面上启动的行。 现在在这个例子中,scrollView是屏幕宽度的三倍,因此您需要将内容偏移两个屏幕长度

现在为了让事情更容易定位,我会这样做,为scrollView的每个页面创build精灵。 这使得以后的定位更容易。

 let page1ScrollView = SKSpriteNode(color: SKColor.clearColor(), size: CGSizeMake(self.frame.size.width, self.frame.size.height)) page1ScrollView.position = CGPointMake(CGRectGetMidX(self.frame) - (self.frame.size.width * 2), CGRectGetMidY(self.frame)) moveableNode.addChild(page1ScrollView) let page2ScrollView = SKSpriteNode(color: SKColor.clearColor(), size: CGSizeMake(self.frame.size.width, self.frame.size.height)) page2ScrollView.position = CGPointMake(CGRectGetMidX(self.frame) - (self.frame.size.width), CGRectGetMidY(self.frame)) moveableNode.addChild(page2ScrollView) let page3ScrollView = SKSpriteNode(color: SKColor.clearColor(), size: CGSizeMake(self.frame.size.width, self.frame.size.height)) page3ScrollView.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)) moveableNode.addChild(page3ScrollView) 

现在你可以定位你的实际标签,精灵更容易。

 /// Test label page 1 let myLabel = SKLabelNode(fontNamed:"Chalkduster") myLabel.text = "Hello, World!" myLabel.fontSize = 45 myLabel.position = CGPointMake(0, 0) page1ScrollView.addChild(myLabel) /// Test sprite page 2 let sprite = SKSpriteNode(color: SKColor.redColor(), size: CGSize(width: 50, height: 50)) sprite.position = CGPointMake(0, 0) page2ScrollView.addChild(sprite) /// Test sprite page 3 let sprite2 = SKSpriteNode(color: SKColor.blueColor(), size: CGSize(width: 50, height: 50)) sprite2.position = CGPointMake(0, 0) page3ScrollView.addChild(sprite2) 

希望这可以帮助。

我也更新了我的GitHub项目,以更好地解释这一点

https://github.com/crashoverride777/Swift2-SpriteKit-UIScrollView-Helper