2016-05-27 14 views
6

Ich habe eine UILabel und ich möchte bestimmen, wie viele Zeichen in UILabel abgeschnitten hat.
Mit diesem Code unten, ich kann es festzustellen, ob meine UILabel nur 1 Zeile habenErmitteln, wie viele Zeichen in UILabel hat abgeschnitten

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); 

es richtig funktioniert, und hier ist das Protokoll

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 

Das Problem ist, wenn meine UILabel mehrere Zeilen haben, ich ändere meinen Code

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

Es wird jedoch nicht richtig berechnet. Ich denke, wenn UILabel mehrere Zeilen haben, wird es Bruchlinie Zeichen enthalten

Jede Idee, es zu beheben. Jede Hilfe oder Anregung wäre sehr geschätzt.

+0

Warum möchten Sie wissen, wie viele Zeichen abgeschnitten wurden? –

+0

@KingBabar Ich möchte es dem Benutzer anzeigen –

+0

Ist es Ihnen möglich, ein 'UITextView' anstatt eines' UILabel' zu verwenden? –

Antwort

1

Sie überprüfen die Breite, aber Sie müssen die Höhe überprüfen.

Überprüfen Sie diese Open Source und sehen Sie, wie TTTAttributedLabel CoreText verwendet, um zu wissen, wann das Zeichen "..." hinzugefügt werden muss.

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

Blick auf den drawframesetter: attributedstring: Textrange: inrect: Kontext: Methode

Sie auch den Open-Source ändern kannst und setzt die Position von '...'

+0

Da Sie nur die Breite überprüfen, ignorieren Sie den Zeilenabstand, was zu einem schlechten Ergebnis führt –

1

Sie können tun es wie,

- (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. 
} 

Hier self.myLabel verweist Auslass des Etiketts.

numberOfCharactersThatTruncated ist Ihre desired output.

Dies gibt die Anzahl der Zeichen in der Beschriftung zurück, die abgeschnitten sind.

Dies wird völlig abgeschnittenen Zeichen kehre ich meine, wenn die Zeichenfolge Hello there ist und Etikett ist in der Lage hell ergeben sich dann zeigen 7 sein sollte, aber Sie werden in Etikett etwas wie h... weil Etikett drei Punkte zeigt, wenn truncate. Also, wenn Sie die Zeichen zählen möchten, die nicht angezeigt werden, dann müssen Sie 3 in die endgültige Ausgabe dh hinzufügen,

numberOfCharactersThatTruncated = numberOfCharactersThatTruncated + 3; 

Update:

Rahmen Mein Etikett ist: (27 , 75,93,56)

Ich habe gerade top,leading,fixed height,fixed width Einschränkungen festgelegt.

Ans funktioniert wie Charme.

Ich glaube, Sie machen Fehler beim Zählen der Zeichen.Leerraum sollte als ein Zeichen betrachtet werden. Wenn Ihr Etikett dann drei Punkte anzeigt, können diese drei Zeichen angezeigt werden.

Beispiel: Ihre Zeichenfolge lautet: Wie geht es Ihnen?

so insgesamt Charakter ist: 12

jetzt zum Beispiel das Etikett zeigt: (. Einschließlich (Punkte)), wie ein ...

zeigt, dass es 8 Zeichen bedeutet

So numberOfCharactersThatTruncated zurück 4.

Wenn Sie erwägen, dass how a nur sichtbare Zeichen sind und nicht unter Berücksichtigung . dann sollten Sie 3-numberOfCharactersThatTruncated hinzufügen.

Wenn Sie nur Zeichen anzeigen möchten, die in ein Etikett passen, verwenden Sie label1.text = [text substringToIndex:numberOfCharsInLabel1]; dies.

Es wird kein Punkt angezeigt.

Cheers .... :)

+0

Entschuldigung für die späte Antwort, weil mein Computer ein Problem hatte. Ich habe Ihre Lösung überprüft, aber es wird nicht korrekt berechnet, wenn mein Etikett mehrere Zeilen enthält. –

+0

Es ist in meiner Demo gut kalkuliert, wenn mehrere Zeilen vorhanden sind !!! – Lion

+0

können Sie Ihre Demo teilen. Ich auch ein Demo-Projekt erstellen und verwenden Sie Ihren Code, aber es falsch berechnen –