2012-02-24 3 views
1

Я использую представление таблицы, которое использует пользовательский подкласс UITableViewCell, NoteCell. Подкласс имеет две текстовые метки, метку имени и метку даты, которые находятся рядом друг с другом в ячейке. Моя цель состоит в том, чтобы изменить метку имени, чтобы показать полную дату независимо от того, что.Как вы динамически изменяете ширину двух текстовых меток внутри UITableViewCell?

in cellForRowAtIndexPath, я пытаюсь вычислить и установить ширины двух текстовых представлений, чтобы дата была полностью отображена, а метка названия усечена.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"NoteCell"; 

    NoteCell *cell = (NoteCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    // Configure the cell... 
    cell.dateLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin; 

    cell.nameLabel.text = @"A name that should be truncated"; 
    cell.dateLabel.text = @"A long date to use as an example"; 

    // Set the widths 
    // First calculate how wide the date label needs to be. 
    cell.dateLabel.text = @"A really long date"; 
    CGSize dateLabelSize = [cell.dateLabel.text sizeWithFont:cell.dateLabel.font]; 
    CGFloat dateExpansionAmount = fabsf(dateLabelSize.width - cell.dateLabel.frame.size.width) + 10.0f; 
    cell.dateLabel.frame = CGRectMake(cell.dateLabel.frame.origin.x - dateExpansionAmount, 
             cell.dateLabel.frame.origin.y, 
             dateLabelSize.width, 
             cell.dateLabel.frame.size.height); 

    CGFloat nameLabelWidth = cell.dateLabel.frame.origin.x - cell.nameLabel.frame.origin.x; 
    cell.nameLabel.frame = CGRectMake(cell.nameLabel.frame.origin.x, 
             cell.nameLabel.frame.origin.y, 
             nameLabelWidth, 
             cell.nameLabel.frame.size.height); 
} 

К сожалению, результаты не верны, потому что я не думаю, что правильно устанавливаю/вычисляю рамки рамки. См. Изображение ниже.

Image 1 Image 2

Игнорирование проблемы с расчетами кадров есть лучший способ подойти к этой проблеме или вручную позиционирование текста метка кадра единственному пути?

+0

Вы уже пытались установить свойство autoResize на указанный ярлык? –

+0

Вы имеете в виду настройку свойств авторезистирования, т.е. распорок и пружин? - если да, то это изменит размеры ярлыков для расширения или сжимания при повороте устройства. –

+0

Вы правильно настроили маску изменения метки даты, но не метку имени. Он должен иметь гибкую ширину и фиксированный правый край. – sosborn

ответ

2

попробуйте использовать это, чтобы установить датуLabel.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 

    static NSString *CellIdentifier = @"NoteCell"; 

    NoteCell *cell = (NoteCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    // Configure the cell... 
    cell.dateLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin; 

    cell.nameLabel.text = @"A name that should be truncated"; 
    cell.dateLabel.text = @"A long date to use as an example"; 

    //set frame cell.dateLabel 
    CGSize maximumSize = CGSizeMake(INT_MAX, 44); // CGSizeMake(width,height). 
    CGSize dateStringSize = [[cell.dateLabel.text sizeWithFont:[UIFont systemFontOfSize:cell.dateLabel.font] 
                  constrainedToSize:maximumSize 
                   lineBreakMode:UILineBreakModeWordWrap]; 

    CGRect dateFrame = cell.dateLabel.frame; 
    dateFrame.size.width = dateStringSize. width; 
    cell.dateLabel.frame = dateFrame; 


return cell; 
} 
+0

Спасибо за Ответить! - Я пробовал этот метод, но случается, что метка даты сбрасывается с экрана после индикатора раскрытия. В принципе, поскольку вы увеличиваете ширину, вместо того, чтобы расширять ярлык и расширяя его влево, он увеличивает ширину вправо. –

+0

Я тоже пытался поиграть со стойками и пружинами. Я установил якорь происхождения в верхнем правом углу, в отличие от левого верхнего по умолчанию. Я также установил его так, чтобы метки автоматически открывались.Мне все еще не повезло, поскольку у меня такая же проблема, как описано выше. –

0

после того, как вы установите текст попытаться вызвать метод «sizeToFit» , а затем вы можете просто получить yourLabel.frame.size.width правильно, так что если 2 метки превышает рамку ячейки просто изменить размер этикетки имени с более низкий размер и установить правильное положение для второго, начиная где первый один заканчивается ...

NEW EDIT (см комментарий)

cell.nameLabel.text = @"A name that should be truncated"; 
cell.dateLabel.text = @"A long date to use as an example"; 
[cell.nameLabel sizeToFit]; 
[cell.dateLabel sizeToFit]; 
// now check if the 2 width exceed cell size: 
if (cell.nameLabel.frame.size.width + cell.dateLabel.frame.size.width > cell.frame.size.width){ 
//resize nameText: 
cell.nameLabel.frame.size.width = cell.frame.size.width - cell.dateLabel.frame.size.width; 
// ...and maybe consider to give it a minim size requirement 
} 
// now set the positions 
cell.nameLabel.frame = CGRectMake(0,0,cell.nameLabel.frame.size.width,cell.nameLabel.frame.size.height); 
cell.dateLabel.frame = CGRectMake(cell.nameLabel.frame.size.width,0,cell.dateLabel.frame.size.width,cell.dateLabel.frame.size.height); 

пс быть уверены, что ваши настройки autoresizingMask корректируются вверх и влево правильно для обеих этикеток

+0

Я даю ему попробовать, но первое, что я заметил, это то, что метод 'sizeToFit' изменяет размеры и перемещает метки из позиции, что создает собственный набор проблем. Как вы думаете, есть ли лучший способ достичь этой цели без ручного расчета ширины? –

+0

sizeToFit изменяет размер рамки вашего uilabel, чтобы устранить неиспользуемое пространство. таким образом, вы можете точно знать, насколько велик ваш текст, и теперь «вручную» рассчитать его ширину не так сложно ... см. НОВЫЙ РЕДАКТ в моем ответе – meronix

+0

ok Я попробовал, и я так близко, работа - ваши предложения хороши относительно sizeToFit. Есть одна затяжная проблема. Идентификатор метки фиксирован, а затем sizeToFit расширит рамку метки, чтобы она соответствовала тексту (в этом случае проблема), она расширяет ярлык до ПРАВИЛЬНОГО, а не слева, что означает, что он бежит за экраном после индикатора раскрытия. Ярлык должен расширять ширину влево, а не вправо ... –

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