[iOS Study] 유동글자 |
출처 : 아론 힐리가스의 iOS 프로그래밍
-
유동 글자(Dynamic Type)는 iOS7 에 도입된 기술이다.
이는 읽기 편하도록 최적화되어 설계된 텍스트 스타일(text styles)을 제공한다.
설정(Settings) 앱에서 일곱 가지의 선호하는 텍스트 크기 중 하나를 선택할 수 있고 유동 글자를 지원하는 앱이 폰트를 적절히 조절한다는 것이 매력이다.
-
유동 글자 시스템은 텍스트 스타일 중심이다.
이 시스템은 텍스트 스타일을 요청받으면 적합한 폰트를 반환하기 위해 해당 텍스트 스타일과 연관된 사용자의 선호 텍스트 크기를 사용한다.
-
다음과 같은 코드로 쉽게 font 를 적용할 수 있다.
UIFont *font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
self.nameLabel.font = font;
style 은 다음과 같다.
UIFontTextStyleHeadline
UIFontTextStyleSubheadline
UIFontTextStyleBody
UIFontTextStyleFootnote
UIFontTextStyleCaption1
UIFontTextStyleCaption2
preferredFontForTextStyle: 메소드는 사용자의 설정이 적용된 미리 설정된 폰트를 반환할 것이다.
-
위의 preferredFontForTextStyle: 은 고정된 font size 를 사용하기 때문에 다른 font option 을 사용할 수 없다.
아래의 Solution 을 통해 Dynamic text size 에 대처할 수 있다.
http://stackoverflow.com/questions/20510094/how-to-use-a-custom-font-with-dynamic-text-sizes-in-ios7
-
사용자가 선호 폰트 크기를 바꾸면 객체들이 대기하도록 등록할 수 있는 알림이 전달된다.
이것은 UIContentSizeCategoryDidChangeNotification 이고 사용자 인터페이스를 업데이트할 최적의 시기이다.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateFonts) name:UIContentSizeCategoryDidChangeNotification object:nil];
// dealloc 에서 노티 해제도 필요하다.
-
모든 뷰는 intrinsicContentSize 라는 선호하는 크기가 있다.
이것은 각 뷰에 암시적인 높이와 너비 제약조건을 전한다.
뷰가 기본 크기에서 자신의 intrinsicContentSize 보다 더 커지면 뷰의 콘텐츠 크기 유지 우선순위보다 높은 우선순위의 제약조건을 가지게 된다.
뷰가 기본 크기에서 intrinsicContentSize 보다 작아지면 뷰의 콘텐츠 축소 방지 우선순위보다 높은 우선순위의 제약조건을 가지게 된다.
-
UILabel 과 UITextField 를 비교해보면 우선순위가 라벨이 251, 250 으로 더 높다.
더 높다는 것은 intrinsicContentSize 의 너비를 유지하기를 더 바란다는 의미이다.
너비에 대한 제약조건이 없다면..
-
텍스트 변화는 여러 가지 이유 때문에 발생할 수 있다.
가장 흔한 것은 앱에 유동 글자를 사용하거나 다른 언어를 지원하기 위한 지역화로 인한 것이다.
-
UIApplicatrion 은 preferredContentSizeCatregory 프로퍼티를 통해 사용자가 선택한 텍스트 크기를 알려준다.
이 메소드는 콘텐츠 크기 카테고리명을 가진 NSString 상수를 반환한다.
그 값들은 다음 중 하나이다.
UIContentSizeCategoryExtraSmall
UIContentSizeCategorySmall
UIContentSizeCategoryMedium
UIContentSizeCategoryLarge ( default )
UIContentSizeCategoryExtraLarge
UIContentSizeCategoryExtraExtraLarge
UIContentSizeCategoryExtraExtraExtraLarge
-
tableView 의 rowHeight 를 수정하려면
[tableView setRowHeight:value]; 를 호출한다.
-
- (void)awakeFromNib 은 NIB 파일에서 해당 객체가 언아카이브된 후에 호출된다.
보통 여기에서 XIB 에서 할 수 없는 추가적인 UI 작업을 한다.
-
아래와 같이 NIB 파일의 Constraint 와 코드상의 NSLayoutConstraint 를 연결하여 dynamic 하게 constraint 를 조절할 수 있다.
@property (nonatomic, weak) IBOutlet NSLayoutConstraint *imageViewWidthConstraint;
-
아래 코드로 너비와 높이가 같은 constraint 를 만들 수 있다.
NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:self.thumbnailView
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:self.thumbnailView
attribute:NSLayoutAttributeWidth
multiplier:1
constant:0];
[self.thumbnailView addConstraint:constraint];
-
코드로 제약조건을 주는 경우 NIB 에서 제약조건 conflict 가 날 수 있다.
그래서 제약조건을 무조건 없애주기보다는
Placeholder 를 체크해줌으로서 해결할 수 있다.
Placeholder 는 빌드 시에 제거되어 앱 실행 중에는 존재하지 않는다.
XIB 에서 제약조건을 선택하고 속성 인스펙터를 연다.
Placeholder 의 Remove at build time 박스를 체크한다.
'프로그래밍 놀이터 > iOS' 카테고리의 다른 글
[iOS Study] UISplitViewController (0) | 2016.03.16 |
---|---|
[iOS Study] 웹 서비스와 UIWebView (0) | 2016.03.15 |
[iOS Study] UITableViewCell 하위 클래스 만들기 (0) | 2016.03.08 |
[iOS Study] 저장, 읽기, 앱 상태 (0) | 2016.03.07 |
[iOS Study] 애니메이션 제어 (0) | 2016.03.06 |
댓글