【问题标题】:How can I detect if an iOS device supports the blur effect?如何检测 iOS 设备是否支持模糊效果?
【发布时间】:2013-10-25 01:54:47
【问题描述】:

似乎不同的 iOS 设备呈现 UINavigationBars 与 barStyle = UIBarStyleBlacktranslucent = YES 非常不同。考虑:

iPhone 4,无色调:

iPhone 5,无色调:

iPhone 4, barTintColor = [UIColor colorWithWhite:0.0f alpha:0.5f]:

iPhone 5,barTintColor = [UIColor colorWithWhite:0.0f alpha:0.5f]

iPhone 5 可以产生想要的效果,但没有色调,但 4 是不透明的。添加半透明色调使 4 看起来不错,但搞砸了 5。

同样适用于 iPad 2 和 3,理论上任何不支持 iOS 7 模糊效果的设备。

没有将这些旧设备列入黑名单,我如何检测设备是否支持模糊处理,以便有条件地解决渲染差异?或者有没有办法在不使用色调的情况下使外观正常化?

【问题讨论】:

  • 尽管自 beta 种子 1 以来开发人员一直在请求它,但没有用于此的公共 API。检查设备型号不是解决方案,因为用户可以在较新的设备上将其关闭。
  • @FilipRadelic 哇,真的吗?如何在较新的设备上禁用该效果?
  • 设置 -> 常规 -> 辅助功能 -> 增加对比度

标签: iphone ios ipad ios7


【解决方案1】:

这个 UIDevice 类别以及观察 UIAccessibilityReduceTransparencyStatusDidChangeNotification 怎么样?

@interface UIDevice (Additions)

@property (readonly) NSString *platform;
@property (readonly) BOOL canBlur;

@end


@implementation UIDevice (Additions)

- (NSString *)platform {
    int mib[] = { CTL_HW, HW_MACHINE };
    size_t len = 0;
    sysctl(mib, 2, NULL, &len, NULL, 0);
    char *machine = malloc(len);
    sysctl(mib, 2, machine, &len, NULL, 0);
    NSString *platform = [NSString stringWithCString:machine encoding:NSASCIIStringEncoding];
    free(machine);

    return platform;
}

- (BOOL)canBlur {
    if(NSStringFromClass([UIVisualEffectView class]) && UIDevice.currentDevice.systemVersion.floatValue >= 8.0 && !UIAccessibilityIsReduceTransparencyEnabled()) {
        NSString *platform = self.platform;
        CGFloat deviceVersion = [[[platform stringByReplacingOccurrencesOfString:@"[^0-9,.]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, platform.length)] stringByReplacingOccurrencesOfString:@"," withString:@"."] floatValue];

        if([platform isEqualToString:@"i386"] || [platform isEqualToString:@"x86_64"]) {
            return YES;
        } else if([platform rangeOfString:@"iPhone"].location != NSNotFound) {
            return (deviceVersion >= 4.1);
        } else if([platform rangeOfString:@"iPod"].location != NSNotFound) {
            return (deviceVersion >= 5.1);
        } else if([platform rangeOfString:@"iPad"].location != NSNotFound) {
            return (deviceVersion >= 3.4);
        }
    }

    return NO;
}

不要忘记在你的实现文件中添加#include。

【讨论】:

    【解决方案2】:

    我认为这个问题是你想要做的。只是为不同的设备编写条件代码:

    Determine device (iPhone, iPod Touch) with iPhone SDK

    【讨论】:

    • 就像我在问题中所说的那样,这是一种在大多数情况下都有效的解决方法,但它不是真正的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多