Страницы

Поиск по вопросам

вторник, 7 января 2020 г.

IOS высота cell в зависимости от текста

#ios7 #ios #coredata #tableview


Я получаю обьект из CoreData следующим образом: 
self.name = [[abc anyObject] valueForKey:@"name"]

и отображаю его:
cell.nameLabel.text = [NSString stringWithFormat:@"%@",self.name];
cell.nameLabel.numberOfLines = 0;
cell.nameLabel.lineBreakMode = NSLineBreakByWordWrapping;

Помещается текст не полностью. Как менять высоту cell в зависимости от текста?    


Ответы

Ответ 1



- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { CGSize constraintSize = CGSizeMake(286.0f, CGFLOAT_MAX); UIFont *theFont = [UIFont systemFontOfSize:14.0f]; CGSize theSize; if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) { CGRect frame = [[self.mArray objectAtIndex:indexPath.row] boundingRectWithSize:constraintSize options:(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading) attributes:@{NSFontAttributeName:theFont} context:nil]; theSize = frame.size; } else { theSize = [[self.mArray objectAtIndex:indexPath.row] sizeWithFont:theFont constrainedToSize:constraintSize lineBreakMode:NSLineBreakByWordWrapping]; } return theSize.height; } Обновлено для iOS 7 и выше.

Ответ 2



Наилучший общий способ, который я пока придумал, такой. Выносите весь контент (view'шки) из cell'а в отдельную view (можно её назвать как-то вроде BlaBlaCellContentView). В этой view заводите класс-метод, который вам возвратит высоту ячейки с определенными данными (типа + (CGFloat) heightForData:(Data *)data maxWidth:(CGFloat)maxWidth). В этом методе для вычисления высоты, просто делаете layout всех ваших вьюшек (как обычно делаете в layoutSubviews) и выставляете фрейм для самой вьюшки. Далее, в cell'е заводите weak синглтон (хотя необязательно weak, можно обычный синглтон) для этой вьюшки и делаете аналогичный метод для вычисления высоты, примерно такой: - (void) sizeToFitWithWidth:(CGFloat)width { self.Width = width; [self layout]; self.Height = self.bottomLabel.BottomY + kMarginY; } + (CGFloat) heightForProduct:(IHerbProduct *)product width:(CGFloat)width { CartItemCellContentView *sharedCellContentView = [self sharedWeakInstance]; sharedCellContentView.product = product; [sharedCellContentView sizeToFitWithWidth:width]; CGFloat height = sharedCellContentView.Height; return height; } (замечу, что .Width, .Height, BottomY - это из моей собственной категории для UIView, но из названий и так понятно, что они возвращают). Ну и код для weak синглтона (смысл - живет до тех пор, пока на него есть хотя бы одна ссылка. Если уничтожился, то при следующем вызове создастся заново): + (instancetype) sharedWeakInstance { static __weak id weakInstance = nil; id strongInstance = weakInstance; @synchronized(self) { if (!strongInstance) { strongInstance = [self new]; weakInstance = strongInstance; } } return strongInstance; } P.S. Пришёл к таком подходу, т.к.: sizeWithFont:constrainedToSize: не всегда даёт те же результаты, что и [UILabel sizeToFit]. Для сложных cell'ов приходится писать слишком много сложного кода для вычисления высоты - оказалось проще переиспользовать код для layout'а.

Ответ 3



Если у вас будет много ячеек разной высота, то можно вынести подсчет высоты в отдельный метод. - (CGFloat)textViewHeightForAttributedText: (NSAttributedString*)text andWidth: (CGFloat)width { UITextView *calculationView = [[UITextView alloc] init]; [calculationView setAttributedText:text]; CGSize size = [calculationView sizeThatFits:CGSizeMake(width, FLT_MAX)]; return size.height; } И потом уже получать высоту: UIFont *font = [UIFont fontWithName:@"HelveticaNeue-Medium" size:16.0]; NSDictionary *attrsDictionary = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName]; NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:text attributes:attrsDictionary]; CGFloat height = [self textViewHeightForAttributedText:attrString andWidth:280];

Ответ 4



-(void)viewDidLoad { self.yourTableView.rowHeight = UITableViewAutomaticDimension; self.yourTableView.estimatedRowHeight = 44.0f; } Всё! :)

Комментариев нет:

Отправить комментарий