본문 바로가기

iOS/Deep dive!!!

[Swift] 네비게이션 바 커스텀으로부터 살아남기.. UIBarButtonItem

 

네비게이션 바에 다음과 같은 기능을 추가해야 했습니다. ( 선 제외 )

앱 로고와 두개의 버튼을 추가해야하는데 버튼 사이에 spacing이 필요했습니다.

 

처음엔 UINavigationBar를 대체하는 커스텀 UIView 안에 UILabel과 UIButton 총 3개의 컴포넌트 포함하도록 만들어서 네비게이션 바의 subview에 추가 했었습니다. (상당히 쉽다는 생각이 들었습니다.)

새로운 뷰로 push하기 전에 네비게이션 바를 없애야 했습니다. 아무리 커스텀 UIView의 subview를 nil로 하던,, 네비게이션 바에 addSubview로 추가한 커스텀 컨테이너 네비바를 nil처리하던 계속해서 다른 뷰컨트롤러를 push할 때 이전 네비 바의 모양이 상속 되었습니다.. ( 쉽지 않네요 )

뒤늦게 알게된 것은 커스텀 view의 isHidden을 true로 하면 사라지는데 이게 viewWillAppear시점에 다시 네비게이션 바를 보여줄 때, 뷰가로드될 때의 애니메이션을 주면 애니메이션 처리될 때 뷰의 opacity와 일치하지 않아서 어려웠습니다..

 

 

 

그래서 navigationBar의 left, right BarButtonItem을 활용해야겠다고 생각했습니다.

 

왼쪽은 레이블, 오른쪽은 버튼을 customView로 하는 BarBUttonItem을 생성해서 추가했습니다.

 

이때 navigationItem.rightBarButtonItem의 경우 

커스텀 뷰로 묶어서 rightBarButtonItem에 UIView타입의 커스텀 뷰를 추가를 했더니.. 버튼 터치 인식이 안됬습니다.. OTL

 

그래서 각각의 버튼에 대해서 동작을 하기 위해 각각의 버튼을 따로 만들어 준 후

UIEdgeInsets 를 사용해 contentEdgeInsets를 활용해 마진을 넣어주었습니다. 검색과 알림 버튼 사이에 공백이 필요했기 때문입니다.

 

 

레이블의 경우 contentEdgeInsets는 없지만 왼쪽 마진을 넣어줘야 하기 때문에 

 

 

커스텀 뷰 안에 넣어서 커스텀 뷰에 대한 LeadingAnchor, trailing, top, bottom 대해 constant를 넣어줌으로 해결했습니다. 

 


Date: 23.05.28

개발하면서 마주한 이슈(네비게이션 바의 아래 부분에 높이 1인 line 설정 관련)

 

네비게이션 바에 subview로 라인을 추가했을 때, pushView에서만 라인이 생기고 popView했을 때에는 라인이 없어지도록 할 수 있었습니다. push된 뷰에서 pop되기 전 VC의 viewWillDisappear에서 navigationBar의 bottom line 인스턴스를 superView로부터 지우면 됬습니다.

 

그러나 line이 네비게이션 바의 bottom spacing을 갖게 된다면..(기존 시스템에서 지정한 네비게이션 바 크기로부터 x spacing만큼 떨어진 subView로 추가했을 때의 경우입니다.) 여전히 VC의 서브뷰들 레이아웃을 잡을 때, navigationBar바로 아래 지정될 서브 뷰의 topAnchor로  view.safeAreaLayoutGuide.topAnchor를 했을 때, 네비게이션(서브 뷰로 네비바로부터 x spacing 아래로 내려간 라인)바의 subview를 포함하는 높이로 갱신이 안되었습니다. 그래서인지 safeAreaLayoutGuide의 topAnchor는 기존 네비바의 bottom에서부터 시작되서...

네비게이션 바의 바텀으로부터 spacing된 라인의 높이가 일치하지 않기 때문에 수작업으로 계산을 해주지 않는이상 오토레이아웃 잡기가 힘듭니다. 이부분이 조금 고민입니다.