Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[refactor] 네비게이션 바 경계선 구현 방식 변경 #307

Merged
merged 7 commits into from
Aug 19, 2024

Conversation

JinUng41
Copy link
Contributor

@JinUng41 JinUng41 commented Aug 19, 2024

🔗 연결된 이슈

📄 작업 내용

  • 네비게이션 바의 경계선 표현을 위한 로직을 수정하였습니다.

💻 주요 코드 설명

경계선 표현을 위한 단일 인스턴스

  • UINavigationController의 익스텐션을 통해, 경계선 표현을 위해 사용될 UIView의 인스턴스를 단일 인스턴스로 구현하였습니다.
UINavigationController+.swift
extension UINavigationController {
    fileprivate static let borderLine = UIView(backgroundColor: .gray2)
    
    func hideBorder() {
        Self.borderLine.isHidden = true
    }
    
    func showBorder() {
        Self.borderLine.isHidden = false
    }
}

UINavigationController의 편의생성자

  • 사실 저희 프로젝트에서 거의 대부분 사용되기 때문에 임의로 추가할 수 있지만, 좀 더 코드적인 추적이 가능하기 위함으로써 편의생성자를 구현하고 사용하여, 명시적으로 확인할 수 있도록 하였습니다.
  • 해당 커밋과 연관있습니다.
  • 지훈님, 확인부탁드려요 (@hooni0918 )
UINavigationController+.swift
extension UINavigationController {
    convenience init(rootViewController: UIViewController, isBorderNeeded: Bool) {
        self.init(rootViewController: rootViewController)
        
        if isBorderNeeded {
            addBorder()
        }
    }
    
    private func addBorder() {
        let border = Self.borderLine
        
        if !navigationBar.subviews.contains(where: { $0 == border }) {
            navigationBar.addSubviews(border)
            
            border.snp.makeConstraints {
                $0.horizontalEdges.bottom.equalToSuperview()
                $0.height.equalTo(Screen.height(1))
            }
        }
    }
}

실제 사용하기 위한 BaseViewController 수정

  • 실제 사용에 있어, 기존 코드에 최대한 영향을 주지 않기 위한 방법으로 수정하였습니다.
  • 기본값은 무조건 보여주는 것으로 해두었기 때문에, 사용하지 않는 곳에서 메서드 인자로 true를 할당하면 되겠습니다.
  • 유진님, 확인하시고 추후 해당 내용을 이용하셔서 반영해주세요. (@youz2me )
BaseViewController.swift
extension UINavigationController {
    /// 네비게이션 바 타이틀 설정 및 경계선 숨김 또는 표시
    func setupNavigationBarTitle(with string: String, isBorderHidden: Bool = false) {
        title = string
        
        navigationController?.navigationBar.titleTextAttributes = [
            .foregroundColor: UIColor.gray8,
            .font: UIFont.pretendard(.body03)
        ]
        
        isBorderHidden ? navigationController?.hideBorder() : navigationController?.showBorder()
        
        let barAppearance = UINavigationBarAppearance()
        barAppearance.backgroundColor = .white
        navigationItem.standardAppearance = barAppearance
        navigationItem.scrollEdgeAppearance = barAppearance
    }
}

👀 기타 더 이야기해볼 점

  • 추가로 개선이 필요한 사항이 있으면 의견 남겨주세요.

- extension 영역은 상속에서 재정의가 불가능한 영역이므로 `final` 키워드는 불필요
- UINavigationController의 익스텐션으로 구현한 편의생성자
@JinUng41 JinUng41 added ♻️ refactor 기존 코드를 리팩토링하거나 수정하는 등 사용 (생산적인 경우) 💙 JinUng 걸스 토크에 미쳐보고 싶다면 labels Aug 19, 2024
@JinUng41 JinUng41 self-assigned this Aug 19, 2024
@JinUng41 JinUng41 linked an issue Aug 19, 2024 that may be closed by this pull request
1 task
Copy link
Member

@hooni0918 hooni0918 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

편의생성자를 도입할 생각은 못했었는데 아주 좋은방법이네요!
(편의생성자를 직접 도입한적이 없어서 이전에 공부햇던거 참고하고옴,,)

Copy link
Member

@youz2me youz2me left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨어요. 남겨주신 내용 확인했고 다음 PR 때 같이 반영해서 올리겠습니다.

private func addBorder() {
let border = Self.borderLine

if !navigationBar.subviews.contains(where: { $0 == border }) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이걸 이렇게 구현 할 수 있군요 ... 진짜 대단합니다.

Copy link
Member

@mmaybei mmaybei left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

convenience init의 사용까지 잘 보고 갑니다 멋진 코드군요 👍

import Then

extension UINavigationController {
fileprivate static let borderLine = UIView(backgroundColor: .gray2)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

접근제어자를 fileprivate으로 설정한 까닭이 있으실까요? 개념으로만 접하다가 실제로 사용되는 경우를 보니 잘 와닿지 않아서 질문드립니다!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

외부에서 공용 인스턴스인 borderLine에 마음대로 접근하는 것을 막기 위함입니다.

@JinUng41 JinUng41 merged commit a134e58 into suyeon Aug 19, 2024
@JinUng41 JinUng41 deleted the refactor/#306-navigationBar-borderLine branch August 19, 2024 14:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
💙 JinUng 걸스 토크에 미쳐보고 싶다면 ♻️ refactor 기존 코드를 리팩토링하거나 수정하는 등 사용 (생산적인 경우)
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[refactor] 네비게이션 바 경계선 구현 방식 변경
4 participants