¿Encuentra la cantidad de caracteres que cabe en un UITextView con ancho y altura constante con una cadena dada?

En mi aplicación, necesito establecer Leer más en la vista de text si la input de text es grande. Así que mi enfoque es encontrar el range de cadena que cabría en la vista de text y agregarle más información. ¿Hay alguna manera de lograrlo? en Swift. El requisito es emular la opción de leer más para mostrar el text completo en una vista detallada, como Facebook.

La function que está buscando es CTFramesetterSuggestFrameSizeWithConstraints . Esencialmente, le permite averiguar la cantidad de caracteres que encajan en un determinado marco. Puede usar ese número para cortar su text actual e insert un button.

Escribí una implementación de esta function para una subclass de un UILabel:

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

Aquí hay una publicación de pantano para la implementación completa de cortar el text aleatorio a un número específico de líneas y añadirle text "ver más".

Es un poco complicado, porque algunas letras son más anchas que otras. Pero puede verificar el ancho de su cadena utilizando el método sizeWithAttributes :

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

Ahora recibe un CGSize y puede verificar si el ancho es más ancho que su campo de text.

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

Una rápida y rápida traducción de la excelente respuesta de Kgaidis.

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