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.
7
A
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 .
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
}
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
}
}
Bunu saran kelimeyi gözlemlediniz mi, bir tanesi karakter sargı için nasıl yapar? –