UITextView: получить текст с информацией обтекания - PullRequest
1 голос
/ 04 октября 2011

Возможно ли получить текст внутри UITextView с информацией обтекания.

enter image description here

Так что в этом случае.Я получу текст типа «Уважаемый StackOverFlow, \ n \ nВы делаете мой ...», не более «\ n».Я хотел бы получить новую строку после "и теперь я", как показано в UITextView.

Ответы [ 2 ]

5 голосов
/ 28 ноября 2012

Смотрите мой ответ здесь:

https://stackoverflow.com/a/13588322/341994

То, что вы просите сделать, это именно то, что Core Text делает для вас.Действительно, Core Text - это как UITextView знает, как обернуть текст.Таким образом, вы можете спросить Core Text, где находятся разрывы строк, как это делает UITextView.Посмотрите пример кода в моем ответе - он намного проще и надежнее, чем то, что вы пытаетесь сделать.

0 голосов
/ 05 октября 2011

Редактировать: Ответ Мэтта выше обеспечивает более простой способ сделать это.

Хорошо, кажется, это невозможно. Я должен был сделать это вручную.

Возможно, это не очень точно, и я все еще проверяю ошибки.

- (NSString*) wrappedStringForString: (NSString*)rawString {
NSString *resultSring = [NSString stringWithFormat:@""];

float textViewWidth = 130; //Width of the UITextView

//Check if already small.
CGSize textSize = [rawString sizeWithFont:self.backMessageTextView.font];
float textWidth = textSize.width;
if (textWidth < textViewWidth) {
    return rawString;
}

//Loop
NSUInteger length = [rawString length];
unichar buffer[length];
[rawString getCharacters:buffer range:NSMakeRange(0, length)];

NSString *singleLine = [NSString stringWithFormat:@""];
NSString *word = [NSString stringWithFormat:@""];
NSString *longWord = [NSString stringWithFormat:@""];

float difference;
for (NSUInteger i = 0; i < length; i++) {

    unichar character = buffer[i];

    //Add to word
    if (character != '\n') {
        word = [NSString stringWithFormat:@"%@%c", word, character];
    }

    if (character == '\n') {
        float wordLength = [word sizeWithFont:self.backMessageTextView.font].width;
        float lineLength = [singleLine sizeWithFont:self.backMessageTextView.font].width;
        if ((lineLength + wordLength) > textViewWidth) {
            resultSring = [resultSring stringByAppendingFormat:@"%@\n", singleLine];
            singleLine = @"";
            singleLine = [singleLine stringByAppendingFormat:@"%@\n",word];
            word = @"";
        } else {
            singleLine = [singleLine stringByAppendingString: word];
            word = @"";
            resultSring = [resultSring stringByAppendingFormat:@"%@\n", singleLine];
            singleLine = @"";
        }
    } 

    else if (character == ' ') {            
        float wordLength = [word sizeWithFont:self.backMessageTextView.font].width;
        float lineLength = [singleLine sizeWithFont:self.backMessageTextView.font].width;

        if ((lineLength + wordLength) > textViewWidth) {
            if (wordLength > textWidth) {
                resultSring = [resultSring stringByAppendingFormat:@"%@\n", singleLine];
                singleLine = @"";
                int j = 0;
                for (; j < [word length]; j++) {
                    unichar longChar = [word characterAtIndex:j];
                    longWord = [NSString stringWithFormat:@"%@%c", longWord, longChar];
                    float longwordLength = [longWord sizeWithFont:self.backMessageTextView.font].width;
                    float longlineLength = [singleLine sizeWithFont:self.backMessageTextView.font].width;
                    if ((longlineLength + longwordLength) >= textViewWidth) {
                        singleLine = [singleLine stringByAppendingString:longWord];
                        word = @"";
                        longWord = @"";                            
                        break;
                    }
                }

            }
            resultSring = [resultSring stringByAppendingFormat:@"%@\n", singleLine];
            singleLine = @"";
        }          
        singleLine = [singleLine stringByAppendingString: word];
        word = @"";
    }        
}

float wordLength = [word sizeWithFont:self.backMessageTextView.font].width;
float lineLength = [singleLine sizeWithFont:self.backMessageTextView.font].width;
// handle any extra chars in current word
if (wordLength > 0) {
    if ((lineLength + wordLength) > textViewWidth) {
        resultSring = [resultSring stringByAppendingFormat:@"%@\n", singleLine];
        singleLine = @"";
    }
    singleLine = [singleLine stringByAppendingString:word];
}

// handle extra line
if (lineLength > 0) {
    resultSring = [resultSring stringByAppendingFormat:@"%@\n", singleLine];
}
return resultSring;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...