iOS UILabel 설정 내용 의 간격 및 높이 계산 예시

7155 단어 iosUILabel
머리말
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;
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기