2012-05-01 20 views
5

uymuyorsa, bir metnin sonunda varsayılan '...' değiştirin. Sabit genişlik ve yüksekliğe sahip iPhone projemde bir UILabel var, ancak içeriği içeriğin kullanıcı bakıyor. Bazen metin UILabel için büyüktür ve dize: '...' satırın sonuna eklenir. Bu dizeyi başka bir şeye değiştirebilir miyim diye merak ediyorum, örneğin: (daha fazlası).Bir UILabel içeriği

Teşekkürler!

+0

Etiketin yazı tipini otomatik olarak ayarlamasını sağlamak için etiketin 'adjustsFontSizeToFitWidth 'özelliğini YES'e ayarlamayı düşündünüz mü? – kevboh

+0

Sanırım @thematerik, min font boyutuna ulaştığında davranıştan bahsediyor ve elipslerle değiştirmeyi kesiyor. Bu ilginç bir soru. – danh

cevap

1

Ne yazık ki, böyle bir seçenek, bu benzer soruya göre, iOS dahil olmadığını görünür: How to change truncate characters in UILabel?

Ancak yukarıda sözü edilen soru halde yanıt olarak, bu tek başına kolaylıkla yapılabilir. Yapmanız gereken tek şey, dizenin nerede kesileceğini ve seçtiğiniz son karakter (ler) iniz için gereken miktarı çıkaracağını bulmak. Ardından kalanını ayrı bir dizeye koyun.

Bu yöntem için, bu yanıtın da yararlı olacaktır:

Javanator Kendi kesme yapmak zorunda olacağını söyledi gibi. Size belirli bir yazı tipiyle bir dizgenin genişliğini elde etmek için NSString sınıfına UIKit eklemelerindeki sizeWithFont: forWidth: lineBreakMode: mesajını kullanmanız gerekir. Bu, tüm yazı tiplerini ele alacaktır. yapabildin,

[self setText:self.label withText:@"Now is the time for all good men to come to the aid of their country" andTruncationSuffix:@" more"]; 

bu sizin için çalışıyorsa:

1

Ben

- (void)setText:(UILabel *)label withText:(NSString *)text andTruncationSuffix:(NSString *)truncationSuffix { 

    // just set the text if it fits using the minimum font 
    // 
    CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:label.minimumFontSize]]; 
    if (size.width <= label.bounds.size.width) { 
     label.text = text; 
     return; 
    } 

    // build a truncated version of the text (using the custom truncation text) 
    // and shrink the truncated text until it fits 
    NSInteger lastIndex = text.length; 
    CGFloat width = MAXFLOAT; 

    NSString *subtext, *ellipticalText; 

    while (lastIndex > 0 && width > label.bounds.size.width) { 
     subtext = [text substringToIndex:lastIndex]; 
     ellipticalText = [subtext stringByAppendingString:truncationSuffix]; 
     width = [ellipticalText sizeWithFont:[UIFont systemFontOfSize:label.minimumFontSize]].width; 
     lastIndex--; 
    } 
    label.text = ellipticalText; 
} 

böyle deyin ... Bu yüzden inşa edilmiş ve zorlukla bu test ilginç bir soru olduğunu düşünmüş setText: yöntemini geçersiz kılmak ve truncatedSuffix adında bir özellik eklemek için bunu kullanarak UILabel'in bir alt sınıfını eklemeyi düşünün.

+0

Metin ayarlandığında, özellikle Autolayout kullanıyorsanız etiketin genişliği belirlenemeyebilir. – ozgur

+0

@ozgur - evet, bu yazı şu anda oldukça modası geçmiş, otomatik düzen ve tüm yeni tipografi şeyler verildi. 'sizeWithFont' bile şimdi kullanımdan kaldırılmıştır. belki kısa bir süre sonra yeniden yazarım. – danh

1

iOS sürümü> 8.0 kullanıyorsanız, ResponsiveLabel'u kullanabilirsiniz. Burada, özelleştirilmiş kesilme belirteci sağlayabilir ve aynı zamanda devrilebilir hale getirmek için eylemleri tanımlayabilirsiniz.

NSString *expansionToken = @"Read More ..."; 
NSString *str = @"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."; 
NSMutableAttributedString *attribString = [[NSMutableAttributedString alloc]initWithString:kExpansionToken attributes:@{NSForegroundColorAttributeName:[UIColor blueColor],NSFontAttributeName:self.customLabel.font}]; 
[self.customLabel setAttributedTruncationToken:attribString withAction:^(NSString *tappedString) { 
NSLog(@"Tap on truncation text"); 
}]; 
[self.customLabel setText:str withTruncation:YES];