본문 바로가기
프로그래밍/Xcode-iOS

iOS statusBar Color변경에 따른 UINavigationBar 높이 조절 팁

by Mr-후 2017. 9. 29.
반응형

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로 빼서 사용하도록 했다. 




오전 내내 해당 기능을 가지고 씨름을 해서 적용을 했더니 뭔가 이상하다며 빼자는 결론, @@ 

그래서 결국은 원복 했다는 사실 쩝!!


다음에 혹 필요할 것 같은 기능이라 정리를 해 두는 것! 

UINavigationBar+Custom.h

UINavigationBar+Custom.m


iOS11이상에서는 변경되지 않는 문제가 발생됨, 뭔가 더 꼼수가 필요하다. 

xCode9.0, iOS11에서는 statusbar와 navigationBar의 사이즈를 더 줄이지 못했다. - 2017.10.18 , 추가 



반응형