본문 바로가기
프로그래밍 놀이터/iOS

[iOS Study] 유동글자

by 돼지왕 왕돼지 2016. 3. 9.
반응형

 [iOS Study] 유동글자


출처 : 아론 힐리가스의 iOS 프로그래밍


250, 251, addObserver:selector:name:object:, awakeFromNib, Conflict, constraint, constraint placeholder, dealloc, default, defaultCenter, dkatlwjrdls shvdl, dkatlwjrdls sjql, dynamic text size, dynamic type, font, iboutlet, intrinsicContentSize, ios study, ios tutorial, iOS7, localization, nib, notification, NSLayoutConstraint, NSNotification, nsnotificationcenter, placeholder, preferredContentSizeCatregory, preferredFontForTextStyle:, remove at build time, rowHeight, setRowHeight, settings, style, tableview, text style, tjsgh zmrl, UIApplicatrion, UIContentSizeCategoryDidChangeNotification, UIContentSizeCategoryExtraExtraExtraLarge, UIContentSizeCategoryExtraExtraLarge, UIContentSizeCategoryExtraLarge, UIContentSizeCategoryExtraSmall, UIContentSizeCategoryLarge, UIContentSizeCategoryMedium, UIContentSizeCategorySmall, uifont, UIFontTextStyleBody, UIFontTextStyleCaption1, UIFontTextStyleCaption2, UIFontTextStyleFootnote, UIFontTextStyleHeadline, UIFontTextStyleSubheadline, UILabel, UITextField, wpdirwhrjs, XIB, [iOS Study] 유동글자, 기본값, 설정, 알림, 언아카이브, 우선순위, 유동 글자, 인스펙터, 제약조건 placeholder, 조절, 지역화, 텍스트 스타일, 폰트


-

유동 글자(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 박스를 체크한다.









반응형

댓글