Ios 特定设备的缩放

Ios 特定设备的缩放,ios,iphone,swift,ipad,Ios,Iphone,Swift,Ipad,我在尝试使我的SpriteKit游戏在所有设备上兼容时遇到了一些问题。我了解Image.xcsets的工作原理,以及如何在放置节点时参考手机框架 例如,我的游戏在6、6+和iPad上看起来不错。不幸的是,对于早期的iphone来说,它是最重要的。一个简单的解决方法就是参照屏幕顶部,如下所示: node.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMaxY(self.frame) - 5) 这适用于所有手机,但不适用于iP

我在尝试使我的SpriteKit游戏在所有设备上兼容时遇到了一些问题。我了解Image.xcsets的工作原理,以及如何在放置节点时参考手机框架

例如,我的游戏在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”)


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

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

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
}
然后对每个设备执行此操作。这显然有点乏味,但它应该能起作用。
同样在上面,我没有列出iPad的规格,但你只需计算出它们的屏幕高度,就可以很容易地提供这些规格。希望这有帮助

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

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
}
然后对每个设备执行此操作。这显然有点乏味,但它应该能起作用。
同样在上面,我没有列出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。。一个

在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。。一个

这太好了。然而,我在“屏幕大小”上得到了未解析的标识符。我需要导入其他类型的核心库吗?我需要为结构声明一些东西吗?(谢谢,我是新来的)@lucasazzopardi在上面的代码中,我的屏幕尺寸是1。。把它改成那样,它应该会起作用。或者简单地将屏幕大小1更改为屏幕大小这很好。然而,我在“屏幕大小”上得到了未解析的标识符。我需要导入其他类型的核心库吗?我需要为结构声明一些东西吗?(谢谢,我是新来的)@lucasazzopardi在上面的代码中,我的屏幕尺寸是1。。把它改成那样,它应该会起作用。或者简单地将ScreenSize1改为screensize这似乎很有效,我已经尝试了几种方法来实现它。如果我没有弄错的话,三元运算符的作用方式与条件运算符类似。如果是这样的话,为什么我总是收到一个要求声明的错误?我对这种方法的确切语法实现有点困惑。谢谢,我对编程很陌生@Larcerax不确定你做的是对是错,但下一个最好的选择是尝试一下,一秒钟。重新阅读我给你的答案,只需输入代码就可以了,你可能会遇到一个声明问题,因为我给你的这个调用方法是针对具有一些非常定制约束的IBOutlet的,现在就试试。我会接受你的答案的,谢谢。我的所有节点的声明都不同。也就是说,作为一个引用一个SKspritenode的SKspritenode。话虽如此,重写所有内容将是一件麻烦事。我可以用同样的技术来处理一个普通的if语句而不是三元运算符吗?这似乎很有效,我已经尝试了几种方法来实现它。如果我没有弄错的话,三元运算符的作用方式与条件运算符类似。如果是这样的话,为什么我总是收到一个要求声明的错误?我对这种方法的确切语法实现有点困惑。谢谢,我对编程很陌生@Larcerax不确定你做的是对是错,但下一个最好的选择是尝试一下,一秒钟。重新阅读我给你的答案,只需输入代码就可以了,你可能会遇到一个声明问题,因为我给你的这个调用方法是针对具有一些非常定制约束的IBOutlet的,现在就试试。我会接受你的答案的,谢谢。我的所有节点的声明都不同。也就是说,作为一个引用一个SKspritenode的SKspritenode。话虽如此,重写所有内容将是一件麻烦事。我可以用同样的方法来处理一个普通的if语句而不是三元运算符吗?