【问题标题】:Scaling for specific devices针对特定设备进行缩放
【发布时间】:2015-08-27 23:20:45
【问题描述】:

我在尝试使我的 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”)。

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

【问题讨论】:

    标签: ios iphone swift ipad


    【解决方案1】:

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

    【讨论】:

    • 这似乎很有效,我已经尝试以多种方式实现它。如果我没记错的话,三元运算符的功能类似于条件。如果是这样,为什么我一直收到要求声明的错误?我对这种方法的确切语法实现有点困惑。谢谢,我对编程很陌生。 @Larcerax
    • 不确定你做错了什么,但下一个最好的选择是试试这个,一秒钟。
    • 重读我给你的答案,然后把代码放进去看看它是否有效
    • 你可能遇到了一个声明问题,因为我给你的这个调用方法是针对一个带有一些非常定制的约束的 IBOutlet,现在试试吧。
    • 继续接受您的回答,谢谢。我所有的节点都以不同的方式声明。 IE。作为引用 SKTexture 的 SKspritenode。话虽如此,重写所有内容会很麻烦。我可以将这种技术与普通的 if 语句而不是三元运算符一起使用吗?
    【解决方案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 规格,但您只需计算出它们的屏幕高度即可轻松提供这些规格。希望这会有所帮助!

    【讨论】:

    • 这很棒。但是我在“ScreenSize”上得到了未解析的标识符。我需要导入某种其他核心库吗?我需要为结构声明一些东西吗? (谢谢我很新)@LucasAzzopardi
    • 在上面的代码中,我将它作为 ScreenSize1.. 将其更改为该代码,它应该可以工作。或者只是将 ScreenSize1 更改为 ScreenSize
    猜你喜欢
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    相关资源
    最近更新 更多