---
# System prepended metadata

title: '일기장 [STEP 1]'
tags: [PR]

---

# 일기장 [STEP 1]

# STEP 1 PR

안녕하세요 지성(@yim2627)!
일기장 STEP 1 PR 보내드립니다.
설레이는 일기장 첫 번째 PR입니다. 🙌
첫 번째 리뷰 잘 부탁드립니다!🙏

## 고민했던 점
1️⃣ **StackView 내부에서 Label의 Height가 잡히지 않는 현상.**
StackView 내부에서 Label의 Height가 잡히지 않는 현상이 있었습니다.</br>height is ambiguous for UILabel 경고가 생겨 고민이 많았습니다.</br>

**🙋‍♂️ diaryTitle과 dateAndPreview의 content hugging priority 가 같아 생기는 현상이였습니다.</br>따라서 diaryTitle에 .defaultHigh + 1 값을 주었고, dateAndPreview에는 .defaultHigh값을 주어 각각 다른 content hugging priority값을 주어 해결하였습니다.**

```swift!
import UIKit

class DiaryTableViewCell: UITableViewCell {
    private let diaryTitle: UILabel = {
        let label = UILabel()
        label.font = UIFont.preferredFont(forTextStyle: .title2)
        label.setContentHuggingPriority(.defaultHigh + 1, for: .vertical)
        
        return label
    }()
    
    private let dateAndPreview: UILabel = {
        let label = UILabel()
        label.font = UIFont.preferredFont(forTextStyle: .body)
        label.setContentHuggingPriority(.defaultHigh, for: .vertical)
        
        return label
    }()
}
```

2️⃣ **NSAttributedString이 적용되지 않는 현상.**
[__NSCFConstantString renderingMode]: unrecognized selector sent to instance 0x10aa5a2e8 에러가 발생했습니다.</br>고민을 하다가 원인을 찾았습니다.</br>원인은 NSAttributedString.Key.font에 필요한 타입이 UIFont였으나 UIFont.TextStyle을 사용 중이었습니다.</br>

🙋‍♂️**NSAttributedString.Key.font에 UIFont 타입으로 전달하여 해결했습니다.**</br>

```swift
private func convertAttributedString(text: String, font: UIFont) -> NSAttributedString {
    let attributes = [NSAttributedString.Key.font: font as Any] as [NSAttributedString.Key : Any]
    let attributedString = NSAttributedString(string: text, attributes: attributes)

    return attributedString
}
```

3️⃣ **NSAttributedString의 가운데 정렬**
문자열 자체의 모양이 아래 이미지와 같기 때문에 UILabel의 baselineAdjustment로 가운데 정렬을 맞출 수 없었습니다.</br>
<img src = "https://github.com/devKobe24/images/blob/main/NSAttributedString%E1%84%86%E1%85%AE%E1%86%AB%E1%84%8C%E1%85%A6%E1%84%8C%E1%85%A5%E1%86%B7.png?raw=true"></br>

그에 따라 다음과 같은 해결책을 찾았습니다.</br>

**🙋‍♂️NSAttributedString.Key.baselineOffset을 이용해 작은 문자 부분의 baseline을 올리는 것으로 해결했습니다.**</br>

<img src = "https://github.com/devKobe24/images/blob/main/NSAttributedString%E1%84%92%E1%85%A2%E1%84%80%E1%85%A7%E1%86%AF%E1%84%8C%E1%85%A5%E1%86%B7.png?raw=true"></br>

```swift
private func attributedDateAndPreview(data: Diary, font: UIFont) -> NSMutableAttributedString {
    let text = "\(formatCreatedAt(data.createdAt)) \(data.body)"
    let attributedString = NSMutableAttributedString(string: text)
    let attributes: [NSAttributedString.Key: Any] = [
        .font: font,
        .baselineOffset: 2
    ]

    attributedString.addAttributes(attributes, range: (text as NSString).range(of: data.body))

    return attributedString
}
```


## 조언을 얻고 싶은 부분
🙋‍♂️ 각 나라의 문자마다 크기와 길이가 다른데 어떻게 문자의 정렬을 맞추어 줄 수 있을까요?
🙋‍♂️ 저희가 Model 중 `DiaryDateFormatter`를 `싱글톤 패턴`으로 만들었습니다. `DateFormatter`의 인스턴스를 하나만 사용할 수 있는 다른 방법이 있을까요?
🙋‍♂️ POP 잘하는 방법, 꿀팁 알려주세요 ㅠㅠ
🙋‍♂️ Protocol명을 `IdentifierGenerator`로 명명했는데 괜찮은지 궁금합니다.

---