Длина строки с заданным шрифтом, чтобы соответствовать UITextView 2 - Возврат

Вэтот вопрос Я попросил хороший способ обрезать строку, чтобы соответствовать заданному UITextView. Поскольку SDK не предоставил никакого способа напрямую, я закончил тем, что написал рекурсивный метод ниже (вызываемый только следующим открытым методом). Однако это не сработает, если только я не вычту коэффициент выдумки 15 (kFudgeFactor) из ширины поля при вычислении высоты строки. Если я этого не сделаю, возвращаемая строка на самом деле слишком длинна для поля и отображается в дополнительной строке под ним. Кто-нибудь знает, почему, и что я должен использовать вместо этого фактора выдумки?

#pragma mark Size string to fit the new view

#define kFudgeFactor 15.0
#define kMaxFieldHeight 9999.0

// recursive method called by the main API
-(NSString*) sizeStringToFit:(NSString*)aString min:(int)aMin max:(int)aMax
{
if ((aMax-aMin) <= 1)
    {
    NSString* subString = [aString substringToIndex:aMin];
    return subString;
    }

int mean = (aMin + aMax)/2; 
NSString* subString = [aString substringToIndex:mean];

CGSize tallerSize = CGSizeMake(self.frame.size.width-kFudgeFactor,kMaxFieldHeight);
CGSize stringSize = [subString sizeWithFont:self.font constrainedToSize:tallerSize lineBreakMode:UILineBreakModeWordWrap];

if (stringSize.height <= self.frame.size.height)
        return [self sizeStringToFit:aString min:mean max:aMax]; // too small
else    
        return [self sizeStringToFit:aString min:aMin max:mean];// too big
}

-(NSString*)sizeStringToFit:(NSString*)aString
{

CGSize tallerSize = CGSizeMake(self.frame.size.width-kFudgeFactor,kMaxFieldHeight);
CGSize stringSize = [aString sizeWithFont:self.font constrainedToSize:tallerSize lineBreakMode:UILineBreakModeWordWrap];

// if it fits, just return
if (stringSize.height < self.frame.size.height)
    return aString; 

// too big - call the recursive method to size it       
NSString* smallerString = [self sizeStringToFit:aString min:0 max:[aString length]];
return smallerString;   
}
 drudru08 июл. 2009 г., 19:40
Мне теперь разрешено добавлять комментарии :-) Тогда это должно быть допущением по коду линейного переноса. Если вы делаете это без этого режима и просто пытаетесь уместить одну строку, это правильно?
 Jane Sales08 июл. 2009 г., 15:03
Это хороший ответ, но, похоже, он не прав. Я уже проверил contentInset представления прокрутки, и он равнялся 0. Я только что проверил разницу между шириной фрейма и шириной содержимого contentSize представления прокрутки - и это тоже ноль. Похоже, что UITextView - это вся ширина представления прокрутки.

Ответы на вопрос(2)

это связано с тем, что размер рамки UIView не совпадает с размером представления содержимого. Подклассы UITextView из UIScrollView.

Решение Вопроса

UIScrollView Кажется, используется фиксированная 8-пиксельная вставка с обеих сторон. Это не зависит от выравнивания или размера шрифта (основано на тестировании и наблюдении, а не на каких-либо явных знаниях внутренних органов).

Таким образом, кажется, вы правы, используя свой фактор выдумки, но это, вероятно, должно быть16.0не15.0.

Ваш ответ на вопрос