Чтобы получить прозрачный фон на UINavigationBar или UIToolbar, необходимо установить цвет фона на [UIColor clearColor]
, установить opaque
на NO (если это еще не сделано) и переопределить drawRect
, чтобы не рисоватьстандартный градиент фона.Третья - это сложная часть.
Если вы используете UINavigationBar напрямую, вы можете достаточно просто создать его подкласс для переопределения drawRect
.Но я вижу, вы пометили это UINavigation Controller , поэтому вам придется попробовать переопределить его категорией.Что-то вроде этого должно сделать это:
@implementation UINavigationBar (invisibleBackground)
- (void)drawRect:(CGRect)rect {}
@end
У этого недостатка есть то, что теперь у каждой панели навигации в вашем приложении нет фона.Если вы хотите иметь какие-то прозрачные и нормальные значения, вам нужно сделать еще один шаг и быстро набрать drawRect
, чтобы вы могли при необходимости вызвать оригинал:
#import <objc/runtime.h>
@implementation UINavigationBar (invisibleBackgroundSwizzle)
// The implementation of this method will be used to replace the stock "drawRect:". The old
// implementation of "drawRect:" will be attached to this name so we can call it when needed.
- (void)replacementDrawRect:(CGRect)rect {
if (![self.backgroundColor isEqual:[UIColor clearColor]]) {
// Non-transparent background, call the original method (which now exists
// under the name "replacementDrawRect:"). Yes, it's a bit confusing.
[self replacementDrawRect:rect];
} else {
// Transparent background, do nothing
}
}
// This special method is called by the runtime when this category is first loaded.
+ (void)load {
// This code takes the "drawRect:" and "replacementDrawRect:" methods and switches
// thier implementations, so the name "drawRect" will now refer to the method declared as
// "replacementDrawRect:" above and the name "replacementDrawRect:" will now refer
// to the original implementation of "drawRect:".
Method originalMethod = class_getInstanceMethod(self, @selector(drawRect:));
Method overrideMethod = class_getInstanceMethod(self, @selector(replacementDrawRect:));
if (class_addMethod(self, @selector(drawRect:), method_getImplementation(overrideMethod), method_getTypeEncoding(overrideMethod))) {
class_replaceMethod(self, @selector(replacementDrawRect:), method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
} else {
method_exchangeImplementations(originalMethod, overrideMethod);
}
}
@end