针对特定设备的缩放

Scaling for specific devices

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

例如,我的游戏在 6、6+ 和 iPad 上看起来不错。不幸的是,对于早期的 iPhone,它的顶部被切断了。一个简单的解决方法就是像这样引用屏幕顶部:

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

这适用于所有 phone,但不适用于 iPad

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

目前我编写用于定位节点的代码的方式只是使用其他节点构建在以下基础上:

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

这适用于 6、6+ 和 iPads

我怎样才能做到在所有设备上都兼容?我知道我可以调整“2x”图像,使其适合 5 和 5s,但随后它会抛弃 6 的游戏机制(因为 6 和 5 系列出于某种原因共享“2x”)。

有没有一种方法可以专门测试在特定设备上的使用情况,然后在那种情况下使用特定代码 运行?有什么解决办法吗?谢谢

将此代码放在导入的正下方,以检查用户正在使用哪种设备 运行ning。

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 规格,但您只需计算出它们的屏幕高度就可以轻松提供这些规格。希望这对您有所帮助!

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

这会检查高度大于 iphone 6+ 的尺寸,这意味着它是一个 iPad,然后相应地设置自定义尺寸的图像,您甚至可以使用他发布的 Lucas 宏以上:

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 .. one