- 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]