SpriteKit, Swift 2.0 - ScrollView отсутствует при запуске сцены с помощью кнопки

Недавно я внедрил scrollView в свой GameViewController, и он работает очень хорошо, но в учебнике, на который я смотрел, была только одна сцена, которая была сценой запуска (GameScene), а не отдельной сценой, которую я буду называть «Меню», поэтому Мне удалось заставить его запускать сцену меню, а не обычную «GameScene», но когда я перехожу из GameScene в сцену меню с помощью кнопки, которую я реализовал в GameScene, прокрутка не работает, но показывает картинки, но Я просто не могу пролистать их.

Мой вопрос: как мне заставить scrollView работать, когда я использую кнопку (то есть в GameScene), чтобы перейти к сцене меню?

Это кнопка (которая находится в GameScene)

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

    let touch: UITouch = touches.first!
    let location: CGPoint = touch.locationInNode(self)
    let node: SKNode = self.nodeAtPoint(location)


    if (node == menubutton) {

        let MenuScene = Menu(size: self.size, viewController: viewController)
        let transition = SKTransition.flipVerticalWithDuration(0.5)
        MenuScene.scaleMode = SKSceneScaleMode.AspectFill
        self.scene!.view?.presentScene(MenuScene, transition: transition) 

}

Вот моя сцена меню:

import Foundation
import SpriteKit


let kMargin: CGFloat = 40

var backButton = SKSpriteNode()
var selectButton = SKSpriteNode()


class Menu: SKScene {

    let world2 = SKSpriteNode()

private var imageSize = CGSize.zero

private weak var viewController: GameViewController?


init(size: CGSize, viewController: GameViewController?) {
    self.viewController = viewController
    super.init(size: size)
}

required init?(coder aDecoder: NSCoder) {
    assert(false, "Use init(size:viewController:)")

    super.init(coder: aDecoder)
}


override func didMoveToView(view: SKView) {
    physicsWorld.gravity = CGVector.zero

    imageSize = SKSpriteNode(imageNamed: "card_level01").size

    let initialMargin = size.width/2
    let marginPerImage = kMargin + imageSize.width

    world2.size = CGSize(width: initialMargin*2 + (marginPerImage * 7), height: size.height)
    addChild(world2)

    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)
        world2.addChild(sprite)

    }
}

override func update(currentTime: NSTimeInterval) {
    viewController?.applyScrollViewToSpriteKitMapping()
}

Вот мой GameViewController

import UIKit
import SpriteKit

class GameViewController: UIViewController {

var scrollView: UIScrollView!
var contentView: UIView!

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()

    let skView = view as! SKView

    if (skView.scene === Menu.self) {

        skView.showsFPS = true
        skView.showsNodeCount = true

        skView.ignoresSiblingOrder = true

        let scene = Menu(size: skView.bounds.size, viewController: self)
        scene.scaleMode = .AspectFill

        skView.presentScene(scene)

        scrollView = UIScrollView(frame: self.view.bounds)
        scrollView.delegate = self
        scrollView.contentSize = scene.world2.frame.size
        view.addSubview(scrollView)

        contentView = UIView(frame: CGRect(origin: CGPoint.zero, size: scene.world2.size))
        contentView.backgroundColor = UIColor.greenColor().colorWithAlphaComponent(0.2)
        scrollView.addSubview(contentView)

        applyScrollViewToSpriteKitMapping()

    }
}

func applyScrollViewToSpriteKitMapping() {

    let origin = contentView.frame.origin

    let skPosition = CGPoint(x: -scrollView.contentOffset.x + origin.x, y: -scrollView.contentSize.height + CGRectGetHeight(view.bounds) + scrollView.contentOffset.y - origin.y)


    let skView = view as! SKView
    if let scene = skView.scene as? Menu {
        scene.world2.position = skPosition

    }

}

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    if UIDevice.currentDevice().userInterfaceIdiom == .Phone {
        return UIInterfaceOrientationMask.Portrait
    } else {
        return UIInterfaceOrientationMask.All
    }
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Release any cached data, images, etc that aren't in use.
}

override func shouldAutorotate() -> Bool {
    return true
}

override func prefersStatusBarHidden() -> Bool {
    return true
 }

}

extension GameViewController: UIScrollViewDelegate {


}

person Astrum    schedule 02.01.2016    source источник


Ответы (1)


Недавно я помог другому участнику задать аналогичный вопрос, посмотрите, может быть, вам это будет полезно.

Как создать меню с вертикальной прокруткой в ​​spritekit?

По-моему, я подклассифицирую представление прокрутки и поэтому могу добавить его непосредственно в SKScenes, а не в контроллеры представления.

Если вы хотите, чтобы scrollView использовался более чем в 1 SKScene без дублирующего кода, вам необходимо создать подкласс вашего SKScnenes.

 class BaseScene: SKScene ...
 // Add scroll view 

 class Menu: BaseScene...
 class GameScene: BaseScene ...

В качестве примечания: вы не должны ссылаться на свой viewController в своих SKScenes, они не должны знать друг о друге.

person crashoverride777    schedule 06.01.2016
comment
ты абсолютный спасатель. :D - person Astrum; 07.01.2016
comment
Рад, что это помогло. Удачного кодирования - person crashoverride777; 07.01.2016
comment
Привет, я попытался реализовать решение на предоставленной вами странице, но поскольку я создал подкласс сцены меню для прокрутки, я не могу заставить работать addchild (moveableNode), потому что это дает мне ошибку. Какие-нибудь мысли? Я также пробовал addSubview (moveableNode), и это тоже не сработало. - person Astrum; 09.01.2016
comment
вам не нужно подклассифицировать сцену для scrollView. Вы просто создаете подкласс scrollView, а затем просто добавляете scrollView на сцену. Прочитайте приведенную выше ссылку еще раз, она дает вам довольно подробные инструкции. Дайте мне знать, как это происходит - person crashoverride777; 09.01.2016
comment
Хорошо, я исправил проблему, но теперь у меня есть две другие. Когда я иду и запускаю сцену меню с помощью кнопки в gameScene, она появляется с черным/темно-серым фоном, на котором ничего нет, и если я запускаю сцену меню напрямую, то она появляется с обычным светло-серым фоном, но также не имеет ничего. Это. У меня определен spriteNode, а также строки кода, которые вы сказали мне добавить в связанный пост. Если вы хотите, я могу обновить свой 1-й пост с моей текущей сценой меню. - person Astrum; 09.01.2016
comment
вы должны задать новый вопрос для этого с некоторым кодом, как вы реализовали scrollView, и я постараюсь помочь - person crashoverride777; 09.01.2016
comment
хорошо, я начал новый вопрос, и вот он stackoverflow.com/questions/34696794/ - person Astrum; 09.01.2016
comment
я только что написал ответ - person crashoverride777; 09.01.2016
comment
Проверьте мой обновленный ответ или проект github github.com/crashoverride777/Swift-2-CustomScrollView-SpriteKit - person crashoverride777; 10.01.2016