iOS UILabel 설정 내용 의 간격 및 높이 계산 예시
UILabel 은 사용 빈도 가 매우 잦 기 때문에 문자 가 많 을 때 촘촘 해 보이 고 UI 디 스 플레이 와 사용자 가 보기에 불리 합 니 다.일반적으로 우 리 는 라벨 의'줄 간격'이나'문자 간격'을 조정 하여 문자 가 그렇게 긴밀 하지 않 고 사용자 체험 을 향상 시 켜 야 한다.
'줄 간격'이나'글자 간격'을 조정 한 후 레이 블 에 고도 로 적응 해 야 하 는 경우 가 많 고,이때 고도 계산 오류 가 발생 할 수 있 으 므 로'부자 문'높이 를 계산 해 야 한다.계산 이 끝 난 후에 테스트 를 통 해 알 수 있 듯 이 문자 가 1 줄 이 고 모든 문자 가'중국어'일 때 고도 의 계산 이 정확 하지 않 으 며 마지막 으로 이 문 제 를 처리 합 니 다.
다시 말 하면 다음 세 단계 로 나 누 어'UILabel 콘 텐 츠 의 간격 과 높이 의 계산'을 설정 합 니 다.
1.UILbael 의 분 류 를 통 해 간격 을 수정 하 는 기능 을 수행 합 니 다.
2.두 가지 방법 으로'부자'의 높이 를 계산한다.
3.'고도 계산 결과'의 특수 상황 을 처리한다.
1.라벨'줄 간격'또는'글자 간격'설정
사 고 를 설정 하 다.
일반적인 NSString 문 자 는 글꼴 의'줄 간격'이나'글자 간격'을 조정 할 수 없 지만,
NSAttributedString 부자 문 자 는 이 간격 을 조정 할 수 있 기 때문에 일반적인 글꼴 을 부자 문 자로 바 꾼 다음 부자 문 자 대응 방법 을 사용 하면 간격 을 설정 할 수 있 습 니 다.
설정 프로 세 스
label 에 분 류 를 추가 하여 분류 에서 설명 하고 세 가지 방법 을 실현 합 니 다.
@interface UILabel (ChangeLineSpaceAndWordSpace)
//1. :
+ (void)changeLineSpaceForLabel:(UILabel *)label WithSpace:(float)space;
//2. :
+ (void)changeWordSpaceForLabel:(UILabel *)label WithSpace:(float)space;
//3. :
+ (void)changeSpaceForLabel:(UILabel *)label withLineSpace:(float)lineSpace WordSpace:(float)wordSpace;
@end
1.설정:줄 간격
// Label
+ (void)changeLineSpaceForLabel:(UILabel *)label WithSpace:(float)space {
NSString *labelText = label.text;
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:labelText];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
[paragraphStyle setLineSpacing:space];
[attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [labelText length])];
label.attributedText = attributedString;
[label sizeToFit];
}
2.글자 간격 설정
// Label
+ (void)changeWordSpaceForLabel:(UILabel *)label WithSpace:(float)space {
NSString *labelText = label.text;
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:labelText attributes:@{NSKernAttributeName:@(space)}];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
[attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [labelText length])];
label.attributedText = attributedString;
[label sizeToFit];
}
3.줄 간격 과 글자 간격 설정
// Label
+ (void)changeSpaceForLabel:(UILabel *)label withLineSpace:(float)lineSpace WordSpace:(float)wordSpace {
NSString *labelText = label.text;
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:labelText attributes:@{NSKernAttributeName:@(wordSpace)}];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
[paragraphStyle setLineSpacing:lineSpace];
[attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [labelText length])];
label.attributedText = attributedString;
[label sizeToFit];
}
사용 예시
// label , lable
testLabel.text = @" ";
[UILabel changeLineSpaceForLabel:testLabel WithSpace:20];// testLabel 20
[UILabel changeWordSpaceForLabel:self.testLabel WithSpace:20];// testLabel 20
//
[UILabel changeLineSpaceForLabel:self.testLabel WithSpace:20];// testLabel 20, 20
레이 블 부 문자 높이 계산
계산 사고
부자 체 배열 높이 를 직접 계산 할 수 있 으 며,이 높이 는 레이 블 높이 이 며,UILable 방법 으로 레이 블 높이 를 계산 할 수도 있다.
방법 1.UILabel 사용 방법:sizeThatFits
- (CGRect)sizeThatFits:(CGSize)size;
UILabel 의 방법 인 sizeThatFits 를 통 해 이 방법 은 하나의 인 자 를 입력 하면 현재 label 높이 를 계산 할 수 있 습 니 다.인자 1.size:그 중에서 size 의 너 비 는 label 의 너비 이 고 size 의 일반 입력 최대 높이 입 니 다.
CGSize size = [label sizeThatFits:CGSizeMake(label.frame.size.width, CGFLOAT_MAX)];
방법 2.NSString 방법 사용:bounding WithRect
- (CGRect)boundingRectWithSize:(CGSize)size
options:(NSStringDrawingOptions)options
context:(nullable NSStringDrawingContext *)context;
이 방법 은 세 개의 인 자 를 입력 해 야 합 니 다:인자 1.size:그 중에서 size 의 너 비 는 label 의 너비 이 고 size 의 일반 입력 최대 높이 입 니 다.
인자 2.options:텍스트 를 그 릴 때 추가 옵션
1.NSStringDrawingUsesLineFragment Origin(전체 텍스트 는 각 줄 로 구 성 된 사각형 단위 로 전체 텍스트 의 사 이 즈 를 계산 합 니 다)
2.NSStringDrawingUsesFontLeading(글꼴 의 줄 간격 을 사용 하여 텍스트 가 차지 하 는 범 위 를 계산 합 니 다.즉,각 줄 의 아래쪽 에서 다음 줄 의 아래쪽 까지 의 거 리 를 계산 합 니 다)
3.NSStringDrawingUsesDeviceMetrics(문자 가 아 닌 이미지 기호 로 텍스트 의 점용 범 위 를 계산 합 니 다.즉,모든 글꼴 이 사용 하 는 공간 으로 텍스트 범 위 를 계산 합 니 다)
4.NSStringDrawingTruncates LastVisibleLine(텍스트 가 지정 한 경계 에 적합 하지 않 으 면 마지막 줄 에 생략 기 호 를 자동 으로 추가 합 니 다.NSStringDrawingUsesLineFragment Origin 이 설정 되 어 있 지 않 으 면 이 옵션 은 유효 하지 않 습 니 다)
인자 3.context:문맥,일반 전송 nil
사용 예시
NSStringDrawingOptions options = NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading;
CGRect rect = [attributeString boundingRectWithSize:CGSizeMake(label.frame.size.width, CGFLOAT_MAX) options:options context:nil];
라벨 부자 계산 고도 주의 점문제 가 생기다
문자 가 한 줄 만 있 고 모두 중국어 일 때:고도 계산 이 정확 하지 않 습 니 다.
해결 방향
우선:size ThatFits 나 bounding WithRect 를 통 해 처리 되 지 않 은 rect 값 을 계산 합 니 다.
첫 번 째 단계:rect 값 을 판단 합 니 다."한 줄 만 있 고 이 줄 의 문 자 는 모두 중국어 입 니까?"
두 번 째 단계:높이 값 을 복원 하고 높이 값 을 조정 합 니 다."줄 간격 값 빼 기"
예제 코드
// boundingWithRect rect
NSStringDrawingOptions options = NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading;
CGRect rect = [attributeString boundingRectWithSize:CGSizeMake(label.frame.size.width, CGFLOAT_MAX) options:options context:nil];
// : ( - ) <=
if ((rect.size.height - _font.lineHeight) <= paragraphStyle.lineSpacing){
// ,
if ([self containChinese:string]) {
// : -
rect = CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, rect.size.height-paragraphStyle.lineSpacing);
}
}
//
- (BOOL)containChinese:(NSString *)str {
for(int i=0; i< [str length];i++){ int a = [str characterAtIndex:i];
if( a > 0x4e00 && a < 0x9fff){
return YES;
}
}
return NO;
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Swift의 패스트 패스Objective-C를 대체하기 위해 만들어졌지만 Xcode는 Objective-C 런타임 라이브러리를 사용하기 때문에 Swift와 함께 C, C++ 및 Objective-C를 컴파일할 수 있습니다. Xcode는 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.