iOS statusBar Color변경에 따른 UINavigationBar 높이 조절 팁
오늘 일을 하다 부딪힌 문제, statusbar의 컬러를 변경해야하는데 일반적으로 UINavigationController를 사용하는 경우에 UINavigationBar의 setBarTintColor를 통해 색상을 변경하면 된다. 하지만 statusBar높이 20을 제외한 나머지는 모두 웹뷰로 구성이 되어 있는 구조라 titleBar를 앱에서 사용할 수 없는 상태였다.
따라서 UIViewController 의 viewDidLoad에서 다음과 같이 설정을 하였다.
self.navigationController.navigationBar.hidden = YES;
따라서
[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];
[[UINavigationBar appearance] setBarTintColor:_colorWithHexRGB(0x5c6bc0)];
와 같은 방식으로 아무리 값을 바꿔도 적용되지 않아 고민도 하고 검색도 했지만 원하는 답이 없었다.
카페에서 힌트를 얻어 UINavigationBar(Custom) 카테고리를 만들고 몇 가지 메소드를 오버라이딩 하는 방법으로 문제를 해결해 나가기 시작했는데 drawRect를 재정의해서 사이즈를 바꾸면 될 것 같아 했더니 정말 되었다. 다만 문제는 타이틀바 영역(44pixel)이 잡혀 있어 그 영역은 터치가 되지 않는 문제라 다른 방법을 찾아 보니 UIView의 멤버 메서드인 sizeThatFits:(CGSize)size;를 이용해 보라는 후배의 팁이 결정적 힌트로 작용하였다.
따라서 UINavigationBar(Custom)에서 다음과 같이 구현하였다.
.h
-(CGsize)sizeThatFits:(CGSize)size;
- (void)setChangeBackgroundColor:(UIColor *)color;
.m
-(CGSize)sizeThatFits:(CGSize)size {
self.frame = CGRectMake(0.0, 20.0, SCREEN_WIDTH, 0.0f);
}
- (void)setChangeBackgroundColor:(UIColor *)color {
[self.barTintColor = color;
[self setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
self.shadowImage = [UIImage new]; //1px 실선이 보일때 추가 해주면 사라진다.
}
<사진 출처 : http://www.makeitapp.eu/2013/11/08/uinavigationbar-with-gradient-coloring-and-translucency/>
sizeThatFits은 UINavigationController가 alloc , init될 때부터 몇번이고 계속 불리게 되므로 재정의만 해주는 것으로 호출이 된다.
SetChangeBackgroundColor의 경우는 필요에 따라 호출 할 수 있으므로 public method로 빼서 사용하도록 했다.
오전 내내 해당 기능을 가지고 씨름을 해서 적용을 했더니 뭔가 이상하다며 빼자는 결론, @@
그래서 결국은 원복 했다는 사실 쩝!!
다음에 혹 필요할 것 같은 기능이라 정리를 해 두는 것!
iOS11이상에서는 변경되지 않는 문제가 발생됨, 뭔가 더 꼼수가 필요하다.
xCode9.0, iOS11에서는 statusbar와 navigationBar의 사이즈를 더 줄이지 못했다. - 2017.10.18 , 추가
'프로그래밍 > Xcode-iOS' 카테고리의 다른 글
objective-C 디버깅 팁, po와 print (0) | 2017.11.01 |
---|---|
ios convert hex string to decimal (0) | 2017.10.31 |
iOS 화면 밝기 조정 방법 (0) | 2017.09.27 |
iOS MP3파일 재생 방법 (AVAudioPlayer) (0) | 2017.08.03 |
iOS(아이폰) 진동 구현 , 간단하다. (0) | 2017.07.20 |