15

试用 iOS 7:

[[UINavigationBar appearance] setTranslucent:NO];

出现崩溃和错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** Illegal property type, c for appearance setter, _installAppearanceSwizzleForSetter:'
*** First throw call stack:
(0x16ad9b8 0x142e8b6 0x16ad7ab 0x72163d 0x724c34 0x169daca 0x169d8de 0x6c09 0x228ea9 0x2296e9 0x22ab5e 0x240a6c 0x240fd9 0x22c7d5 0x35a4906 0x35a4411 0x16293e5 0x162911b 0x1653b30 0x165310d 0x1652f3b 0x22a2b1 0x22c4eb 0x6f3d 0x1d0d725)
libc++abi.dylib: terminating with uncaught exception of type NSException

其他电话工作正常:例如。

[[UINavigationBar appearance] setBarStyle: UIBarStyleBlack];

当我在本地设置半透明时,它不会崩溃:

[self.navigationController.navigationBar setTranslucent:NO];

我假设这是特定于 iOS 7 的,但还没有在 iOS 6 中尝试过同样的事情。

4

4 回答 4

17
[[UINavigationBar appearance] setTranslucent:NO] 

它在 iOS 6 中不可用。它仅在 iOS 7 及更高版本中可用。

于 2013-07-05T05:46:36.770 回答
1

这是解决它的代码。问题是 UIAppearance 不适用于 BOOL 类型。这不应该成为应用程序拒绝的理由,因为它使用标准(尽管是 hacky)程序。玩得开心。

@protocol _UITranslucentThingHack
@property (nonatomic) BOOL translucent;
@end

@interface UIView (_UITranslucentAppearanceProxyHack)
@property (nonatomic) NSNumber * translucentPropertyAsObject;
@end

@implementation UIView (_UITranslucentAppearanceProxyHack)

-(void)setTranslucentPropertyAsObject:(NSNumber *)translucentPropertyAsObject {
    if([self respondsToSelector:@selector(setTranslucent:)]) {
        id<_UITranslucentThingHack> trans = (id)self;
        trans.translucent = [translucentPropertyAsObject boolValue];
    }
}

-(NSNumber*)translucentPropertyAsObject {
    if([self respondsToSelector:@selector(setTranslucent:)]) {
        id<_UITranslucentThingHack> trans = (id)self;
        return @(trans.translucent);
    }
    return nil;
}

@end
于 2014-02-28T02:17:37.527 回答
1

我用我自己的类别解决了它,这样我仍然可以像正常方式一样使用 UIAppearance。

@interface UINavigationBar (MMTranlucenceUIAppearance)
@property(nonatomic,assign,getter=isMMTranslucent) NSInteger LYTranslucent NS_AVAILABLE_IOS(3_0) UI_APPEARANCE_SELECTOR;  // Default is NO on iOS 6 and earlier. Always YES if barStyle is set to UIBarStyleBlackTranslucent
@end


@implementation UINavigationBar (MMTranlucenceUIAppearance)

// it appears that UIAppearance fails with BOOL
-(NSInteger)isMMTranslucent
{
    return self.translucent ? 0 : 1;
}

-(void)setMMTranslucent:(NSInteger)translucent
{
    self.translucent = (translucent == 0) ? NO : YES;
}

@end
于 2014-06-25T08:17:24.893 回答
0

Dont know what about the iOS 7 .But in iOS6, according to the documentation you cannot set the translucent property to the UIAppearance object of the UINavigationBar. Some time it shows the all the possibilities in the autocomplete with unsupported one also

于 2013-07-05T03:56:29.517 回答