Многоточие в конце UITextView

Если у меня есть многострочный непрокручиваемый UITextView, текст которого длиннее, чем может поместиться в видимой области, то текст просто обрезается следующим образом:

Congress shall make no law respecting 
an establishment of religion, or 

Как бы я получил текст, чтобы показать с многоточием, где обрезание текста, вот так

Congress shall make no law respecting
an establishment of religion, or … 

Другие элементы управления, такие как метки и кнопки, имеют эту возможность.


person cannyboy    schedule 17.08.2011    source источник


Ответы (3)


Почему бы не использовать UILabel настройку numberOfLines для чего-то подходящего и получить эту функциональность бесплатно?

person Paul.s    schedule 17.08.2011
comment
Вероятно, потому что: если вам нужна определенная область пространства, заполненная текстом, который закругляется, это работает только с UILabel, если вы можете рассчитать точное количество строк, которые будут использоваться, что трудно сделать с различными размерами экрана. Слишком мало строк, и у вас будет пустое место в конце, слишком много, и эллипсы вообще не будут отображаться, потому что они будут за кадром. - person Albert Renshaw; 10.12.2015

UITextView предназначен для прокрутки, когда строка больше, чем может показать представление. Убедитесь, что вы правильно установили атрибуты привязки и автоматического изменения размера в коде или файле xib.

Вот пример из запись в блоге о том, как реализовать собственное многоточие.

@interface NSString (TruncateToWidth)
- (NSString*)stringByTruncatingToWidth:(CGFloat)width withFont:(UIFont *)font;
@end

#import "NSString+TruncateToWidth.h"

#define ellipsis @"…"

@implementation NSString (TruncateToWidth)

- (NSString*)stringByTruncatingToWidth:(CGFloat)width withFont:(UIFont *)font
{
  // Create copy that will be the returned result
  NSMutableString *truncatedString = [[self mutableCopy] autorelease];
  // Make sure string is longer than requested width
  if ([self sizeWithFont:font].width > width)
  {
    // Accommodate for ellipsis we'll tack on the end
    width -= [ellipsis sizeWithFont:font].width;
    // Get range for last character in string
    NSRange range = {truncatedString.length - 1, 1};

    // Loop, deleting characters until string fits within width
    while ([truncatedString sizeWithFont:font].width > width) 
    {
      // Delete character at end
      [truncatedString deleteCharactersInRange:range];
      // Move back another character
      range.location--;
    }

    // Append ellipsis
    [truncatedString replaceCharactersInRange:range withString:ellipsis];
  }

  return truncatedString;
}

@end
person Joe    schedule 17.08.2011
comment
Я бы порекомендовал UILabel, но если вам нужно отредактировать этот пост iphonedevelopertips.com/cocoa/ - person Joe; 18.08.2011
comment
С UITextView не забудьте принять во внимание границы в 8 пикселей, которые элемент управления добавляет вокруг текста. Это может вызвать проблемы при определении ширины. - person reddersky; 04.12.2011

Кто-то только что показал мне, что на самом деле это очень легко сделать с помощью UITextView на iOS 7 и выше:

UITextView *textView = [UITextView new];
textView.textContainer.lineBreakMode = NSLineBreakByTruncatingTail;
person jasongregori    schedule 15.04.2016