2013-12-16 4 views
8

создать UITextView, добавить текст к нему, и поставить его в представлении (с контейнером)boundingRectWithSize не уважает слово оберточной

UITextView *lyricView = [[UITextView alloc] initWithFrame:screen]; 
lyricView.text = [NSString stringWithFormat:@"\n\n%@\n\n\n\n\n\n", lyrics]; 
[container addSubview:lyricView]; 
[self.view addSubview:container]; 

я затем получить размер его для использования с кнопкой и добавить его в UITextView

CGRect size = [lyrics boundingRectWithSize:CGSizeMake(lyricView.frame.size.width, MAXFLOAT) 
           options:NSStringDrawingUsesLineFragmentOrigin 
           attributes:@{NSFontAttributeName:[lyricView font]} 
           context:nil]; 
UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
[doneButton setFrame:CGRectMake(56, size.size.height + 55, 208, 44)]; 
[doneButton setTitle:@"Done" forState:UIControlStateNormal]; 
[lyricView addSubview:doneButton]; 

Это работает в большинстве случаев . Это будет уважать \ n разрывы строк (например, я добавил в свой stringWithFormat), но он не будет уважать переносы слов, автоматически добавляемые текстовым представлением. Поэтому, если lyrics имеет строку, которая не подходит на экране, UITextView будет ее обертывать (как и предполагалось), но size теперь немного короче, чем это должно быть, потому что это не соответствовало обложению текстового представления.

+1

вы пытались заменить '' NSStringDrawingUsesLineFragmentOrigin на 'NSStringDrawingUsesFontLeading'? Который ** Использует шрифт ведущих для расчета высоты строки ** – johnMa

+0

@johnMa Когда я использую' NSStringDrawingUsesFontLeading', она возвращает 0. Когда я использую 'NSStringDrawingUsesLineFragmentOrigin' или оба , У меня проблема, описанная выше. – vqdave

+0

Любое обновление по этому вопросу? У меня такая же проблема, и я не могу найти хороший ответ. –

ответ

2

Прошел еще несколько исследований и в итоге нашел this.

CGSize textSize = [textView sizeThatFits:CGSizeMake(textView.frame.size.width, FLT_MAX)]; 
CGFloat textHeight = textSize.height; 

Надеюсь, что это поможет кому-то!

+0

. Это все еще работает для вас в iOS 8? – fatuhoku

+0

Да, все еще работает в iOS 8. @fatuhoku – vqdave

5

Вы можете сообщить boundingRectWithSize для обработки строки в режиме обертывания слов. Вы должны добавить атрибут NSParagraphStyle к параметру атрибутов, с его lineBreakMode, установленным на NSLineBreakByWordWrapping. Итак:

NSMutableDictionary *attr = [NSMutableDictionary dictionary];  
// ...whatever other attributes you need... 
NSMutableParagraphStyle *paraStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; 
paraStyle.lineBreakMode = NSLineBreakByWordWrapping; 
[attr setObject:paraStyle forKey:NSParagraphStyleAttributeName]; 

затем использовать attr в качестве аргумента атрибутов к boundingRectWithSize.

Вы можете легко расширить/обобщить эту технику, чтобы читать другие атрибуты, включая существующие атрибуты стиля абзаца из любого источника, имеющего смысл.

+0

Не работает для меня ... :( –

+0

Это не будет работать, потому что это значение по умолчанию – Daniel

3

Следует использовать (NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading) для параметра options.

Смежные вопросы