iOS & Android

네비게이션바의 백버튼 다루기

_침묵_ 2015. 9. 23. 11:27

iOS에서 네비게이션바의 백버튼을 요리하는 방법에 대해서는 많은 글들이 있는데, 내가 필요한건 현재 화면의 스크롤 상태에 따라 백버튼을 달리 표시해야하는 것이었다.


먼저 백버튼을 요리하는건 애플 개발자 사이트에 샘플로 있는 코드에서도 확인할 수 있다. 백버튼의 텍스트는 숨기고 백버튼의 배경 이미지를 넣어서 처리하는 것인데 다음 코드를 보면 알 수 있겠다.


참고: https://developer.apple.com/library/prerelease/ios/samplecode/NavBar/Introduction/Intro.html


    // Note that images configured as the back bar button's background do
    // not have the current tintColor applied to them, they are displayed
    // as it.
    UIImage *backButtonBackgroundImage = [UIImage imageNamed:@"Menu"];
    // The background should be pinned to the left and not stretch.
    backButtonBackgroundImage = [backButtonBackgroundImage resizableImageWithCapInsets:UIEdgeInsetsMake(0, backButtonBackgroundImage.size.width - 1, 0, 0)];
    
    id appearance = [UIBarButtonItem appearanceWhenContainedIn:[CustomBackButtonNavController class], nil];
    [appearance setBackButtonBackgroundImage:backButtonBackgroundImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
    
    // Provide an empty backBarButton to hide the 'Back' text present by
    // default in the back button.
    //
    // NOTE: You do not need to provide a target or action.  These are set
    //       by the navigation bar.
    // NOTE: Setting the title of this bar button item to ' ' (space) works
    //       around a bug in iOS 7.0.x where the background image would be
    //       horizontally compressed if the back button title is empty.
    UIBarButtonItem *backBarButton = [[UIBarButtonItem alloc] initWithTitle:@" " style:UIBarButtonItemStylePlain target:nil action:NULL];
    self.navigationItem.backBarButtonItem = backBarButton;
    
    // NOTE: There is a bug in iOS 7.0.x where the background of the back bar
    //       button item will not appear until the back button has been tapped
    //       once.


여기서는 UIAppearance를 사용해서 전체적으로 적용을 해주고 있다.


난 이게 상황에 따라 바뀌어야 하기 때문에 중간에 UIAppearance를 사용하는 방법 말고 UIBarButtonItem에 배경이미지를 바꾸는 방법을 사용했다. 물론 이렇게 하면 매번 백버튼을 요리해줘야 한다.


    UIBarButtonItem *backBarButton = [[UIBarButtonItem alloc] initWithTitle:@" " style:UIBarButtonItemStylePlain target:nil action:NULL];
    [backBarButton setBackButtonBackgroundImage:backButtonBackgroundImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
    self.navigationItem.backBarButtonItem = backBarButton;


또 하나의 문제는 현재 ViewController에서 백버튼을 바꾸는 작업을 해야하는데, 백버튼의 주인은 이전 화면의 ViewController라는 점.


참고: http://mobile.antonio081014.com/2015/03/customize-uinavigationbar-back-button.html


그래서, UINavigationController의 viewControllers에서 이전 UIViewController를 찾아와서 그 녀석의 backBarButtonItem을 수정하도록 처리했다.


  UIViewController *from = self.viewControllers[self.viewControllers.count - 2];
  UIImage *backButtonBackgroundImage = [UIImage imageNamed:@"Menu"];
  backButtonBackgroundImage = [backButtonBackgroundImage resizableImageWithCapInsets:UIEdgeInsetsMake(0, 20, 0, 0)];
  UIBarButtonItem *backBarButton = [[UIBarButtonItem alloc] initWithTitle:@" " style:UIBarButtonItemStylePlain target:nil action:NULL];
  [backBarButton setBackButtonBackgroundImage:backButtonBackgroundImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
  from.navigationItem.backBarButtonItem = backBarButton;



'iOS & Android' 카테고리의 다른 글

Xcode8 콘솔 로그가 넘쳐나요  (0) 2016.09.26
iOS7에서 aspect ratio를 사용한 auto layout 문제  (0) 2015.09.14
iOS custom navigation bar  (0) 2015.01.13