iOS7에서의 StatusBar(상태바)에 대하여.

navicon

 

제가 이 문서를 이해하는데에 필요해서 번역을 한지라 번역의 질은 개판이지만, 조금이나마 도움이 되었으면해서 글을 써봅니다. 이 글에서 궁금하신 내용은 리플을 통해 말씀해주시면 제가아는 한에서 답변해 드리겠습니다 🙂

원문 : http://blog.jaredsinclair.com/post/61507315630/wrestling-with-status-bars-and-navigation-bars-on-ios-7

iOS7에 대응한 Riposte와 Whisper앱을 업데이트하는동안, 계속해서 반복되는 문제점이 하나 있었는데, 우리의 앱의 계층적 레이아웃때문에 발생하는 문제들이 계속적으로 발생하였습니다. 문제가되는 API들은 대부분 System StatusBar(이하 상태바)와 UINavigationController(이하 네비게이션컨트롤러)가 원인이었는데. API문서들이 쓰여져 있더군요.  아무튼 아래에 있는 내용들은 iOS7에서 상태바와 UIViewContorller간의 문제점들떄문에 고생하고있는 개발자들을 위한 내 지식을 공유한것입니다.

1. iOS6 스타일의 상태바 레이아웃은 더이상 제공하지 않습니다. iOS7에서 실행되는 어플리케이션의 상태바는 항상 앱화면위를 오버랩하여 나오게됩니다.

2. 상태바의 Appearance와 상태바의 레이아웃을 헷갈리지 마십시오. 상태바의 Appearance(Light Or Default)는 상태바의 레이아웃(Frame이나, 높이, 오버랩되는것..)등에 영향을 전혀 끼치지 않습니다. 더이상 상태바에 배경색이 들어가지 않는다는것을 의미합니다. 해당 API의 UIStatusBarStyleLightContent라는 값으로 설정하면 글자색만 하얀색으로 변경될뿐 배경색은 투명합니다. UIStatusBarStyleDefault는 검정색 글자에 투명한 배경입니다.

3. 상태바의 모양은 두가지 설정중 하나를 참조하게 되는데요, 기존과같이 StatusBar를 설정하는 코드를 통해 상태바를 설정하는 방식을 사용하거나, UIViewController를 위해 새롭게 추가된 Property를 통하여 설정할 수 있습니다.  후자의 옵션이 디폴트로 사용 되게되어있습니다. 두가지 옵션은 앱의 기본 plist의 <ViewController-Based Status Bar Appearance> 의 값을 통해 스위칭할 수 있습니다. 만약 이 값이 YES로 설정되어있다면, 모든 최상위 뷰컨트롤러는 “preferredStatusBarStyle”메소드의 오버라이드를 필요로 하게됩니다. 이 메소드에서 리턴값을 light하게주느냐 default하게 주느냐에따라 Statusbar의 모양이 달라지게됩니다. 만약 <ViewController-Based Status Bar Appearance>의 값이 NO라면, 기존에 사용한 방식대로 일반적인 코드,즉 UIApplication의 메소드를 통해 StatusBar의 Style을 변경 할 수 있습니다.

4. UINavigationController가 UINavigationBar의 높이를 44px이나 64픽셀중 하나로 변경하게되니다. 만약 UINavigationController의 최상단의 뷰의 프레임이 UIWindow의 최상단에 항상 붙어있는 것을 감지하면, 자동적으로 navigation bar의 높이는 64px이 됩니다. 만약 최상단의 뷰가 UIWindow에 계속적으로 붙어있지 않는다면, Navigation Bar의 높이는 기존의 44px을 사용하게 됩니다. 이 로직은 어플리케이션내에 UINavigationController 아래에 있는 모든 하위 뷰컨트롤러들에게 계속해서 사용되는데, 이 로직이 작동하는것을 막을 수 없습니다.

5. UINavigationBar에 커스텀 백그라운드 이미지의 사이즈의 높이가 기존 44px인 이미지만 사용하고 있다면 어떻게될까요? UINavigationController의 사이즈가 UIWindow의 사이즈와 맞아 떨어진다면, 4번 항목에 따라 UINavigationBar의 사이즈는 64px이 될것이고, UINavigationController는 커스텀 백그라운드의 이미지의 프레임을 (0,20,320,44)로 지정하여 그리게됩니다. 그러니까, 상단에서 20px떨어진 위치에 커스텀 백그라운드 이미지를 그리게됩니다. 이렇게 하게되면 1번에서 말한 내용들을 우회할수 있는 방법 으로 iOS6스타일의 NavigationBar를 그리게 된것같지만 같지만, NavigationBar는 여전히 64px입니다. 이건 좌우로 당기면 나타나는 뷰컨트롤러 (페이스북과같은 형태의 MMDrawercontroller같은..)의 뷰구조에서 더 명확하게 드러납니다.

6. UIViewController의 프로퍼티중 하나로 생긴 edgesForExtendedLayout의 혼동하기 쉬운이름에 혼동하-.. edgesForExtendedLayout는 대부분의 경우에서 아무런 도움도 주지 못합니다. 이 프로퍼티는 UINavigationController에 ViewController를 추가해서 사용하는경우에만 동작을 하는데, 이 프로퍼티를 사용하게되면, edgesForExtendedLayout는 자동적으로 자식뷰컨트롤러의 UINavigationBar의 영역과 상태바의 영역까지 사용할것인가에대한 결정을 내립니다.  edgesForExtendedLayout프로퍼티로 UINavigationController의 UINavigationBar의 영역이 44px이될지 64px이 될지 결정하는것이 아니므로 위와같은 상황에서는 아무런 도움도 되지못합니다. (이로직은 4번로직을 보면됩니다.)

7. 만약에 UINavigationController안에있는 자식뷰컨트롤러의 내용이 네비게이션바에 가려져서 보이지않는 현상을 방지하려면 edgesForExtendedLayout의 값을 UIRectEdgeNone으로 변경하면됩니다. 자식뷰컨트롤러의 View Life Cycle중에 할수있는한 가장 빠른시점에서 설정하세요.

8. UINavigationController와 UITabBarController도 마찬가지로 Tableview와 Collectionview의 서브뷰계층을 ContentInset속성에 덧붙이려고 합니다. 이것은 어느정도는 4번 항목의 상태봐 로직과 비슷한 형태입니다. 이것을 방지하려면 TableView와 CollectionView의 automaticallyAdjustsScrollViewInsets 속성 값을 NO로 세팅해주면됩니다. (기본값은 YES입니다.)

9. 다시한번 말씀드리지만, iOS6스타일로 돌아갈 수있는 로직은 더이상 제공되지 않습니다. iOS6와 가장 비슷한 형태로 구현하려면, 모든 뷰컨트롤러의 모든 뷰를 20픽셀 아래로 내린다음, 최상단에 까만색 20px짜리 뷰를 만들어서 기존의 모양을 흉내내는 수밖에는 없습니다.

10. 애플은 9번에서말한 형태와 같은 형태로 앱을 구성하지 않도록 밀고있고, 애플은 여러분이 상태바아래의 영역까지 새롭게 디자인하기를 바라고있습니다. 맞는 말이긴한데, 기존에 출시되었던 앱이라면 기존의 사용자경험과 기술적인 이유들때문에 항상 애플이 바라는대로 할수는 없을것 같습니다. 여러분의 앱을 사용하는 유저가 원하는 가장 최상의 기발한 방법들을 사용해 보세요.

One thought on “iOS7에서의 StatusBar(상태바)에 대하여.

  1. 물결

    고맙습니다. 이 문제로 골머리를 앓고 있었는데 덕분에 많은 도움이 되었습니다 ^^.

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *