2015-01-10 10 views
6

Meine App verwendet UIBlurEffect, ältere Geräte (speziell iPads 2 und 3, die iOS 8 unterstützen) verfügen jedoch nicht über Unterstützung für Unschärfen.Überprüfen, ob das Gerät Unschärfe unterstützt

Ich möchte überprüfen, ob das Gerät des Benutzers Unschärfe unterstützt oder nicht. Wie mache ich es?

Antwort

11

hat eine interne Methode [UIDevice _graphicsQuality], die vielversprechend scheint, aber natürlich wird Ihre App von Apple abgelehnt werden. Lassen Sie uns unsere eigene Methode erstellen:

Zunächst einmal müssen wir die genauen Gerätetyp wissen wir arbeiten:

#import <sys/utsname.h> 

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

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

Diese iPad2,1 für iPad 2, beispielsweise zurückgeben sollte. Hier finden Sie eine aktualisierte Liste der iDevice-Modelle: https://theiphonewiki.com/wiki/Models

Also, lassen Sie uns unsere Gerätemodelle in zwei Gruppen einteilen: diejenigen, die schlechte Grafikqualität haben (und daher keine Unschärfe unterstützen), und solche mit hervorragender Grafikqualität. Laut meiner Untersuchung sind dies die Geräte, die Apple mit "schlechten" Grafiken betrachtet (diese könnten sich in Zukunft ändern):

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

So wir schreibe den folgenden Code:

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 
} 

Sei vorsichtig, auch wenn Das Gerät unterstützt möglicherweise Verwacklungsunschärfe. Der Benutzer kann erweiterte visuelle Effekte unter Einstellungen, Eingabehilfen deaktiviert haben.

Alternative Methode

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

+0

Wenn Sie den Simulator verwenden, ist die 'systemInfo.machine'-Eigenschaft x86_64 (auf meinem Mac); – Tjalsma

-2

Hier sind ein paar Möglichkeiten, dies zu tun:

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

Oder mit Zugang zur blurEffect Klasse

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

Es ist eigentlich eine doppelte Frage hier, obwohl der Titel es nicht wahrscheinlich machen leicht zu finden: How do I do weak linking in Swift?

- Bearbeiten -

Die Frage missverstanden. Es scheint kein Weg, dies kurz, um herauszufinden, von den Gerätenamen überprüft:

Detect if device properly displays UIVisualEffectView?

Ich würde darauf verlassen, was auch immer Apple Ausweich Implementierung ist. Es sieht so aus, als ob sie immer noch die Tönungsfarbe anwenden, was wahrscheinlich in den meisten Fällen gut ist. Wenn Sie wirklich das Aussehen ändern müssen, wenn keine Unschärfe angewendet wird, denke ich, dass der Gerätename nicht schrecklich ist, da sie speziell umrissen haben, welche Geräte keine Unschärfe unterstützen.

+0

Das wird nicht funktionieren, weil da das Gerät mit iOS 8, wird die Klasse existiert, aber auf den älteren Geräten wird die Unschärfe Ansicht nicht gleich gemacht werden So wie es die neuen Geräte tun. – Guilherme

+0

Tut mir leid, habe das letzte Stück der Frage nicht bemerkt. Ich glaube, es gibt keine Möglichkeit, dies zu überprüfen, ohne den Namen des Geräts zu überprüfen. – bjtitus

2

Vielen Dank tun Daniel Martin für die große Antwort. Ich habe eine UIDevice Kategorie gemacht, dass die folgenden Prüfungen zur Verfügbarkeit der Unschärfe-Effekt kombiniert:

  1. iOS Version

  2. Gerätetyp (dank Daniel Martin)

  3. Privat UIDevice Methode _graphicsQuality beim Bauen für den Simulator. (Dies, da die Gerätetypprüfung durchgeführt wird, nicht im Simulator arbeiten - kompiliert werden, wenn für ARM-Architekturen Aufbau)

  4. ‚Reduce Transparenz‘ Zugänglichkeit

Einstellung Ich habe ein gemachter Kern enthält die Kategorie: https://gist.github.com/mortenbekditlevsen/5a0ee16b73a084ba404d

Und eine kleine Zuschreibung über das Thema als Ganzes:

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

Hinweis: Vergessen Sie bei der Verwendung des Hauptfensters nicht, die

 UIAccessibilityReduceTransparencyStatusDidChangeNotification
Benachrichtigung zu abonnieren, um die Benutzeroberfläche zu aktualisieren, wenn sich die Eingabehilfeneinstellung ändert.

Ich hoffe, dass jemand das nützlich findet. :-)

5

Hier ist eine schnelle Version von Daniel Martins Antwort. Einige der Code wurde von here angepasst:

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 
}