2015-08-10 3 views
0

Есть 3 UILabel в моем TableViewCell.xib.One из них нужно установить attributedText с NSMutableAttributedString, код так:ИОС - как иметь несколько строк NSAttributedString

NSString * htmlString = [NSString stringWithFormat:@"将订单状态从 %@ 改变为 %@ ,原因:%@",lb.order_status,lb.changed_status,lb.remark]; 
NSMutableAttributedString * attrStr = [[NSMutableAttributedString alloc] initWithData:[htmlString dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil]; 
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init]; 
style.lineBreakMode = NSLineBreakByTruncatingTail; 
style.lineHeightMultiple = 0; 
[attrStr addAttribute:NSParagraphStyleAttributeName 
      value:style 
      range:NSMakeRange(0, attrStr.length)]; 
[attrStr addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Palatino-Roman" size:13.0] range:NSMakeRange(0, attrStr.length)]; 
lbRemark.attributedText=attrStr; 

Вопрос 1: lbRemark не может отображение с несколькими строками, но если я не использую NSAttributedString для установки lbRemark, тогда он может отображаться с несколькими строками. Что-то не так с NSAttributedString?

Вопрос 2: Мне нужна моя ячейка, чтобы рассчитать ее высоту с высотой lbRemark.

ответ

0

С iOS8, вам не нужно, чтобы рассчитать высоту этикетки. Auto-layout сделает это за вас.

Вставьте верхние и нижние ограничения между UILabel и ячейкой - не устанавливайте ограничение по высоте для UILabel.

В viewDidLoad: метод вашего UIViewController, просто сделайте следующее (замените 50.0f с высоты по умолчанию ваших строк):

self.tableView.estimatedRowHeight = 50.0f; 
self.tableView.rowHeight = UITableViewAutomaticDimension; 
+0

Спасибо за ответ, но это не сработает ... Я все еще хочу узнать, прикрепляю ли я верхнее и нижнее ограничение между UILabel и ячейкой, мне нужно установить ограничение для метки, например thie 'Height> = 14' ? И так как iOS8 я могу использовать Auto-layout для вычисления высоты для метки или ячейки без каких-либо кодов? –

+0

Да, вам не нужно иметь ограничение «Height> = 14» для вашего ярлыка. Просто установите верхнюю, нижнюю, ведущую и конечную. Установите для параметра numberOfLines значение 0 (или любое другое значение, которое вы хотите). Затем добавьте две строки выше. Затем ячейки будут иметь правильную высоту, чтобы показать полную метку. – siburb

+0

Многие подклассы UIView имеют внутренние ограничения, основанные на их содержании. Вам нужно установить ограничения для размещения метки внутри ячейки сверху, снизу, слева и справа, но не для установки высоты или ширины. Кроме того, вы должны убедиться, что эти ограничения установлены на приоритет 999, а не 1000 ... tableview вставляет его на 1000 ограничений. Наконец, вам, вероятно, потребуется реализовать функцию оценки высоты строки, чтобы активировать автозапуск ... просто верните 'UITableViewAutomaticDimension'. –

0

1: Установите для нескольких линий:

lbRemark.numberOfLines = 0;

2: Это, как рассчитать высоту этикетки в соответствии с текстом:

NSString * htmlString = [NSString stringWithFormat:@"将订单状态从 %@ 改变为 %@ ,原因:%@",@"test",@"test1",@"test2"]; 
NSMutableAttributedString * attrStr = [[NSMutableAttributedString alloc] initWithData:[htmlString dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil]; 
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init]; 
style.lineBreakMode = NSLineBreakByTruncatingTail; 
style.lineHeightMultiple = 0; 
[attrStr addAttribute:NSParagraphStyleAttributeName 
       value:style 
       range:NSMakeRange(0, attrStr.length)]; 
[attrStr addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Palatino-Roman" size:13.0] range:NSMakeRange(0, attrStr.length)]; 
lbRemark.numberOfLines = 0; 
CGRect paragraphRect = [attrStr boundingRectWithSize:CGSizeMake(625, CGFLOAT_MAX) 
              options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) 
              context:nil]; //here 625 is width of label, use whatever your width 

NSLog(@"height = %f", paragraphRect.size.height); //it should be height for label 
lbRemark.attributedText=attrStr; 
+0

Спасибо за ур ответ, но это не сработает, ярлык выглядит следующим образом: «bla bla bla ...». Он все еще не может сломать линии, но появляется «...» в тропе. –

0

Hum ... я, наконец, получил решение для нее. это не что-то неправильно с NSAttributedString.I реализовать функцию (моя напарница, который часто помогал мне предложить его):

static UITableViewCell *sizingLogCell = nil; 
static dispatch_once_t onceToken; 

if ([indentifier isEqualToString:@"logCell"]) { 
    dispatch_once(&onceToken, ^{ 
     sizingLogCell = [tableView dequeueReusableCellWithIdentifier:indentifier]; 
    }); 

    sizingLogCell.bounds = CGRectMake(0.0f, 0.0f, CGRectGetWidth(tableView.bounds), CGRectGetHeight(tableView.bounds)); 
    [sizingLogCell setNeedsLayout]; 
    [sizingLogCell layoutSubviews]; 
    [self configureLogCell:sizingLogCell forIndexPath:indexPath]; 
    CGSize size = [sizingLogCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; 
    return size.height + 1; 
} 

имя функции является: - (CGFloat) Tableview: (UITableView *) Tableview heightForRowAtIndexPath: (NSIndexPath *) indexPath indentifierForCe LL: (NSString *) Indentifier

Самое главное 'size.height + 1', если не '+1' метка еще не может отобразить с несколькими линиями.

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