UINavigationController 사용하기: 화면 전환 네비게이션

작성일 :

UINavigationController 사용하기: 화면 전환 네비게이션

iOS 개발을 할 때 화면 전환은 매우 중요한 요소 중 하나입니다. UINavigationController는 iOS 앱에서 여러 화면을 계층 구조로 관리하고 사용자 간의 화면 전환을 쉽게 할 수 있도록 도와줍니다. 이 글에서는 UINavigationController를 사용하여 화면 전환과 네비게이션을 구현하는 방법을 자세히 알아보겠습니다.

UINavigationController란 무엇인가?

UINavigationController는 iOS 앱의 화면간 이동을 관리하는 중요한 클래스입니다. 보통 스택(stack) 구조를 사용하여 ViewController들을 관리합니다. 최근에 추가된 ViewController가 스택의 가장 위에 쌓이고, 사용자가 뒤로 가기를 하면 스택의 최상단 ViewController가 제거됩니다. 이 과정이 pushpop 동작입니다.

주요 역할 및 기능

  • 화면 스택 관리: 화면 전환 시 ViewController들을 스택 구조로 저장하고 관리합니다.
  • 내비게이션 바(Navigation Bar): 화면 상단에 내비게이션 바를 제공하여 타이틀, 버튼 등을 표시할 수 있습니다.
  • 애니메이션 효과: 화면 전환 시 자연스러운 애니메이션을 제공합니다.

UINavigationController 사용하기

기본 설정

  1. 새 프로젝트 생성: Xcode를 열고 새 프로젝트를 생성합니다. 템플릿으로 'Single View App'을 선택합니다.
  2. Initial ViewController 설정: 스토리보드에서 첫 번째 ViewController를 선택하고, Editor > Embed In > Navigation Controller를 선택하여 Navigation Controller에 포함시킵니다. 이렇게 하면 기본 구조가 설정됩니다.
  3. 추가 ViewController 만들기: 새로운 ViewController를 스토리보드에 추가하고, 필요한 UI 요소들을 배치합니다.

코드로 UINavigationController 사용하기

스토리보드를 사용하지 않고 코드로 UINavigationController를 설정하는 방법도 있습니다. 매우 간단합니다.

swift
import UIKit

class FirstViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        title = "First View"

        let nextButton = UIButton(type: .system)
        nextButton.setTitle("Next", for: .normal)
        nextButton.addTarget(self, action: #selector(showNextViewController), for: .touchUpInside)
        nextButton.frame = CGRect(x: 100, y: 100, width: 100, height: 50)
        view.addSubview(nextButton)
    }

    @objc func showNextViewController() {
        let secondViewController = SecondViewController()
        navigationController?.pushViewController(secondViewController, animated: true)
    }
}

class SecondViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        title = "Second View"
    }
}

위 코드에서는 첫 번째 ViewController(FirstViewController)에서 버튼을 눌렀을 때 두 번째 ViewController(SecondViewController)로 이동하도록 설정하였습니다.

네비게이션 바 커스터마이징

UINavigationController를 사용하면 네비게이션 바를 다양하게 커스터마이징할 수 있습니다. 네비게이션 바의 색상, 타이틀 그리고 버튼 등을 커스터마이징하여 앱의 디자인을 더욱 미려하게 만들 수 있습니다.

타이틀 설정

네비게이션 바의 타이틀은 UIViewControllertitle 속성으로 설정할 수 있습니다. 위 코드 예제에서도 보았듯이, 각 ViewController의 viewDidLoad 메서드에서 title을 설정하면 네비게이션 바에 자동으로 표시됩니다.

왼쪽/오른쪽 버튼 추가

네비게이션 바에 버튼을 추가하는 것도 간단합니다. UIBarButtonItem를 사용하여 왼쪽 혹은 오른쪽에 버튼을 추가할 수 있습니다.

swift
override func viewDidLoad() {
    super.viewDidLoad()
    view.backgroundColor = .white
    title = "First View"

    navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(doSomething))
}

@objc func doSomething() {
    print("Button tapped")
}

위 코드는 네비게이션 바의 왼쪽에 + 버튼을 추가하는 방법을 보여줍니다.

UINavigationController의 고급 기능

대규모 앱에서의 UINavigationController 사용

대규모 앱에서는 UINavigationController를 더 잘 활용하기 위해 몇 가지 고급 기법이 요구됩니다. 특히, 화면이 많고 복잡할 때는 트랜지션 애니메이션, 커스텀 전환, 상태 복구 등에 신경 써야 합니다.

상태 복구

iOS에서 화면 전환 상태를 복구하는 것은 특히 중요한 주제입니다. 이 과정에서는 UIViewControllerRestoration 프로토콜을 구현하여 복구할 수 있습니다.

커스텀 트랜지션 애니메이션

애니메이션 효과를 커스터마이징하여 사용자 경험을 향상시킬 수 있습니다. 이는 UIViewControllerAnimatedTransitioning 프로토콜을 구현하여 할 수 있습니다.

swift
class CustomAnimator: NSObject, UIViewControllerAnimatedTransitioning {
    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
        return 0.5
    }

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
        let containerView = transitionContext.containerView
        guard let toView = transitionContext.view(forKey: .to) else { return }

        containerView.addSubview(toView)
        toView.alpha = 0.0

        UIView.animate(withDuration: transitionDuration(using: transitionContext), animations: {
            toView.alpha = 1.0
        }, completion: { finished in
            transitionContext.completeTransition(finished)
        })
    }
}

이와 같이 커스텀 애니메이션을 적용하여 더 화려한 화면 전환 효과를 만들 수 있습니다.

결론

UINavigationController는 iOS 앱 개발에서 매우 중요한 기능을 제공하며, 이를 올바르게 이해하고 활용하는 것은 앱의 사용자 경험을 크게 향상시킬 수 있습니다. 이번 글에서는 기본 개념, 설정 방법, 네비게이션 바 커스터마이징, 고급 기능 등을 다루어 보았습니다. 이를 통해 여러분의 iOS 앱을 더 매력적으로 만드시길 바랍니다.