您好我正在使用 Swift的SpriteKit游戏,现在只有两个场景,一个加载场景和游戏场景.游戏场景到达数据库以在呈现之前获取信息.游戏场景中的一切都很棒.当我首先进入装载场景而不是直接进入游戏场景时,我遇到了问题.通过回调,我告诉加载场景,一旦完成数据库操作就会呈现游戏场景.然而,当我尝试呈现时,我得到了10个这样的大错误:

2015-11-12 09:48:33.880 SpaceAcademy[2373:764586] This application is
modifying the autolayout engine from a background thread,which can
lead to engine corruption and weird crashes. This will cause an
exception in a future release. (followed by a bunch of random info)

现在通过一些测试,我发现它是我的UIElement,例如按钮,滑块和标签,这些都是导致这种情况发生的.但是我将它们移动到了didMovetoView函数中,所以我很困惑为什么它们仍然会抛出错误,因为它们位于“后台线程”中.

还奇怪的是,这些都不是致命的错误.我的控制台刚刚爆炸,UIElements在延迟十秒后出现.其他奇怪的是,如果我点击我知道按钮应该是的位置,该功能仍然被调用,就像按钮实际上在那里一样.

我非常感谢摆脱控制台爆炸的解决方案,但更重要的是摆脱了UI元素出现的十秒延迟,谢谢!

代码设置场景

let skView = view as! SKView
    skView.showsFPS = false
    skView.showsNodeCount = false
    skView.ignoresSiblingOrder = true

    let scene = GameScene(size: view.bounds.size)
    scene.scaleMode = SKScenescaleMode.Resizefill


    let loading = LoadingScene(size: view.bounds.size,newScene: scene)
    skView.presentScene(loading,transition: SKTransition.crossFadeWithDuration(1))

    scene.setEverythingUp(loading)

加载场景:

import Foundation
import SpriteKit

class LoadingScene:SKScene{
    var newScene:SKScene!
    var oldCount = 0
    var loadCount = 0{
    didSet{
        print(loadCount)
        if loadCount == 0{
            if oldCount == 1{
                self.view?.presentScene(newScene)
            }
        }
        oldCount = loadCount
    }
}

init(size: CGSize,newScene:SKScene) {
    self.newScene = newScene
    super.init(size: size)

}

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

override func didMovetoView(view: SKView) {
    self.backgroundColor = UIColor.blackColor()
    let imageArray = [
        SKTexture(imageNamed: "Loader/Loader1.png"),SKTexture(imageNamed: "Loader/Loader2.png"),SKTexture(imageNamed: "Loader/Loader3.png")
    ]

    let loader = SKSpriteNode(texture: imageArray[0])
    let animation = SKAction.animateWithTextures(imageArray,timePerFrame: 0.33)
    loader.runAction(SKAction.scaleBy(0.25,duration: 0))
    loader.zPosition = 100
    loader.runAction(SKAction.repeatActionForever(animation))
    loader.position = CGPointMake(self.size.width/2,self.size.height/2)
    self.addChild(loader)
}

func start(){
    self.loadCount = self.loadCount + 1
}

func end(){
    self.loadCount = self.loadCount - 1
}

}

来自GameScene的代码:

func setEverythingUp(myLoadingScene: LoadingScene){

    let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

    var Id = 0
    if let tempID = defaults.objectForKey("UserId") as? Int {
       Id = tempID
    }else{
        print("newUser")
        defaults.setobject(0,forKey: "UserId")
        defaults.synchronize()
    }

    self.mySettings = Settings(UserId: Id)
    self.myURLRequests = URLRequests(thesettings: self.mySettings)

    ///////////call back system here,start() increments number of tasks waiting to finish,end() means a task is finished

    myLoadingScene.start()
    myURLRequests.getFleet(self,UserId: self.mySettings.UserId,enemy: false){ () -> () in
        myLoadingScene.end()
    }

    myLoadingScene.start()
    myURLRequests.getFleet(self,enemy: true){ () -> () in
        myLoadingScene.end()
    }



    self.backgroundColor = SKColor.blackColor()
    self.physicsWorld.contactDelegate = self
    self.physicsWorld.gravity = CGVector(dx: 0,dy: 0)
    addStars()


    self.anchorPoint = CGPoint(x:self.size.width/2,y:self.size.height/2)
    self.myCamera.position = CGPointMake(200,0)
    self.addChild(self.myCamera)
    self.camera = self.myCamera
    self.myAnchor.position = self.myCamera.position
}



override func didMovetoView(view: SKView) {
    print("in view")

    let pinch = UIPinchGestureRecognizer(target: self,action: Selector("PinchScale:"))
    let tap = UITapGestureRecognizer(target: self,action: Selector("Tap:"))
    let pan = UIPanGestureRecognizer(target: self,action: Selector("DragMove:"))

    self.view?.addGestureRecognizer(pinch)
    self.view?.addGestureRecognizer(tap)
    self.view?.addGestureRecognizer(pan)


    let fireButton = UIButton(type: .System)
    fireButton.setTitle("Fire!",forState: UIControlState.normal)
    fireButton.titleLabel!.font = UIFont(name: "TrebuchetMS",size: 70)
    fireButton.sizetoFit()
    fireButton.frame = CGRect(x: self.size.width*0.5 - 80,y: 20,width: self.size.width*0.3,height: 30)
    fireButton.addTarget(self,action: Selector("FireButtonClicked"),forControlEvents: UIControlEvents.TouchUpInside)
    self.view?.addSubview(fireButton)

    let alternateControls = false

    let AngleLabel = UILabel()
    AngleLabel.text = "Angle"
    AngleLabel.font = UIFont(name: "TrebuchetMS",size: 30)
    AngleLabel.textColor = UIColor.blueColor()


    let AngleSlider = UiSlider()
    AngleSlider.addTarget(self,action: Selector("AngleSlided:"),forControlEvents: UIControlEvents.ValueChanged)
    AngleSlider.maximumValue = 90
    AngleSlider.minimumValue = -90
    AngleSlider.value = 0
    AngleSlider.continuous = true



    let PowerLabel = UILabel()
    PowerLabel.text = "Power"
    PowerLabel.font = UIFont(name: "TrebuchetMS",size: 30)
    PowerLabel.textColor = UIColor.blueColor()


    let PowerSlider = UiSlider()
    PowerSlider.addTarget(self,action: Selector("PowerSlided:"),forControlEvents: UIControlEvents.ValueChanged)
    PowerSlider.maximumValue = 0.99
    PowerSlider.minimumValue = 0.1
    PowerSlider.value = 0.5
    PowerSlider.continuous = true


    if alternateControls{
        AngleLabel.frame = CGRect(x: self.size.width*0.05,y: 10,height: 60)
        AngleSlider.frame = CGRect(x: self.size.width * -0.05,y: self.size.height*0.55,width: self.size.height*0.7,height: 30)
        AngleSlider.transform = CGAffineTransformMakeRotation(CGFloat(M_PI) * 1.5)
        PowerLabel.frame = CGRect(x: self.size.width*0.7,height: 60)
        PowerSlider.frame = CGRect(x: self.size.width * 0.65,height: 30)
        PowerSlider.transform = CGAffineTransformMakeRotation(CGFloat(M_PI) * 1.5)
    }else{
        AngleLabel.frame = CGRect(x: self.size.width*0.21,y: self.size.height-80,height: 60)
        AngleSlider.frame = CGRect(x: self.size.width * 0.025,y: self.size.height-30,width: self.size.width*0.45,height: 30)
        PowerLabel.frame = CGRect(x: self.size.width*0.71,height: 60)
        PowerSlider.frame = CGRect(x: self.size.width * 0.525,height: 30)
    }

    self.view?.addSubview(AngleLabel)
    self.view?.addSubview(AngleSlider)
    self.view?.addSubview(PowerLabel)
    self.view?.addSubview(PowerSlider)

}

解决方法

你这样做:
myURLRequests.getFleet(self,enemy: false){ () -> () in
    myLoadingScene.end()
}

一旦URL请求完成,可能会在后台线程上调用myLoadingScene.end(). end设置loadCount,它有一个启动新视图的setter,self.view?.presentScene(newScene)

这是需要在主线程上运行的最后一块.

假设你有一个方便的函数来在主线程上运行一些东西:

func on_main_async (closure:()->()) {
    dispatch_async(dispatch_get_main_queue()) {
        closure()
    }
}

然后您可以将场景演示代码更改为

on_main_async() { self.view?.presentScene(newScene) }

应该做的伎俩.

ios – SpriteKit在转换到新场景时收到有关UIElements的错误的更多相关文章

  1. ios – 在Sprite Kit中播放声音

    我在myScene.h中有以下代码:而这个代码在touchBegin方法中:音频文件位于主文件夹中.当我运行应用程序并触摸应用程序关闭时,我收到以下错误:我认为这是在SpriteKit中播放音频的方法,但我一定是做错了什么..解决方法从项目中删除该文件并再次添加.记得选择并选择您的项目作为目标.

  2. ios – 如何获取通过SpriteKit Editor创建的项目的SKSpriteNode?

    :-O解决方法如果在SpriteKitEditor中设置节点的name属性,则可以在Swift中访问该节点要么在Obj-C.

  3. ios – 无法使用Xcode 8和Swift 3以编程方式在SpriteKit中触发segue

    我正在使用SpriteKit在Xcode8中制作游戏,并且在编程上触发segue时非常困难.我已经进入“Main.storyboard”并在我的“GameViewController”和“MenuViewController”之间创建了一个segue,因为它标识符为“toMenu”.尝试失败#1在我的GameScene.swift文件中,我将以下代码添加到更新功能中.我的目标是每当gameIsRu

  4. ios – ARKit/SpriteKit – 将pixelBufferAttributes设置为SKVideoNode或在视频中制作透明像素(色度键效果)另一种方式

    )的视频,如您在此屏幕截图中所示:我想达到相同的效果,但是在SKVideoNode上,而不是在AVPlayerLayer上.但是,我找不到任何方法将pixelBufferAttributes设置为SKVideoNode,并且设置播放器层无法实现ARKit的预期效果,因为它已固定在位.我的问题是否有任何解决方案,或者是否有其他技术可以达到相同的预期效果?

  5. ios – 检测Sprite Collision而不在SpriteKit中反弹

    我正在使用Xcode6Beta7提前致谢!以下评论中的解决方案;)解决方法spritekit的默认行为是,除非碰撞位掩码更改为0,否则所有内容都会与所有内容发生冲突.在您不希望退回但接收来自它们的通知的所有对象中,将代码中的此值更改为0.这将阻止这些对象相互反弹.

  6. ios – 在SpriteKit中,touchesBegan在与SKScene更新方法相同的线程中运行吗?

    在这里的Apple文档AdvancedSceneProcessing中,它描述了更新方法以及场景的呈现方式,但没有提到何时处理输入.目前尚不清楚它是否与渲染循环位于同一个线程中,或者它是否与它并发.如果我有一个对象,我从SKScene更新方法和touchesBegan方法(在这种情况下是SKSpriteNode)更新,我是否要担心同步对我的对象的两次访问?解决方法所以几天后没有回答我设置了一些实验

  7. ios – SpriteKit在转换到新场景时收到有关UIElements的错误

    代码设置场景加载场景:来自GameScene的代码:解决方法你这样做:一旦URL请求完成,可能会在后台线程上调用myLoadingScene.end().end设置loadCount,它有一个启动新视图的setter,self.view?.presentScene这是需要在主线程上运行的最后一块.假设你有一个方便的函数来在主线程上运行一些东西:然后您可以将场景演示代码更改为应该做的伎俩.

  8. ios – 为什么重复创建和删除SKShapeNode和SKNode导致内存泄漏?

    使用Xcode附带的spritekit模板,我修改场景如下:该应用程序似乎继续使用更多内存,直到它挂起或崩溃.使用泄漏和分配工具,我发现了以下内容:泄漏:分配:从图像中可以看出,存在大量使用内存的Malloc调用.我不直接调用Malloc–似乎这些调用是由SpriteKit完成的.同样,存在许多内存泄漏,这似乎也是由于SKShapeNode,SKNode或其他SpriteKit对象造成的.我如何解决或解决此内存(泄漏)问题?

  9. xcode – 物理模拟的SceneKit更新方法

    我玩过精灵套件,并使用更新方法设置每个时间步骤处理的东西.我正试图学习一些快速的场景套件,似乎无法找到相应的.你能指点一下为SceneKit实现更新方法的例子吗?

  10. ios – 在Swift中对SpriteKit类进行子类化

    解决方法我不确定为什么,但SKLabelNode中隐藏的功能试图调用没有参数的init函数.这似乎有效:

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部