2012-05-21 3 views
5

선형 메서드가 너무 느리기 때문에 code found here을 이진 알고리즘으로 변환하려고합니다. 나는 실용적인 구현을 가지고 있지만, 내가 얻지 못하는 결과가 정확하지 않기 때문에 (즉, 너비가 20 픽셀 정도를 더하거나 뺄 때, 나는 같은 길이로 절단된다. 문자열 .. 조금 더 정확해야하고 더 가까운 컷을 가져야합니다.) :NSString을 너비로 자릅니다

-(NSString*)stringByTruncatingToWidth:(CGFloat)width withFont:(UIFont*)font addQuotes:(BOOL)addQuotes 
{ 
    int min = 0, max = self.length, mid; 
    while (min < max) { 
     mid = (min+max)/2; 

     NSString *currentString = [self substringWithRange:NSMakeRange(min, mid - min)]; 
     CGSize currentSize = [currentString sizeWithFont:font]; 

     if (currentSize.width < width){ 
      min = mid + 1; 
     } else if (currentSize.width > width) { 
      max = mid - 1; 
     } else { 
      min = mid; 
      break; 
     } 
    } 
    return [self substringWithRange:NSMakeRange(0, min)]; 
} 

누구나 그걸 잘못 생각할 수 있습니까? (이 카테고리의 방법, 그래서 self가있는 NSString입니다

+0

왜 직접 계산해야합니까? 끈으로 뭐하고 있니? 레이블 안에 만 표시하면 레이블을 자르도록 구성 할 수 있습니다. 잘라내기를 방지하기 위해 레이블에 텍스트를 맞추기 위해 글꼴 크기를 조금 줄이는 것도 허용 할 수 있습니다. –

+0

나는 그림을 그렸고 끝 부분에 타원을 추가해야합니다. 나는 또한 주위에 따옴표를 감싸고 싶다. 그래서 drawInRect withLineBreakMode는 끝 인용문을자를 것이기 때문에 여기에 옵션이 없다 .. – Snowman

+0

위의 링크를위한 Thx 멋쟁이. 미친 듯이 내 문제 해결 방안을 찾았지만 마침내 찾았다. 너의 포스트에서 .. – Rendy

답변

2

내가이 줄 잘못된 확신은 :.

[self substringWithRange:NSMakeRange(min, mid - min)]; 

이 모든 패스, 당신은 문자열의 크기를 검사하고 있음을 의미 min에서 mid까지 - 그 문자열은 사용자가 검색 할 때 min이 문자열을 행진하기 때문에 표시 될 문자열이 아닙니다. 문자열 시작 부분부터 항상 테스트해야합니다.

[self substringWithRange:NSMakeRange(0, mid)]; 

검색이 완료되면 반환 할 항목입니다.

+0

아, 네, 이것이 문제였습니다! 감사! – Snowman

+3

'[string substringToIndex : mid]'는 NSRange를 생성하는 단계를 줄여줍니다. – benzado

관련 문제