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 |