Jor*_*n H 10 ios uiaccessibility swift
我想检测用户是否已启用Reduce Transparency.你只需要调用func就可以了UIAccessibilityIsReduceMotionEnabled(),它会返回一个Bool.但我的应用程序针对的是iOS 7和8,并且此功能在iOS 7上不可用.
在Objective-C中,这是我检查该函数是否存在的方式:
if (UIAccessibilityIsReduceMotionEnabled != NULL) { }
Run Code Online (Sandbox Code Playgroud)
在Swift中,我无法弄清楚如何检查它是否存在.根据这个答案,您可以简单地使用可选链接,如果它nil不存在,但显然仅限于Obj-C协议.Xcode 6.1不喜欢这样:
let reduceMotionDetectionIsAvailable = UIAccessibilityIsReduceMotionEnabled?()
Run Code Online (Sandbox Code Playgroud)
它要你删除?当然,如果你这样做,它将在iOS 7上崩溃,因为该功能不存在.
检查这些类型的函数是否存在的正确方法是什么?
Swift 2中添加了适当的可用性检查.建议使用此处提到的其他选项.
var shouldApplyMotionEffects = true
if #available(iOS 8.0, *) {
shouldApplyMotionEffects = !UIAccessibilityIsReduceMotionEnabled()
}
Run Code Online (Sandbox Code Playgroud)
如果你有点厚颜无耻,你可以随时使用库加载器打开UIKit二进制文件,看看它是否可以解析符号:
let uikitbundle = NSBundle(forClass: UIView.self)
let uikit = dlopen(uikitbundle.executablePath!, RTLD_LAZY)
let handle = dlsym(uikit, "UIAccessibilityIsReduceMotionEnabled")
if handle == nil {
println("Not available!")
} else {
println("Available!")
}
Run Code Online (Sandbox Code Playgroud)
该dlopen和dlsym电话可以是有点贵,但这样我会建议保持dlopen手柄打开应用程序的寿命和存储某处的努力的结果dlsym.如果你不这样做,请确保你dlclose.
据我所知,这是AppStore的安全,因为它UIAccessibilityIsReduceMotionEnabled是一个公共API.