应用程序不会填满设备屏幕,启动屏幕也不会自动旋转
Posted
技术标签:
【中文标题】应用程序不会填满设备屏幕,启动屏幕也不会自动旋转【英文标题】:App does not fill up device screen, nor does launch screen autorotate 【发布时间】:2015-09-24 00:55:27 【问题描述】:我有两个我怀疑是相互关联的问题。
我有一个支持两个横向方向的通用应用程序。我的应用程序启动(带有界面构建器启动屏幕),然后显示 SKScene。我有三个大问题。
-
在 ipad 上,并且仅在 iPad(ios 8 或 9)上,当应用程序加载时,所有图像都会从其中丢失,只留下文本。此外,启动屏幕的显示区域比实际设备显示小一厘米左右。这在 iPhone 上不是问题
在 ipad 上,并且出于某种原因仅在 iPad(iOS 8 或 9)上,整个应用程序都会出现边框。我的应用程序占用的屏幕区域小于实际设备。这在 iPhone 上不是问题。
我的应用程序设置为在“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
我最近做的一些事情可能会引发这种情况: 添加了结构崩溃报告 为其添加了自动旋转
【问题讨论】:
你能检查一下项目或目标的设置是否以某种方式仅适用于 iphone 吗? 【参考方案1】:我在 iPhone 6 Plus 上遇到过类似的问题。原因是缺少加载该设备显示尺寸的图像。检查您是否已加载所有所需尺寸和方向的图像。正如您在图片中看到的,Xcode 会告诉您特定图像的大小。希望这能解决您的问题。
【讨论】:
不幸的是,我使用的是界面构建器文件而不是启动图像。 @J.Doe 我似乎记得我的一个应用程序中存在类似问题。如果您的部署目标小于“启动屏幕支持”版本,您可能必须添加启动图像。也可能只需要存在启动图像文件。 (我现在无法检查,因为我必须查看该项目的 git 历史记录,而我现在没有足够的时间。但我相信我添加了虚拟启动图像来修复它。)以上是关于应用程序不会填满设备屏幕,启动屏幕也不会自动旋转的主要内容,如果未能解决你的问题,请参考以下文章
iOS 7 应用程序不会在 Xcode 6 模拟器中填满整个屏幕
即使指定了“match_parent”,使用 ConstraintLayout 的 RecyclerView 项目也不会填满屏幕的整个宽度