2015-01-22 24 views
7

Benim uygulamamda metin girişi büyükse, metin görünümünde Read more (Daha fazla oku) ayarlamam gerekiyor. Benim yaklaşımım, metin görünümüne uyacak dizge aralığını bulmak ve buna Daha Fazla Bilgi ekleyebilmektir. Swift.The gereksinimi facebook gibi musluk görünümünde ayrıntılı görünümünde tam metni göstermek için daha fazla seçenek okumaktır.Belirli bir dizgiyle sabit genişlik ve yükseklik ile UITextView'e uyan karakter sayısını bulun.

cevap

6

Aradığınız işlev CTFramesetterSuggestFrameSizeWithConstraints. Temel olarak, belirli bir kareye sığacak karakter sayısını bulmanızı sağlar. Mevcut metninizi kesmek ve bir düğme eklemek için bu numarayı kullanabilirsiniz.

- (NSInteger)numberOfCharactersThatFitLabel { 

    // Create an 'CTFramesetterRef' from an attributed string 
    CTFontRef fontRef = CTFontCreateWithName((CFStringRef)self.font.fontName, self.font.pointSize, NULL); 
    NSDictionary *attributes = [NSDictionary dictionaryWithObject:(__bridge id)fontRef forKey:(id)kCTFontAttributeName]; 
    CFRelease(fontRef); 
    NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:self.text attributes:attributes]; 
    CTFramesetterRef frameSetterRef = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attributedString); 

    // Get a suggested character count that would fit the attributed string 
    CFRange characterFitRange; 
    CTFramesetterSuggestFrameSizeWithConstraints(frameSetterRef, CFRangeMake(0,0), NULL, CGSizeMake(self.bounds.size.width, self.numberOfLines*self.font.lineHeight), &characterFitRange); 
    CFRelease(frameSetterRef); 
    return (NSInteger)characterFitRange.length; 
} 

Here's a bog post hatları belirli sayıda rastgele metni keserek ve ona "görünümü daha" metnini ekleyerek tam olarak uygulanması için:

Bir UILabel alt sınıfının bu işlevi uygulaması yazdım .

+0

Bunu saran kelimeyi gözlemlediniz mi, bir tanesi karakter sargı için nasıl yapar? –

2

Bu biraz karmaşık, çünkü bazı harfler diğerlerinden daha geniştir.

var yourString: String = textField.text 
let myString: NSString = originalString as NSString 

//Set your font and add attributes if needed. 
let stringSize: CGSize = myString.sizeWithAttributes([NSFontAttributeName: yourFont]) 

Artık bir CGSize almak ve genişlik textfield daha geniş olup olmadığını kontrol edebilirsiniz: Ama sizeWithAttributes kullanılan yöntem kullanarak dize genişliğini kontrol edebilirsiniz.

if(sizeOfYourTextfield < stringSize){ 
    //String is too large for your UITextField 
} 
+0

Belirtilen boyutta bulunan dizgiyi alabileyim mi? – Sulabh

+0

Evet ama bence tek olasılık harflerin arasında dolaşıyor ve hala uygun olup olmadığını kontrol ediyor. – Christian

+0

Bu çözümü denedim, ancak bazen – Sulabh

2

Kgaidis'in mükemmel cevabının kaba bir çevirisi.

extension UILabel { 

    func numberOfCharactersThatFitLabel() -> Int { 
     let fontRef = CTFontCreateWithName(self.font.fontName as CFStringRef, self.font.pointSize, nil) 
     let attributes = NSDictionary(dictionary: [kCTFontAttributeName : fontRef]) 
     let attributeString = NSAttributedString(string: text!, attributes: attributes as? [String : AnyObject]) 
     let frameSetterRef = CTFramesetterCreateWithAttributedString(attributeString as CFAttributedStringRef) 

     var characterFitRange:CFRange 

     CTFramesetterSuggestFrameSizeWithConstraints(frameSetterRef, CFRangeMake(0, 0), nil, CGSizeMake(bounds.size.width, CGFloat(numberOfLines)*font.lineHeight), &characterFitRange) 

     return characterFitRange.length 
    } 
}