[ios] 커스텀 탭바(TabBar)로 뷰 전환 구현하기
[ios] 커스텀 탭바(TabBar)로 뷰 전환 구현하기
안녕하세요. 오늘은 지난 시간에 만든 커스텀 탭바에 뷰 전환 기능을 추가해보도록 하겠습니다. 지난 시간에는 단순히 커스텀 탭바를 만들기만 하였고 직접적인 뷰의 전환 액션은 구현해주지 않았습니다. 오늘의 포스팅을 통해서 다음과 같은 기능을 완성해볼 수 있습니다.
커스텀 탭바 메뉴를 클릭하거나 페이지를 스크롤하여 하여 화면을 넘길 수 있는 기능입니다. 많은 곳에서 사용할 수 있는 그런 기능입니다. 오늘 포스팅은 이전 포스팅 코드와 기본적인 UICollectionView
를 기반으로 작성하였습니다. 또한 전체 코드는 글에서 다루지 않고 따로 깃헙 링크로 대체하고 중요한 코드들만 살펴보도록 하겠습니다.
그렇기 때문에 반드시 제가 이전에 소개해드린 [ios] 커스텀 탭바(TabBar) 만들기 포스팅을 먼저 참고해주시고 깃헙 소스도 같이 참고하여주시기 바랍니다.
Implementataion
저는 전환될 화면 역시 UICollectionView
를 사용하여 구현할 것입니다. 그렇게 되면 커스텀 탭바와 함께 두 개의 UIColletionView
가 올라가게 됩니다. 그래서 delegate
와 datasource
를 따로 지정해주기위해 커스텀 탭바를 따로 UIView
파일로 빼냈습니다.
저는 커스탭 탭바 위의 모든 것을 코드로 구현하였기 때문에 따로 xib
파일을 만들어 연결해주지 않았고 이를 UIViewController
에서 사용하기 위해 생성자를 다음과 같이 만들었습니다.
또한 저는 커스텀 탭바를 사용할 UIViewController
와 Delegation 관계를 맺을 것이기 때문에 같은 파일에 다음과 같이 프로토콜과 delegate
변수를 만들어주었습니다.
그리고 pageCollectionView
에 사용될 Cell
도 간단하게 다음과 같이 작성하였습니다.
그러면 이제 본격적으로 MainVC
에 코드를 작성해보도록 하겠습니다. 위에서 따로 빼준 CustomMenuBar
를 프로퍼티로 가져야하며 CustomMenuBarDelegate
프로토콜을 체택해주어야 합니다. 그리고 pageCollectionView
의 기본적인 세팅도 다음과 같이 해줍니다.
사실 MainVC
에서는 크게 중요한 부분은 없습니다. UICollectionView
의 Delegate나 DataSource를 설정하므로 다른 UICollectionView
를 설정하는 것과 크게 다르지 않기 때문입니다. 여기서 주목해야할 점은 CustomMenuBarDelegate
의 메소드와 pageCollectionView
의 스크롤 관련 메소드들입니다.
customMenuBar(scrollTo:)
이 메소드는 CustomMenuBar
클래스 내 어디서 작동할까요? CustomMenuBar
클래스를 살펴보도록 하겠습니다.
바로 CustomMenuBar
의 셀이 선택되었을 때 호출이 됩니다. CustomMenuBar
역시 UICollectionView
로 만들었기 때문에 didSelected
메소드를 활용합니다. 즉 CustomMenuBar
의 메뉴 탭이 선택되었을 때 선택된 셀의 인덱스와 같은 페이지를 pageCollectionView
를 통해 보여주는 것입니다.
예를 들어 CustomMenuBar
의 첫번째 탭을 선택하면 pageCollectionView
의 첫번째 뷰를 현재 페이지로 보여주어야 합니다.
scrollViewDidScroll, scrollViewWillEndDragging
- 먼저
pageCollectionView
내에 스크롤 액션이 일어나면CustomMenuBar
내indicatorView
의leadingConstraint
값의 변화가 있어야 합니다. 즉pageCollectionView
가 움직이면 같이 움직여야 합니다. - 그리고 스크롤이 멈추면 멈춘 곳에 해당하는 인덱스를 받아와 해당 인덱스에 해당하는
CustomMenuBar
의 셀(탭)을 선택해주는 것입니다. 위의 delegate 메소드는 선택한 탭바에 해당하는pageCollectionView
의 셀을 선택해주었다면, 이 메소드를 통해서는pageCollectionView
의 스크롤을 통해 인덱스가 결정되면 해당 인덱스에 해당하는 탭바의 셀을 선택해주는 것입니다.
동작에 관한 코드는 모두 완성하였습니다. 한 가지 남은 것은 탭이 탭 자체의 선택으로 인해 선택이 되었든, pageCollectionView
의 스크롤로 인해 선택이 되었든 선택되었다는 것을 표시해주어야 합니다. 이전의 포스팅에서는 이를 CustomMenuBar
의 didSelected
메소드를 통해 구현해주었는데 이번 포스팅에선 셀 자체에서 작성해주도록 하겠습니다.
- 만일 셀이 즉, 메뉴 탭이 선택되면 해당 탭의 글자 색을 변경시켜주는 코드입니다.
CustomMenuBar
는 복수의 셀을 선택하는 것을 허용하지 않았기 때문에 다른 셀을 선택할 때는 해당 셀은 자동으로 선택이 해제되고isSelected
가false
가 되므로 글자 색 역시 원래 색으로 돌아가게 됩니다.
마무리
오늘은 이렇게 많은 어플리케이션에서 사용되는 커스텀 탭바를 활용한 페이지의 전환을 구현해보았습니다. UICollectionView
에 더 익숙해지는 계기가 되었고 개인적으로는 재미있게 공부한 기능입니다. 많은 분들도 직접 만들어보면서 얻어가시는 것이 있었으면 좋겠습니다. 틀린 부분이나 더 좋은 방법이 있다면 많은 피드백 부탁드리겠습니다. 감사합니다.
Source : github