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 Foundationimport SpriteKitclass 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的错误全部内容,希望文章能够帮你解决ios – SpriteKit在转换到新场景时收到有关UIElements的错误所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)