В моем приложении мне нужно установить Read more в текстовое представление, если текстовый ввод является большим. Мой подход заключается в том, чтобы найти диапазон строк, который будет вписываться в текстовое представление и добавлять. Подробнее см. В нем. Есть ли способ достигните его в Swift. Требование состоит в том, чтобы эмулировать параметр «читать больше», чтобы отобразить полный текст в подробном виде на tap, подобном facebook.Найдите количество символов, которые вписываются в UITextView с постоянной шириной и высотой с заданной строкой?
7
A
ответ
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 для полного осуществления отрезав случайный текст на заданное число строк и добавления «вид более» текст к нему ,
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
}
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
}
}
Вы заметили, что это перенос слов, как сделать его для обертывания символов? –