2010-02-15 7 views
6

UILabel에는 다른 절단 기술 (UILineBreakMode)을 사용하여 레이블을 자르는 기능이 있습니다. NSString UIKit 추가 문자열을 그리기위한 비슷한 기능이 있습니다.그래픽 너비를 기반으로 NSString을 자르는 방법은 무엇입니까?

그러나 실제로 잘린 문자열에 액세스 할 방법이 없습니다. 주어진 글꼴의 (그래픽) 너비를 기반으로 잘린 문자열을 얻는 다른 방법이 있습니까?

나는이 방법으로는 NSString에 카테고리가 싶습니다

-(NSString*)stringByTruncatingStringWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode 

답변

6

하나의 옵션은 당신이 바로 그 폭을 얻을 때까지 반복하여 다른 크기를하려고합니다. 나는. 전체 문자열로 시작하여 필요한 것보다 넓 으면 마지막 두 문자를 줄임표 문자로 바꿉니다. 충분히 좁아 질 때까지 반복하십시오.

긴 문자열로 작업하게된다고 생각한다면 잘린 점을 향해 바이너리 검색을 수행하여 조금 더 빠르게 만들 수 있습니다.

+0

감사합니다. 울리, 좋은 생각입니다. 매력처럼 작동합니다. 다른 주석의 코드를 참조하십시오. –

17
- (NSString*)stringByTruncatingStringWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode { 
    NSMutableString *resultString = [[self mutableCopy] autorelease]; 
    NSRange range = {resultString.length-1, 1}; 

    while ([resultString boundingRectWithSize:CGSizeMake(FLT_MAX, FLT_MAX) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attributes context:nil].size.width > width) { 
     // delete the last character 
     [resultString deleteCharactersInRange:range]; 
     range.location--; 
     // replace the last but one character with an ellipsis 
     [resultString replaceCharactersInRange:range withString:truncateReplacementString]; 
    } 
    return resultString; 
} 

iOS 6부터이 방법은 백그라운드 스레드에서 더 이상 실행되지 않는다는 점에 유의하십시오.

+0

아마도 iOS 방식으로 업데이트해야합니다 - boundingRectWithSize : options : attributes : context :, deprecation으로 인해. – skyylex

+0

@skyylex 참으로. 끝난. –

관련 문제