Do Not Think!!!

Posted
Filed under 01010101
지난번에 작성한 코드를 이용하면 앱에서 사용하는 모든 네비게이션 바의 스타일이 바뀌게 됩니다.
하지만, 기본 스타일만 바꾸고, 다른 스타일은 그대로 사용해야 하는 경우가 있습니다.
그럴경우 MethodSwizzling 을 이용해서 해결할 수 있습니다.
(Method Swizzling은 메소드를 바꿔치기 하는 기능입니다.)


우선 drawRect: 와 바꿔치기 할 메소드를 선언합니다.

[code]//
//  UINavigationBar.h
//
//  Created by Cho, Young-Un on 11. 3. 25..
//  Copyright 2011 cultstory.com. All rights reserved.
//

@interface UINavigationBar (UINavigationBarCategory)

- (void)drawRectCustom:(CGRect)rect;

@end[/code]


drawRect: 와 바꿔치기 할 메소드를 구현합니다.
UIBarStyleDefault 인 경우에만 custom image 를 사용하도록 하고, 나머지는 drawRect: 를 사용합니다.
아래 코드에서 [self drawRectCustom:rect]; 가 실행되면 실제로는 drawRect: 가 호출됩니다.

[code]//
//  UINavigationBar.m
//
//  Created by Cho, Young-Un on 11. 3. 25..
//  Copyright 2011 cultstory.com. All rights reserved.
//

#import "UINavigationBar.h"


@implementation UINavigationBar (UINavigationBarCategory)

- (void)drawRectCustom:(CGRect)rect {
    if (UIBarStyleDefault == self.barStyle) {
        UIImage *image = [UIImage imageNamed:@"NavigationBarBg.png"];
        [image drawInRect:rect];
        return;
    }
   
    [self drawRectCustom:rect];
}

@end[/code]


실제 메소드를 바꿔치기 하는 코드를 작성합니다.

[code]//
//  main.m
//
//  Created by Cho, Young-Un on 11. 3. 23..
//  Copyright 2011 cultstory.com. All rights reserved.
//

#import <UIKit/UIKit.h>
#import <objc/runtime.h>

int main(int argc, char *argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
   
    // method swizzling
    Method drawRectCustom = class_getInstanceMethod([UINavigationBar class], @selector(drawRectCustom:));
    Method drawRect = class_getInstanceMethod([UINavigationBar class], @selector(drawRect:));
    method_exchangeImplementations(drawRect, drawRectCustom);
    //
   
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}[/code]