jay's devnote
  • README
  • 자료구조 & 알고리즘
    • 자료구조
    • 알고리즘
  • 디자인 패턴
    • 디자인 패턴 원칙, 요약, 분류
    • IS-A 와 HAS-A
    • 전략 패턴
    • 옵저버 패턴
    • 데코레이터 패턴
    • 팩토리 패턴
    • 싱글턴 패턴
    • 커맨드 패턴
    • 어댑터, 퍼사드 패턴
    • 템플릿 메소드 패턴
    • 반복자, 컴포지트 패턴
    • 상태 패턴
    • 프록시 패턴
    • 복합 패턴
  • WWDC
    • 2015, Building Better Apps with Value Types in Swift
    • 2015, Protocol-Oriented Programming in Swift
    • 2016, Understanding Swift Performance
    • 2016, Protocol and Value Oriented Programming in UIKit Apps
    • 2017, Engineering for Testability
    • 2018, High Performance Auto Layout
    • 2018, Testing Tips & Tricks
    • 2020, Advances in UICollectionView
    • 2020, Lists in UICollectionView
  • 패러다임
    • 객체지향 프로그래밍, SOLID 원칙
      • SRP, 단일 책임 원칙
      • OCP, 개방 폐쇄 원칙
      • LSP, 리스코프 치환 원칙
      • ISP, 인터페이스 분리 원칙
      • DIP, 의존성 역전 원칙
    • 만들면서 느껴보는 POP
    • Swift로 함수형 프로그래밍 시작하기
  • 아키텍쳐
    • ReactorKit
      • Pulse(EN)
      • Pulse(KR)
    • Coordinator Pattern
  • iOS
    • Safari로 웹뷰의 세션/쿠키 정보 확인하기
    • App Icon 동적으로 변경하기
    • WKDataDetectorTypes의 데이터 탐지
    • Xcode에서 메모리 누수 확인하기
    • 개발 인증서 관리하기
    • required init?(coder: NSCoder)
    • UIFontMetrics 와 UIFont.preferredFont
    • 제약조건을 줄여주는 UIStackView
    • UICollectionView.CellRegistration<Cell, Item>
  • Swift
    • Swift API Design Guidelines
    • 패턴 매칭
    • allSatisfy()
    • 생성자
    • 프로토콜의 동적 디스패치와 정적 디스패치
    • Swift 문법 정리
  • RxSwift
    • RxSwift 핸드북
    • Just, From, Of
    • withLatestFrom
  • SwiftUI
    • SwiftUI에서의 마크다운 문법
    • @State, @Binding
    • ObservableObject, @ObservedObject, @Published
    • @ObservedObject vs @StateObject
  • Git
    • Git gitignore
    • Github API Rate limit
    • GitKraken(깃크라켄) 활용하기
    • GitKraken으로 Git-flow 활용하기
  • Etc
    • Struct을 [String: Any]로 변환할 때, Encodable의 Extension을 사용 해야 하나요?
    • Podfile, Dependency Rule(SPM)
    • 맥으로 고정 IP 연결하는 방법
    • SwiftPlantUML으로 UML 다이어그램 쉽게 그리기
    • Playground 가 열리지 않는 오류 해결하기
    • CocoaPods 제거하기
  • Python
    • 파이썬과 스위프트 문법 비교
    • 파이썬과 스위프트 문법 요약
  • Firebase
    • Storage를 API처럼 사용해보기
    • RealTime Database를 API처럼 사용해보기
Powered by GitBook
On this page
  1. iOS

UIFontMetrics 와 UIFont.preferredFont

앱을 개발할 때, 접근성(Accessibility) 기능은 매우 중요하죠. 접근성 기능은 다양한 사람들이 장치와 상호 작용하는 데 도움이 됩니다. 접근성의 범위는 꽤나 방대하지만, 눈이 안좋거나 40~50대의 고령자를 위한 Dynamic Type 또한 접근성을 지원하는 것 중에 하나입니다.

Dynamic Type을 지원하는 앱들은 [ 설정 ]-[ 일반 ]-[ 손쉬운 사용 ]-[ 더 큰 텍스트 ] 에서 글자 크기를 변경하게 되면, 앱에서도 각 레이블이나 버튼의 Text 크기가 변하게 되죠.

오늘은 간단하게 Dynamic Type을 설정할 때 가장 많이 쓰는 API인 UIFont.preferredFont(forTextStyle:)와 UIFontMetrics.default.scaledFont(for:)에 대해서 비교해보겠습니다.

일단 둘 다 사용은 아래와 같은 식으로 하게 됩니다. 레이블을 생성하고 API를 사용하죠.

import UIKit

class FeaturedCell: UICollectionViewCell {
    static var reuseIdentifier: String = "FeaturedCell"
    
    let tagline = UILabel()
    let name = UILabel()
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        tagline.font = UIFontMetrics.default.scaledFont(for: UIFont.systemFont(ofSize: 12, weight: .bold))
        tagline.textColor = .systemBlue 
        
        name.font = UIFont.preferredFont(forTextStyle: .title2)
        name.textColor = .label
    }
    
    required init?(coder: NSCoder) {
		fatalError("init(coder:) has not been implemented")
    }
}

하지만 차이점이 있어요. UIFont.preferredFont(forTextStyle:) 같은 경우는 미리 지정된 크기 또는 양식이 있습니다. 애플의 human-interface-guidelines 에 나와있는 그림인데요.

Style이 title1, title2, title3, body 와 같은 식으로 지정되어 있고 그에 맞는 Size 표가 있습니다. 만약에 실무에서 디자인이 넘어왔을 때, 해당 폰트 크기와 Size가 같다면 그에 맞는 스타일을 지정해서 사용할 수 있을거에요.

반면에, UIFontMetrics.default.scaledFont(for:) 같은 경우는 좀 더 디테일한 요구사항이 있을 때 사용해야 합니다. 예를 들어, 이런 상황인거죠.

위의 그림에서 Body 스타일은 Regular의 Weight를 가지고 있고 Size는 17입니다. 그런데, 디자이너의 요구사항은 Size 17에 Weight를 Bold로 하고 싶은 것이죠. 이런 상황이라면 UIFontMetrics.default.scaledFont(for:)를 사용할 수 있습니다.

그래서 위에 코드에서도 아래처럼 사용한 것이죠. 매개변수로는 UIFont 타입이 필요한데, weight가 Bold인 12 Size의 폰트를 생성해서 넣어준 것이죠.

tagline.font = UIFontMetrics.default.scaledFont(for: UIFont.systemFont(ofSize: 12, weight: .bold))

실제 예시 그림을 보면, 아래의 그림은 앱스토어의 게임 탭인데요. 글씨가 좀 작아서 티가 나는지 모르겠습니다만 지금 참여 가능 이라는 파란색 글자의 Weight가 Regular가 아니라 Bold 입니다.

즉, 이렇게 디자인의 요구사항에 맞게 각 API들을 사용하면 되는 겁니다. 아래에 HIG 링크를 첨부해놓도록 하겠습니다.

Reference

Previousrequired init?(coder: NSCoder)Next제약조건을 줄여주는 UIStackView

Last updated 2 years ago

https://developer.apple.com/design/human-interface-guidelines/foundations/typography/