9

看起来不同的 iOS 设备渲染UINavigationBarsbarStyle = UIBarStyleBlack并且translucent = YES非常不同。考虑:

iPhone 4,无色调: iPhone 4,无色调

iPhone 5,无色调: iPhone 5,无色调

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

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

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

iPad 2 和 3 以及理论上任何不支持 iOS 7 模糊效果的设备也是如此。

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

4

2 回答 2

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 在你的实现文件中。

于 2014-11-22T04:01:47.443 回答
0

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

使用 iPhone SDK 确定设备(iPhone、iPod Touch)

于 2013-11-12T03:31:19.163 回答