Невидимая панель навигации - PullRequest
0 голосов
/ 11 марта 2011

Возможно ли иметь невидимый фон панели навигации? Я уже видел пользовательские из них раньше, но хотел бы получить советы о том, как это сделать.

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 11 марта 2011

Чтобы получить прозрачный фон на 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
0 голосов
/ 11 марта 2011

Я искал это сам (снова) только сегодня, некоторые хорошие сообщения в блоге на эту тему:

http://atastypixel.com/blog/making-uitoolbar-and-uinavigationbars-background-totally-transparent/

http://idevrecipes.com/2011/01/12/how-do-iphone-apps-instagramreederdailybooth-implement-custom-navigationbar-with-variable-width-back-buttons/

...