ios - 应用程序不会填满设备屏幕,启动屏幕也不会自动旋转

标签 ios swift sprite-kit xib

我有两个问题,我怀疑它们是相互关联的。

我有一个支持两种横向方向的通用应用程序。我的应用程序启动(带有界面构建器启动屏幕),然后显示 SKScene。我有三个大问题。

  1. 在 iPad 上,并且仅在 iPad(iOS 8 或 9)上,当应用程序加载时,所有图像都会丢失,只留下文本。此外,启动屏幕的显示区域比实际设备显示屏小约一厘米。这在 iPhone 上不是问题
  2. 在 iPad 上,并且出于某种原因仅在 iPad(iOS 8 或 9)上,整个应用程序周围都带有边框。我的应用程序占用的屏幕区域小于实际设备。这在 iPhone 上不是问题。
  3. 我的应用在“shouldAutoRotate()”函数中设置为自动旋转。但是我无法让启动屏幕以正确的方向启动。

我想您可能会对以下内容感兴趣:

摘录自 viewController:

import UIKit
import SpriteKit
import AVFoundation
import GameKit
import CoreData
import iAd

extension SKNode {
    class func unarchiveFromFile(file : String) -> 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
        }
    }
}

class GameViewController:  UIViewController,  SceneTransitionDelegate, GKGameCenterControllerDelegate, ADBannerViewDelegate {


    var audioPlayers:[AVAudioPlayer] = []
    var sounds:[NSURL] = []
    var nextSongDelay:NSTimer = NSTimer()
    var currentSong:AVAudioPlayer = AVAudioPlayer()
    var disp:CGFloat = 0
    var starget:String = "HI"
    var soundEffects:[AVAudioPlayer] = []

    var rwidth:CGFloat = 0
    var rheight:CGFloat = 0
    var skView:SKView { return view as! SKView }
    //var skView:SKView { return view as! SKView }
    var iadp:Bool = false

    var ar:Bool = true
    var uord:Bool = false



    override func viewDidLoad() {
        super.viewDidLoad()

        theEssence = self
        launchAudio()
        //mediumRectAdView!.delegate = self;

        let defaults = NSUserDefaults.standardUserDefaults()

        if (isAppAlreadyLaunchedOnce() == false)
        {
            defaults.setBool(false, forKey: "player")
        }


        if (defaults.boolForKey("Toothachepunlockiad") == true)
        {
            s_manualoverride.self = true
            iAdBanner.hidden = true
        }

        // Configure the view.
        let skView = self.view as! SKView
        //skView.showsFPS = true
        //skView.showsNodeCount = true
        skView.showsPhysics = false
        delli = self
        authenticateLocalPlayer()

        iAdBanner.frame = CGRectMake(0, self.view.frame.size.height, self.view.frame.width, 50)
        iAdBanner.delegate = self
        bannerVisible = false
        iAdBanner.hidden = false

        ar = true
        self.shouldAutorotate()

        transitionToScene(Menu.self)


    }
    //SceneTransitionDelegate method
    func transitionToScene(sceneClass:Scene.Type) {
        playing = false
        var sizeRect = UIScreen.mainScreen().applicationFrame
        var width = sizeRect.size.width
        var height = sizeRect.size.height
        let skView = self.view as! SKView
        let scene = sceneClass(size: skView.bounds.size)
        scene.size = CGSizeMake(width, height)
        rwidth = width
        rheight = height
        swidth = width
        sheight = height
        skView.ignoresSiblingOrder = true

        scene.scaleMode = .AspectFill
        scene.sceneDelegate = self

        skView.presentScene(scene)


    }

    func transitionToScene(sceneClass: Scene.Type, transitionAnimation: SKTransition)
    {
        playing = false
        var sizeRect = UIScreen.mainScreen().applicationFrame
        var width = sizeRect.size.width
        var height = sizeRect.size.height
        let skView = self.view as! SKView
        let scene = sceneClass(size: skView.bounds.size)

        scene.size = CGSizeMake(width, height)
        rwidth = width
        rheight = height
        swidth = width
        sheight = height
        skView.ignoresSiblingOrder = true

        scene.scaleMode = .AspectFill
        scene.sceneDelegate = self
        skView.presentScene(scene, transition: transitionAnimation)
    }


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

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

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        if (playing == true)
        {
            println("MEMORY WARNING WE ARE DIEING")
            //fatalError("MEMORY WARNING WE AARE ALL GOING TO DIE")
        }
        // Release any cached data, images, etc that aren't in use.
    }

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

    func bannerViewDidLoadAd(banner: ADBannerView!) {
        if(bannerVisible == false) {

            // Add banner Ad to the view
            if(iAdBanner.superview == nil) {
                self.view.addSubview(iAdBanner)
            }

            // Move banner into visible screen frame:
            UIView.beginAnimations("iAdBannerShow", context: nil)
            banner.frame = CGRectOffset(banner.frame, 0, -banner.frame.size.height)
            UIView.commitAnimations()

            bannerVisible = true
        }

    }

    func bannerView(banner: ADBannerView!, didFailToReceiveAdWithError error: NSError!) {
        if(bannerVisible == true) {
            // Move banner below screen frame:
            UIView.beginAnimations("iAdBannerHide", context: nil)
            banner.frame = CGRectOffset(banner.frame, 0, banner.frame.size.height)
            UIView.commitAnimations()
            bannerVisible = false
        }

    }

    func bannerViewActionShouldBegin(banner: ADBannerView!, willLeaveApplication willLeave: Bool) -> Bool {
        // Configure the view.
        let skView = self.view as! SKView
        skView.paused = true

        return true
    }

    func bannerViewActionDidFinish(banner: ADBannerView!) {
        let skView = self.view as! SKView
        skView.paused = false
    }
}

我最近做的一些事情可能触发了这个: 添加了结构崩溃报告 添加了自动旋转

Picture of it

最佳答案

我在 iPhone 6 Plus 上遇到了类似的问题。原因是缺少加载该设备显示尺寸的图像。检查您是否有所有所需尺寸和方向的加载图像。正如您在图片中看到的,Xcode 会告诉您特定图像的大小。希望这会解决您的问题。

enter image description here

关于ios - 应用程序不会填满设备屏幕,启动屏幕也不会自动旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32751740/

相关文章:

ios - Collection View 单元动画 tvOS

ios - swift api SecKeyCreateEncryptedData 使用的额外认证数据是什么?

ios - swift 2.2 : Pass value between view controllers iOS

ios - 如何使用镜像访问外部定义的类?

ios - 如何以编程方式更新 SKScene?

swift - gameScene.sks 之间的转场

ios - 使用 SpriteKit 制作 Logo 动画

ios - Xcode - iOS8 的搜索栏

ios - 在 ScrollView 中使用堆栈 View 并尊重安全区域插图

javascript - iPad HTML 网页问题