2015-01-10 48 views
6

Ứng dụng của tôi sử dụng UIBlurEffect, tuy nhiên các thiết bị cũ hơn (đặc biệt là iPad 2 và 3, hỗ trợ iOS 8) không hỗ trợ làm mờ.Kiểm tra xem thiết bị có hỗ trợ blur

Tôi muốn kiểm tra xem thiết bị của người dùng có hỗ trợ mờ hay không. Tôi phải làm nó như thế nào?

Trả lời

11

có phương thức nội bộ [UIDevice _graphicsQuality] có vẻ đầy hứa hẹn, nhưng tất nhiên ứng dụng của bạn sẽ bị Apple từ chối. Hãy tạo phương pháp riêng của chúng tôi:

Trước hết, chúng ta cần phải biết loại thiết bị chính xác, chúng tôi đang làm việc trên:

#import <sys/utsname.h> 

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

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

này sẽ trả về iPad2,1 cho iPad 2, ví dụ. Dưới đây là danh sách cập nhật các mô hình iDevice: https://theiphonewiki.com/wiki/Models

Vì vậy, hãy phân loại mô hình thiết bị của chúng tôi thành hai nhóm: những người có chất lượng đồ họa kém (và do đó không hỗ trợ làm mờ) và những người có chất lượng đồ họa tuyệt vời. Theo điều tra của tôi, đây là những thiết bị mà Apple xem xét với đồ họa "nghèo" (những điều này có thể thay đổi trong tương lai):

iPad iPad1,1 iPhone1, 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

Vì vậy, chúng tôi viết mã sau đây:

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 
} 

Hãy cẩn thận vì mặc dù thiết bị có thể hỗ trợ làm mờ, người dùng có thể đã tắt hiệu ứng hình ảnh nâng cao từ Cài đặt, Trợ năng.

phương pháp thay thế

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

+0

Khi sử dụng Trình mô phỏng, thuộc tính 'systemInfo.machine' là x86_64 (trên máy Mac của tôi); – Tjalsma

-2

Dưới đây là một số cách để làm điều này:

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

Hoặc với quyền truy cập vào các lớp blurEffect

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

Có thực sự là một câu hỏi trùng lặp ở đây, mặc dù tiêu đề có lẽ không làm cho nó dễ tìm: How do I do weak linking in Swift?

- Chỉnh sửa -

Hiểu sai câu hỏi. Có vẻ như không có cách nào để tìm thấy điều này ra ngắn kiểm tra tên thiết bị:

Detect if device properly displays UIVisualEffectView?

tôi sẽ dựa vào bất cứ triển khai dự trữ của Apple là. Có vẻ như họ vẫn áp dụng màu sắc tint vì vậy có lẽ tốt trong hầu hết các trường hợp. Nếu bạn thực sự phải thay đổi diện mạo khi không làm mờ sẽ được áp dụng, tôi nghĩ tên thiết bị không phải là khủng khiếp vì chúng đã vạch ra cụ thể những thiết bị nào không hỗ trợ làm mờ.

+0

này sẽ không làm việc, bởi vì kể từ khi thiết bị đang chạy iOS 8, lớp không tồn tại, nhưng trên các thiết bị cũ, quan điểm mờ sẽ không được trả lại cùng theo cách của các thiết bị mới. – Guilherme

+0

Xin lỗi, không nhận thấy phần cuối của câu hỏi. Tôi tin rằng không có cách nào để kiểm tra điều này mà không kiểm tra tên của thiết bị. – bjtitus

2

Rất cám ơn làm Daniel Martin cho câu trả lời tuyệt vời. Tôi đã thực hiện một loại UIDevice kết hợp kiểm tra sau đây cho khả dụng của các hiệu ứng mờ ảo:

  1. phiên bản iOS

  2. Loại thiết bị (nhờ Daniel Martin)

  3. UIDevice Private phương pháp _graphicsQuality khi xây dựng cho trình mô phỏng. (Điều này được thực hiện kể từ khi loại thiết bị kiểm tra không hoạt động trong mô phỏng - sẽ được biên dịch ra khi xây dựng cho các kiến ​​trúc cánh tay)

  4. 'Giảm minh bạch' thiết

khả năng tiếp cận tôi đã thực hiện một ý chính chứa các loại: https://gist.github.com/mortenbekditlevsen/5a0ee16b73a084ba404d

Và một writeup nhỏ về vấn đề như một toàn thể:

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

Lưu ý: Khi sử dụng ý chính, đừng quên đăng ký thông báo

 UIAccessibilityReduceTransparencyStatusDidChangeNotification
để làm mới giao diện người dùng khi cài đặt trợ năng thay đổi.

Tôi hy vọng rằng ai đó thấy điều này hữu ích. :-)

5

Đây là phiên bản Swift của câu trả lời của Daniel Martin. Một số mã đã được chuyển thể từ 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 
} 
Các vấn đề liên quan