Skip to content

야곰 아카데미 iOS 일기장 프로젝트 저장소입니다

Notifications You must be signed in to change notification settings

mint3382/ios-diary

 
 

Repository files navigation

📖일기장

프로젝트 기간: 23.08.28 ~ 23.09.15

📖 목차

  1. 🍀 소개
  2. 💻 실행 화면
  3. 🧨 트러블 슈팅
  4. 📚 참고 링크
  5. 👥 팀

🍀 소개

일기를 작성하고, 수정할 수 있는 앱

지원 언어 : 한국어, English


💻 실행 화면

일기 목록 스크롤 일기 내용 보기
diary_scroll diary_detail
키보드 영역 겹침 방지 일기 추가
diary_keyboard diary_push_add_diary_view

🧨 트러블 슈팅

핵심 트러블 슈팅위주로 작성하였습니다.

1️⃣ Swift Lint 규칙변경

🔒 문제점
Pod을 통해 SwiftLint를 설치하고 프로젝트에 적용했습니다. Lint는 프로젝트 빌드 시 코드 컨벤션에 대한 경고를 띄워주었고, 경고를 모두 없애면 전체적으로 읽기 좋은 코드가 되었습니다. 하지만 Lint를 모두 따르기에는 어색한 부분이 있었는데, 줄바꿈에 대한 부분이었습니다.

SwiftLint가 경고를 띄우는 부분

struct 구조체 {
    let 프로퍼티1
    let 프로퍼티2
    // Trailing Whitespace Violation: Lines should not have trailing whitespace (trailing_whitespace) 
    func 메서드1() {}
    func 메서드2() {}
    // Trailing Whitespace Violation: Lines should not have trailing whitespace (trailing_whitespace)
    enum 열거형 {
        case 경우1
        case 경우2
    }
}

저희 팀은 줄바꿈은 SwiftLint의 제안을 받아들이기보다 저희의 컨벤션을 지키고 싶었으나, XCodeIssue NavigatorLint로 인한 경고가 많이 누적되는것을 보고싶지 않았습니다.

🔑 해결방법
SwiftLint의 기본 옵션을 변경할 수 있다는 것을 알게 되었습니다. SwiftLint Rule에 따르면 경고에 계속 노출되었던 trailing_whitespace는 줄 뒤에 공백이 있어서는 안 됨을 의미합니다. 프로젝트 root 경로에 .swiftlint.yml 파일을 만들고 내부에 다음 내용을 작성했습니다.

# 기본 활성화된 룰 중에 비활성화할 룰을 지정
disabled_rules:
    - trailing_whitespace

disabled_rulestrailing_whitespace를 추가함으로써 Lint가 줄바꿈 관련된 경고를 띄우지 않도록 변경했습니다.


2️⃣ 일기 작성 및 수정 시 textView 개수 선택

🔒 문제점
제목과 본문의 구현을 어떻게 해야할지에 대한 고민이 있었습니다. 제목 textView와 본문 textView를 나누고 stackView에 넣어줄 경우 여러가지 문제점이 생겼습니다.

  1. 제목에 특정한 제약을 주지 않아 길어지게 되서 한 화면을 전부 차지하게 될 경우 본문 textView로 넘어갈 수가 없다.
  2. 본문 textView를 스크롤 할 경우 제목은 올라가지 않고 계속 남아있게 된다.

🔑 해결방법
textView를 제목과 본문으로 나누지 않고 contentTextView라는 하나의 textView에서 제목과 본문을 모두 입력받을 수 있게 변경하여 처리하였습니다.


3️⃣ iOS 타겟 버전 변경 - UIKeyboardLayoutGuide

🔒 문제점
키보드를 사용할 때 글자를 가리는 일이 생겨 textView도 같이 올려주는 방법에 대한 고민이 있었습니다. 그 중에서도 두가지 방법을 찾을 수 있었습니다.

  1. Notification을 사용하여 키보드가 올라올 때마다 키보드의 contentInset을 빼주는 방법
  2. keyboardLayoutGuide를 제약 조건에 적용하는 방법

간단하기는 2번이 간단했지만 iOS 15.0 부터 사용할 수 있어 고민이 있었습니다.

🔑 해결방법
1번의 방법을 사용할 때 keyboardFrameEndUserInfoKey을 사용합니다. 그런데 keyboardFrameEndUserInfoKey 공식문서를 보면 다음 내용이 있었습니다.

Important

Instead of using this key to track the keyboard’s frame, consider using UIKeyboardLayoutGuide, which allows you to respond dynamically to keyboard movement in your app. For more information, see Adjusting Your Layout with Keyboard Layout Guide.

이 키를 사용하여 키보드 프레임을 추적하는 대신 앱의 키보드 움직임에 동적으로 반응할 수 있는 UIKeyboardLayoutGuide를 사용하는 것이 좋습니다. 자세한 내용은 키보드 레이아웃 가이드로 레이아웃 조정을 참조하세요.

UIKeyboardLayoutGuideiOS 15.0 이후로 지원하기 때문에 2번의 방법을 선택하여 진행하였습니다.


4️⃣ 지역화 적용

🔒 문제점
날짜 관련된 문자열을 출력하기 위해 DateFormatter의 확장에 다음 메서드를 추가했습니다.

func configureDiaryDateFormat() {
    dateStyle = .long
    timeStyle = .none
    locale = Locale(identifier: "ko_KR")
    dateFormat = "yyyy년 MM월 dd일"
}

하지만 이렇게 날짜 포맷을 지정할 경우 사용자가 어떠한 Locale을 선택하더라도 'XXXX년 XX월 XX일' 형태로 출력되게 됩니다.

🔑 해결방법

func configureDiaryDateFormat() {
    dateStyle = .long
    timeStyle = .none
    locale = Locale(identifier: Locale.current.identifier)
}

DateFormatterlocale을 현재의 Locale.current.identifier를 통해 인식하도록 했습니다. 이 값은 디바이스의 설정 - 일반 - 언어 및 지역의 정보를 가져오게 됩니다. 이것으로 사용자 각각의 Locale에 맞게 날짜가 포매팅 되어 출력됩니다.


5️⃣ layoutMarginsGuide

🔒 문제점
tableViewCustom Cell을 설정할 때 제약조건을 ContentView에 맞췄더니 글자들이 leading에 딱 붙어서 표시되었습니다.

private func configureCellConstraint() {
    NSLayoutConstraint.activate([
        contentStackView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
        contentStackView.topAnchor.constraint(equalTo: contentView.topAnchor),
        contentStackView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),
        contentStackView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor)
    ])
}

이를 seperate line에 맞게 보기 좋은 간격을 주기 위한 고민이 있었습니다.

🔑 해결방법
layoutMarginGuide라는 여백 기준을 사용하여 간격을 맞춰주었습니다.

private func configureCellConstraint() {
    NSLayoutConstraint.activate([
        contentStackView.leadingAnchor.constraint(equalTo: contentView.layoutMarginsGuide.leadingAnchor),
        contentStackView.topAnchor.constraint(equalTo: contentView.layoutMarginsGuide.topAnchor),
        contentStackView.trailingAnchor.constraint(equalTo: contentView.layoutMarginsGuide.trailingAnchor),
        contentStackView.bottomAnchor.constraint(equalTo: contentView.layoutMarginsGuide.bottomAnchor)
    ])
}

readableContentGuide를 이용하여 간격을 줄 수도 있지만 넓은 아이패드 같은 화면에서 사용하게 되는 경우 퍼지는 것을 잡아주는 데에 사용하는 가이드인데 현재의 프로젝트에서는 layoutMarginGuide로도 충분할 것 같아서 이것을 사용하였습니다.


📚 참고 링크


👥 팀

👨‍💻 팀원

🤖BMO🤖 😈MINT😈
Github Profile Github Profile

About

야곰 아카데미 iOS 일기장 프로젝트 저장소입니다

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Swift 98.1%
  • Ruby 1.9%