检查设备是否支持模糊

时间:2015-01-10 17:02:17

标签: ios swift uiblureffect

我的应用使用UIBlurEffect,但是较旧的设备(特别是iPad 2和3,支持iOS 8)不具备模糊支持。

我想检查用户的设备是否支持模糊。我该怎么做?

3 个答案:

答案 0 :(得分:12)

UIDevice有一个内部方法[UIDevice _graphicsQuality]似乎很有希望,但当然你的应用程序将被Apple拒绝。让我们创建自己的方法:

首先,我们需要知道我们正在处理的确切设备类型:

#import <sys/utsname.h>

NSString* deviceName()
{
    struct utsname systemInfo;
    uname(&systemInfo);

    return [NSString stringWithCString:systemInfo.machine
                              encoding:NSUTF8StringEncoding];
}

例如,这应该为iPad 2返回iPad2,1。以下是iDevice模型的更新列表:https://theiphonewiki.com/wiki/Models

因此,让我们将设备模型分为两组:图形质量差(因此不支持模糊),以及具有出色图形质量的设备模型。根据我的调查,这些是Apple认为具有“差”图形的设备(这些可能会在未来发生变化):

  iPad iPad1,1 iPhone1,1 iPhone1,2 iPhone2,1 iPhone3,1 iPhone3,2   iPhone3,3 iPod1,1 iPod2,1 iPod2,2 iPod3,1 iPod4,1 iPad2,1 iPad2,2   iPad2,3 iPad2,4 iPad3,1 iPad3,2 iPad3,3

所以我们编写以下代码:

NSSet *graphicsQuality = [NSSet setWithObjects:@"iPad",
                                                     @"iPad1,1",
                                                     @"iPhone1,1",
                                                     @"iPhone1,2",
                                                     @"iPhone2,1",
                                                     @"iPhone3,1",
                                                     @"iPhone3,2",
                                                     @"iPhone3,3",
                                                     @"iPod1,1",
                                                     @"iPod2,1",
                                                     @"iPod2,2",
                                                     @"iPod3,1",
                                                     @"iPod4,1",
                                                     @"iPad2,1",
                                                     @"iPad2,2",
                                                     @"iPad2,3",
                                                     @"iPad2,4",
                                                     @"iPad3,1",
                                                     @"iPad3,2",
                                                     @"iPad3,3",
                                                     nil];
 if ([graphicsQuality containsObject:deviceName()]) {
     // Device with poor graphics, blur not supported
 } else {
     // Blur supported
 }

请注意,即使设备可能支持模糊,用户也可能已禁用“设置”,“辅助功能”中的高级视觉效果。

替代方法

https://gist.github.com/conradev/8655650

答案 1 :(得分:2)

非常感谢Daniel Martin的出色回答。 我已经制作了一个UIDevice类别,它结合了以下检查模糊效果的可用性:

  1. iOS版

  2. 设备类型(感谢Daniel Martin)

  3. 为模拟器构建时的私有UIDevice方法_graphicsQuality。 (这是因为设备类型检查在模拟器中不起作用 - 将在构建臂架构时编译出来)

  4. '降低透明度'辅助功能设置

  5. 我已经提出了一个包含以下类别的要点: https://gist.github.com/mortenbekditlevsen/5a0ee16b73a084ba404d

    关于整个问题的小文章:

    http://mojoapps.dk/?p=1

    注意:使用要点时,请不要忘记订阅

     UIAccessibilityReduceTransparencyStatusDidChangeNotification
    通知,以便在辅助功能设置更改时刷新用户界面。

    我希望有人觉得这很有用。 : - )

答案 2 :(得分:-2)

以下是一些方法:

if objc_getClass("UIBlurEffect") != nil {
   // UIBlurEffect exists
} else {
   // UIBlurEffect doesn't exist
}

或访问blurEffect类

if let blurEffect: AnyClass = NSClassFromString("UIBlurEffect") {
    // UIBlurEffect exists
} else {
    // UIBlurEffect doesn't exist
}

这里实际上有一个重复的问题,虽然标题可能不容易找到:How do I do weak linking in Swift?

- 编辑 -

误解了这个问题。似乎没有办法找到这个没有检查设备名称:

Detect if device properly displays UIVisualEffectView?

我会依赖Apple的后备实施。看起来他们仍然应用色调颜色,因此在大多数情况下可能很好。如果你真的必须在没有应用模糊的情况下改变外观,我认为设备名称并不可怕,因为它们特别概述了哪些设备不支持模糊。