2015-01-22 3 views
7

В моем приложении мне нужно установить Read more в текстовое представление, если текстовый ввод является большим. Мой подход заключается в том, чтобы найти диапазон строк, который будет вписываться в текстовое представление и добавлять. Подробнее см. В нем. Есть ли способ достигните его в Swift. Требование состоит в том, чтобы эмулировать параметр «читать больше», чтобы отобразить полный текст в подробном виде на tap, подобном facebook.Найдите количество символов, которые вписываются в UITextView с постоянной шириной и высотой с заданной строкой?

ответ

6

Функция, которую вы ищете, является CTFramesetterSuggestFrameSizeWithConstraints. По сути, это позволяет вам узнать количество символов, которые соответствуют определенному кадру. Вы можете использовать этот номер, чтобы отключить текущий текст и вставить кнопку.

Я написал реализацию этой функции для подкласса в 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; 
} 

Here's a bog post для полного осуществления отрезав случайный текст на заданное число строк и добавления «вид более» текст к нему ,

+0

Вы заметили, что это перенос слов, как сделать его для обертывания символов? –

2

Это немного сложно, потому что некоторые буквы шире других. Но вы можете проверить ширину вашей строки с помощью 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]) 

Теперь вы получаете CGSize и вы можете проверить, если ширина шире, чем ваш TextField.

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

Будет ли я получать диапазон строк, который находится в указанном размере? – Sulabh

+0

Да, но я думаю, что единственная возможность - перебирать буквы и проверять, по-прежнему ли они подходят. – Christian

+0

Я пробовал это решение, но он иногда возвращал нуль – Sulabh

2

Грубый быстрый перевод превосходного ответа 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 
    } 
}