Truncate an NSString to width
algorithm, ios, objective-c
Solution
I'm pretty sure this line is wrong:
[self substringWithRange:NSMakeRange(min, mid - min)];
This means that every pass, you're only examining the size of the string from `min` to `mid` -- that's not the string that you're going to end up displaying, though, because `min` is marching up the string as you search. You should be always be testing starting from the beginning of the string:
[self substringWithRange:NSMakeRange(0, mid)];
which is what you're going to return when your search is done.
Problem
I'm trying to convert the code found here to a binary algorithm instead, since the linear method is terribly slow. I have a working implementation, but theres seems to be some thing I'm missing, since the results I'm getting are not precise (that is, if I add or subtract 20 or so pixels from the width, I get the same truncated string..it should be a little more accurate and have a closer cut): ``` -(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)]; } ``` Can anyone see off the bat what could be wrong with that? (This is a category method, so `self` is an NSString.