2016-05-27 2 views
6

У меня есть UILabel, и я хочу определить, сколько символов в UILabel усечено.
С этим ниже кодом, я могу определить, если мой UILabel только 1 линияОпределите, сколько символов в UILabel усечено

int numberOfTruncatedCharacter = 0; 
NSString *text = @"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s"; 

NSArray *words = [text componentsSeparatedByString:@" "]; 
NSString *newStr = @""; 
for (NSString *word in words) { 
    NSString *statement = [NSString stringWithFormat:@"%@ %@",newStr, word]; 
    CGSize size = [statement sizeWithAttributes:@{NSFontAttributeName: self.aboutLabel.font}]; 

    if(size.width < self.aboutLabel.bounds.size.width){ 
     newStr = [NSString stringWithFormat:@"%@ %@",newStr, word]; 
    }else{ 
     numberOfTruncatedCharacter++; 
    } 
    NSLog(@"%@ | %f | %f",word,size.width,self.aboutLabel.bounds.size.width); 
} 
NSLog(@"number of truncated character = %d",numberOfTruncatedCharacter); 

Он работает правильно, и вот бревно

2016-05-27 10:02:44.642 EarCrush[2284:42690] Lorem | 32.622070 | 355.000000 
2016-05-27 10:02:44.642 EarCrush[2284:42690] Ipsum | 64.345703 | 355.000000 
2016-05-27 10:02:44.642 EarCrush[2284:42690] is | 74.243164 | 355.000000 
2016-05-27 10:02:44.643 EarCrush[2284:42690] simply | 107.138672 | 355.000000 
2016-05-27 10:02:44.643 EarCrush[2284:42690] dummy | 145.644531 | 355.000000 
2016-05-27 10:02:44.643 EarCrush[2284:42690] text | 165.952148 | 355.000000 
2016-05-27 10:02:44.644 EarCrush[2284:42690] of | 177.978516 | 355.000000 
2016-05-27 10:02:44.644 EarCrush[2284:42690] the | 195.854492 | 355.000000 
2016-05-27 10:02:44.645 EarCrush[2284:42690] printing | 235.004883 | 355.000000 
2016-05-27 10:02:44.646 EarCrush[2284:42690] and | 255.429688 | 355.000000 
2016-05-27 10:02:44.647 EarCrush[2284:42690] typesetting | 309.921875 | 355.000000 
2016-05-27 10:02:44.648 EarCrush[2284:42690] industry. | 353.134766 | 355.000000 
2016-05-27 10:02:44.649 EarCrush[2284:42690] Lorem | 385.756836 | 355.000000 
2016-05-27 10:02:44.649 EarCrush[2284:42690] Ipsum | 384.858398 | 355.000000 
2016-05-27 10:02:44.650 EarCrush[2284:42690] has | 372.202148 | 355.000000 
2016-05-27 10:02:44.650 EarCrush[2284:42690] been | 379.218750 | 355.000000 
2016-05-27 10:02:44.650 EarCrush[2284:42690] the | 371.010742 | 355.000000 
2016-05-27 10:02:44.651 EarCrush[2284:42690] industry's | 401.171875 | 355.000000 
2016-05-27 10:02:44.651 EarCrush[2284:42690] standard | 397.431641 | 355.000000 
2016-05-27 10:02:44.652 EarCrush[2284:42690] dummy | 391.640625 | 355.000000 
2016-05-27 10:02:44.652 EarCrush[2284:42690] text | 373.442383 | 355.000000 
2016-05-27 10:02:44.653 EarCrush[2284:42690] ever | 375.844727 | 355.000000 
2016-05-27 10:02:44.653 EarCrush[2284:42690] since | 379.541016 | 355.000000 
2016-05-27 10:02:44.653 EarCrush[2284:42690] the | 371.010742 | 355.000000 
2016-05-27 10:02:44.654 EarCrush[2284:42690] 1500s | 383.374023 | 355.000000 
2016-05-27 10:02:44.654 EarCrush[2284:42690] number of truncated character = 13 

Проблема заключается в том, когда мой UILabel есть несколько строк, Я изменить свой код

if(size.width < self.aboutLabel.bounds.size.width * numberOfLines){

Однако он не будет правильно рассчитать. Я думаю, может быть, когда UILabel имеют несколько строк, он будет содержать символ линии разрыва

Любая идея исправить. Любая помощь или предложение были бы очень оценены.

+0

Зачем вам нужно знать, сколько символов было усечено? –

+0

@KingBabar Я хочу показать его пользователю –

+0

Возможно ли использовать 'UITextView' вместо' UILabel'? –

ответ

1

Вы проверяете ширину, но вам нужно проверить высоту.

Проверьте этот открытый исходный код и посмотрите, как TTTAttributedLabel использует CoreText, чтобы знать, когда добавлять символ «...».

https://github.com/TTTAttributedLabel/TTTAttributedLabel/blob/master/TTTAttributedLabel/TTTAttributedLabel.m

Посмотрите на drawframesetter: attributedstring: TextRange: inrect: контекст: метод

Вы можете также изменить с открытым исходным кодом и разоблачить позицию '...'

+0

Поскольку вы только проверяете ширину, вы игнорируете межстрочный интервал, который приводит к плохим результатам. –

1

Вы можете сделать это, как,

- (void)viewDidLoad { 

    [super viewDidLoad]; 
    UILabel *label1 = self.myLabel; 


UIFont *font = label1.font; 
NSString *text = @"This is the label text wich will be truncate!!"; 

CGRect label1Frame = label1.frame; 

NSUInteger numberOfCharsInLabel1 = NSNotFound; 

NSUInteger numberOfCharactersThatTruncated = NSNotFound; 

for (int i = [text length]; i >= 0; i--) { 
    NSString *substring = [text substringToIndex:i]; 
    NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:substring 
                     attributes:@{ NSFontAttributeName : font }]; 
    CGSize size = CGSizeMake(label1Frame.size.width, CGFLOAT_MAX); 
    CGRect textFrame = [attributedText boundingRectWithSize:size 
                options:NSStringDrawingUsesLineFragmentOrigin 
                context:nil]; 

    if (CGRectGetHeight(textFrame) <= CGRectGetHeight(label1Frame)) { 
     numberOfCharsInLabel1 = i; 

     numberOfCharactersThatTruncated = [text length] - numberOfCharsInLabel1; 
     break; 
    } 
} 

if (numberOfCharsInLabel1 == NSNotFound) { 
    // TODO: Handle this case. 
} 

label1.text = [text substringToIndex:numberOfCharsInLabel1]; // If you want to set character that label only can accept without truncating 

//OR 


label1.text = text; //set full text with truncating 


NSLog(@"Number of Truncated Characters %d",numberOfCharactersThatTruncated); 


// Do any additional setup after loading the view. 
} 

Здесь self.myLabel ссылается выход этикетки.

numberOfCharactersThatTruncated является вашим desired output.

это вернет количество символов в метке, которые усечены.

Это будет возвращать полностью усеченные символы я имею в виду, если ваша строка Hello there и метка может показать hell, то результат должен быть 7, но вы будете видеть в этикетке что-то вроде h..., потому что этикетка показывает три точки, когда усечь. Итак, если вы хотите посчитать символы, которые не отображаются на всех, то вам нужно добавить 3 в вашей конечной продукции, т.е.,

numberOfCharactersThatTruncated = numberOfCharactersThatTruncated + 3; 

Update:

рамки моего лейбла заключается в следующем: (27 , 75,93,56)

Я только что установил ограничения top,leading,fixed height,fixed width.

Ans такой же код работает как шарм.

Думаю, вы ошибаетесь в подсчете персонажей.Белое пространство следует рассматривать как один символ. Затем, если ваш ярлык показывает три точки, это означает, что эти три символа могут отображаться.

Пример: ваша строка: как вы?

так общий характер: 12

Теперь, например, ваша метка показывает: (. В том числе (точки)) как ...

, что означает, что он показывает 8 символов

Итак, numberOfCharactersThatTruncated будет возвращать 4.

Если учесть, что how a только видимые символы, а не считая ., то вы должны добавить 3 к numberOfCharactersThatTruncated.

Если вы хотите показать только символы, которые могут поместиться в ярлыке, используйте label1.text = [text substringToIndex:numberOfCharsInLabel1];.

Он не будет показывать точку.

Cheers .... :)

+0

извините за поздний ответ, потому что у моего компьютера была проблема. Я проверил ваше решение, но оно не будет правильно подсчитано, если моя метка имеет несколько строк. –

+0

. Он вычисляет штраф в моей демонстрации, если есть несколько строк !!! – Lion

+0

вы можете поделиться своей демонстрацией. Я также создаю демонстрационный проект и использую ваш код, но он неправильно вычисляет –

Смежные вопросы