扩展特定设备

时间:2015-08-27 23:20:46

标签: ios iphone swift ipad

我遇到了一些问题,试图让我的SpriteKit游戏在所有设备上兼容。我理解Image.xcassets的工作原理,以及如何在放置节点时引用电话框架。

例如,我的游戏在6,6 +和iPad上看起来很好。不幸的是,它在早期的iPhone中排名第一。一个简单的解决方法就是像这样引用屏幕顶部:

node.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMaxY(self.frame) - 5)

这适用于所有手机,但不适用于iPad

然而,如果我像这样引用设备的顶部,那么在iPad上面的上部节点离屏幕太远,以至于英雄无法与它们交互。

我的代码编写用于定位节点的当前方式只是通过使用其他节点来构建:

node.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMinY(self.frame) + node2.size.height + node3.size.height)

这适用于6,6 +和iPad

我怎样才能使所有设备兼容?我知道我可以调整“2x”图像,因此它可以适合5和5s,但是它会使游戏机制掉落6(因为6和5系列由于某种原因共享“2x”)。

有没有办法可以专门测试在某个设备上使用,然后在这种情况下运行某些代码?有什么解决方案吗?感谢。

2 个答案:

答案 0 :(得分:3)

这更容易在Swift中使用三元运算符:

这会检查高度大于iphone 6+的大小,这意味着它的大小将超过iphone 6+。一个iPad,然后相应地设置一个自定义尺寸的图像,你甚至可以使用卢卡斯'他在上面发布的宏:

asdf!.qrImageView.image = UIScreen.mainScreen().bounds.height  > 736 ? UIImage(named: "check") : UIImage(named: "bubbles")

下面有'完整的代码,现在试试这个,显然根据你的需要改变图像,上面的调用是使用非常自定义的UIView子类,下次调用不是,它使用的是UIImageView:

override func viewDidLoad() {

    super.viewDidLoad()

    var floatiesW = 200 as CGFloat
    var floatiesH = 200 as CGFloat

    var asdf = UIImageView()
    asdf.backgroundColor = UIColor.redColor()
    asdf.frame = CGRectMake((self.view.bounds.width/2.0) - (floatiesW/2.0), (self.view.bounds.height/2.0) - (floatiesH/2.0), floatiesW, floatiesH)
    asdf.image = self.view.bounds.height  > 736 ? UIImage(named: "check") : UIImage(named: "bubbles")
    self.view.addSubview(asdf)
}

和此:

UIScreen.mainScreen().bounds.height  > 736 ? UIImage(named: "check") : UIImage(named: "bubbles")

在大多数情况下可以与此交换:

self.view.bounds.height  > 736 ? UIImage(named: "check") : UIImage(named: "bubbles")

但要小心,你应该使用UIScreen.main ..一个

答案 1 :(得分:2)

将此代码放在导入下方以检查用户正在运行的设备类型。

enum UIUserInterfaceIdiom1 : Int
{
case Unspecified
case Phone
case Pad
}

struct ScreenSize1
{
static let SCREEN_WIDTH = UIScreen.mainScreen().bounds.size.width
static let SCREEN_HEIGHT = UIScreen.mainScreen().bounds.size.height
static let SCREEN_MAX_LENGTH = max(ScreenSize.SCREEN_WIDTH,      ScreenSize.SCREEN_HEIGHT)
static let SCREEN_MIN_LENGTH = min(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT)
}

struct DeviceType1
{
static let IS_IPHONE_4_OR_LESS =  UIDevice.currentDevice().userInterfaceIdiom == .Phone && ScreenSize.SCREEN_MAX_LENGTH < 568.0
static let IS_IPHONE_5 = UIDevice.currentDevice().userInterfaceIdiom == .Phone && ScreenSize.SCREEN_MAX_LENGTH == 568.0
static let IS_IPHONE_6 = UIDevice.currentDevice().userInterfaceIdiom == .Phone && ScreenSize.SCREEN_MAX_LENGTH == 667.0
static let IS_IPHONE_6P = UIDevice.currentDevice().userInterfaceIdiom == .Phone && ScreenSize.SCREEN_MAX_LENGTH == 736.0
}

然后在viewDidLoad做一个简单的if statement,以查看正在使用的设备,然后在每个设备下运行必要的代码。

if UIDevice.currentDevice().userInterfaceIdiom == .Phone && ScreenSize.SCREEN_MAX_LENGTH < 568.0 {
        println("Iphone 4s")
        // put code here
    }

然后为每个设备执行此操作。显然有点单调乏味,但它应该可以解决问题。 另外上面我没有列出iPad规格,但你可以通过弄清楚它们的屏幕高度轻松提供这些规格。希望这有帮助!