2011년 9월 30일 금요일

[iOS] 네비게이션바 배경 바꾸기

(주의) 이 내용은 iOS 4.x 에서 테스트 되었으며 iOS 5 부터 효과가 없음.

네이게이션 컨트롤러를 이용해 구성한 UI에서 네비게이션바와 버튼을 입맛에 맞게 커스터마이징 하는 방법은 인터페이스 빌더 등에서는 지원되지 않는다. 물론 그렇기 때문에 수동으로 UINavigationBar를 상속받아 새로운 네비게이션바를 만들어서 커스터마이징 할 수는 있다.

그런데 좀 더 단순한 방법을 이용해 네비게이션바의 배경을 통채로 바꿔버리는 방법이 있다. 카테고리를 이용해 UINavigationBar를 오버라이딩 하는 방법이다.

아래와 같은 UI가 구성되어 있다고 치자. 물론 지극히 평범한 네비게이션 컨트롤을 이용한 UI 다.


이런 상황에서 아래 코드를 좀 추가해 본다. 어디든 상관은 없겠지만 귀찮다면 AppDelegate 파일 끝에다 붙여 넣어도 된다.

@implementation UINavigationBar (UINavigationBarCategory)

- (void)drawRect:(CGRect)rect {
    UIImage *bgImage = [UIImage imageNamed:@"test.jpg"];
    [bgImage drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
    self.tintColor = [UIColor redColor];
}

@end

Objective-C에서 지원하는 독특한 오버라이딩 기법인데 이 기법을 뭐라 부르는지는 잘 모르겠지만, 이 코드 덕분에 UINavigationBar라는 클래스의 drawRect 부분이 입력한 코드로 바뀌어 버린다. 따로 클래스를 만들어서 오버라이드 하는 것 보다 수고가 줄어든다.

test.jpg 파일은 아래와 같다. (무슨 그림인지 궁금하다면 '마마마'의 '쿄코'를 찾아보면 된다. -_-)


그래서 결과물을 살펴보면 이렇게 나온다.


쿄코가 납작해 졌어 ;ㅅ;

어쨌든 특정 이미지를 네비게이션바의 배경으로 사용할 수 있게 되었다. 더불어 tintColor 속성을 변경해서 버튼까지 배경 이미지에 어울리게 색상을 바꿀 수 있다.

댓글 없음 :