2015-02-10 96 views
2

嗨,我是新来的精灵套件,并且由于某些原因,使用self.frame.size.width或.height将按钮或子视图定位在场景中时,它们未居中而是有时候完全脱离屏幕。有谁知道如何将框架大小设置为iPhone/iPad的使用大小?将场景的框架设置为iPhone屏幕的大小

这里是我的代码呈现子视图时,当球员失去

func presentGameOverView() { 

    if firstTime == true { 
     let gameOverView = UIView() 
     gameOverView.frame = CGRectMake(self.frame.size.width/2.0, self.frame.size.height/2.0, 200, 200) //should be center of screen 
     gameOverView.backgroundColor = UIColor.redColor() 
     playGameOverSound() 
     self.view?.addSubview(gameOverView) 
     firstTime = false 
    } 
} 

这里是gameViewController.swift

extension SKNode { 
class func unarchiveFromFile(file : NSString) -> SKNode? { 
    if let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks") { 
     var sceneData = NSData(contentsOfFile: path, options: .DataReadingMappedIfSafe, error: nil)! 
     var archiver = NSKeyedUnarchiver(forReadingWithData: sceneData) 

     archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene") 
     let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as GameScene 
     archiver.finishDecoding() 
     return scene 
    } else { 
     return nil 
    } 
} 

}

类GameViewController的一部分:UIViewController中{

override func viewDidLoad() { 
    super.viewDidLoad() 


    if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene { 
     // Configure the view. 
     let skView = self.view as SKView 
     skView.showsFPS = true 
     skView.showsNodeCount = true 

     /* Sprite Kit applies additional optimizations to improve rendering performance */ 
     skView.ignoresSiblingOrder = true 

     /* Set the scale mode to scale to fit the window */ 
     scene.scaleMode = .AspectFill 


     //display banner Ads 
     //self.canDisplayBannerAds = true 

     skView.presentScene(scene) 
    } 
} 

回答

2

如果widthheightUIView的尺寸然后原点,对于图是在中心处,将在点

origin = (self.frame.size.width/2 - width/2, self.frame.size.height/2 - height/2) 

所以gameOverView帧应该是

let width : CGFloat = 200.0 
let height : CGFloat = 200.0 
gameOverView.frame = CGRectMake(self.frame.size.width/2 - width/2 
    , self.frame.size.height/2 - height/2, width, height) 

要不使用sks文件,在GameViewControllerviewDidLoad

override func viewDidLoad() { 
    super.viewDidLoad() 

    let scene = GameScene(size:CGSizeMake(self.view.frame.width, self.view.frame.height)) 

    let skView = self.view as SKView 
    skView.showsFPS = true 
    skView.showsNodeCount = true 

    skView.ignoresSiblingOrder = true 

    scene.scaleMode = .AspectFill 


    skView.presentScene(scene) 
} 

你也可以提取基础SKView,而不是sceneframe的框架,并为此

if let viewFrame = self.view?.frame { 
    let width : CGFloat = 200.0 
    let height : CGFloat = 200.0 
    gameOverView.frame = CGRectMake(viewFrame.size.width/2 - width/2 
     , viewFrame.size.height/2 - height/2, width, height) 
} 
+1

是啊,但由于某种原因未在gamescene出现。我不知道为什么,但框架是比屏幕尺寸大得多从未有过这种情况发生之前,当我println(self.frame.size.width) println(self.frame.size.height) 我得到1024和768 – 2015-02-10 00:34:22

+0

你使用的是sks文件吗? – rakeshbs 2015-02-10 00:34:59

+0

当我创建一个精灵场景GameScene.sks是在项目文件夹...但我所有的代码是在GameScene.swift – 2015-02-10 00:37:58