2015-01-10 3 views
6

Мое приложение использует UIBlurEffect, однако старые устройства (в частности, iPads 2 и 3, поддерживающие iOS 8) не имеют поддержки размытия.Проверьте, поддерживает ли устройство размытие

Я хочу проверить, поддерживает ли пользовательское устройство размытие или нет. Как мне это сделать?

ответ

11

UIDevice имеет внутренний метод [UIDevice _graphicsQuality], который кажется многообещающим, но, конечно же, ваше приложение будет отклонено Apple. Давайте создадим наш собственный метод:

Прежде всего, нам нужно знать тип точного устройства мы работаем на:

#import <sys/utsname.h> 

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

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

Это должно вернуть iPad2,1 для IPad 2, например. Вот обновленный список моделей 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

+0

При использовании Simulator свойство 'systemInfo.machine' - x86_64 (на моем Mac); – Tjalsma

-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?

- Edit -

Непонятный вопрос. Там, кажется, не будет никакого способа узнать это короткое проверки имя устройства:

Detect if device properly displays UIVisualEffectView?

Я бы рассчитывать на то, что реализация запасной вариант от Apple является. Похоже, что они по-прежнему применяют цвет оттенков, поэтому, вероятно, это нормально в большинстве случаев. Если вы действительно должны изменить внешний вид, когда не будет применено размытие, я думаю, что имя устройства не страшное, поскольку они специально обозначили, какие устройства не поддерживают размытие.

+0

Это не будет работать, потому что, так как устройство работает под управлением IOS 8 класс существует, но на старых устройствах, вид размытия не будет оказано то же как это делают новые устройства. – Guilherme

+0

Извините, не заметил последнего вопроса. Я считаю, что нет возможности проверить это, не проверяя имя устройства. – bjtitus

2

Большое спасибо сделать Daniel Martin за большой ответ. Я сделал категорию UIDevice, которая сочетает в себе следующие проверки на предмет наличия эффекта размытия:

  1. IOS версии

  2. Тип устройства (благодаря Daniel Martin)

  3. Частный UIDevice метод _graphicsQuality при создании для симулятора. (Это делается с проверки типа устройства не работает в тренажере - будет составлена ​​из строя для рук архитектур)

  4. «Снижение прозрачности» настройка

доступности Я сделал Сущность, содержащая категорию: https://gist.github.com/mortenbekditlevsen/5a0ee16b73a084ba404d

И небольшой поподробнее о проблеме в целом:

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

Примечание: при использовании сущности не забудьте подписаться на уведомление

 UIAccessibilityReduceTransparencyStatusDidChangeNotification
, чтобы обновить пользовательский интерфейс при изменении параметра доступности.

Я надеюсь, что кто-то посчитает это полезным. :-)

5

Вот краткая версия ответа Даниэля Мартина. Часть кода была заимствована из here:

func isBlurSupported() -> Bool { 
    var supported = Set<String>() 
    supported.insert("iPad") 
    supported.insert("iPad1,1") 
    supported.insert("iPhone1,1") 
    supported.insert("iPhone1,2") 
    supported.insert("iPhone2,1") 
    supported.insert("iPhone3,1") 
    supported.insert("iPhone3,2") 
    supported.insert("iPhone3,3") 
    supported.insert("iPod1,1") 
    supported.insert("iPod2,1") 
    supported.insert("iPod2,2") 
    supported.insert("iPod3,1") 
    supported.insert("iPod4,1") 
    supported.insert("iPad2,1") 
    supported.insert("iPad2,2") 
    supported.insert("iPad2,3") 
    supported.insert("iPad2,4") 
    supported.insert("iPad3,1") 
    supported.insert("iPad3,2") 
    supported.insert("iPad3,3") 

    return !supported.contains(hardwareString()) 
} 

func hardwareString() -> String { 
    var name: [Int32] = [CTL_HW, HW_MACHINE] 
    var size: Int = 2 
    sysctl(&name, 2, nil, &size, &name, 0) 
    var hw_machine = [CChar](count: Int(size), repeatedValue: 0) 
    sysctl(&name, 2, &hw_machine, &size, &name, 0) 

    let hardware: String = String.fromCString(hw_machine)! 
    return hardware 
} 
Смежные вопросы