Я пытаюсь изучить макет авто, наконец-то подумал, что получаю зависание, когда это произошло. Я играю с прототипами ячеек и ярлыков. Я пытаюсь иметь
- Заголовок,
titleLbl
- синяя рамка в изображении - Деньги,
moneyLbl
- зеленый квадрат на картинке - Субтитры/Описание,
subTitleLbl
- красная рамка в изображении
Пока у меня есть это:
Чего я хочу достичь:
- Зеленый ящик должен всегда отображаться на 1 линии полностью
- Значение внутри зеленого окна должно быть центрировано в соответствии с синим полем
- Синий квадрат займет оставшееся пространство (-8px для горизонтального ограничения между 2) и отображает на нескольких строках, если необходимо
- Красное поле должно быть внизу и отображать как можно больше строк.
Как вы видите, это почти все работает, за исключением примера в последней строке. Я попытался исследовать это и из того, что я могу собрать, это как-то связано с внутренним размером содержимого. Многие сообщения в Интернете рекомендуют установку setPreferredMaxLayoutWidth
, я сделал это в нескольких местах для titleLbl
, и это не повлияло. Только когда hardcoding на 180
я получил результаты, но также добавил пробелы/дополнения к другим синим полям вверху/под текстом, значительно увеличивая пространство между красными/синими квадратами.
Вот мои ограничения:
Название:
Деньги:
Субтитры:
Основываясь на тестах, которые я запускал с другими текстовыми образцами, он, похоже, использует ширину, как показано в раскадровке, но любая попытка исправить ее не работает.
Я создал ivar ячейки и использовал его для создания высоты ячейки:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
[sizingCellTitleSubMoney.titleLbl setText:[[tableViewData objectAtIndex:indexPath.row] objectForKey:@"title"]];
[sizingCellTitleSubMoney.subtitleLbl setText:[[tableViewData objectAtIndex:indexPath.row] objectForKey:@"subtitle"]];
[sizingCellTitleSubMoney.moneyLbl setText:[[tableViewData objectAtIndex:indexPath.row] objectForKey:@"cost"]];
[sizingCellTitleSubMoney layoutIfNeeded];
CGSize size = [sizingCellTitleSubMoney.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
return size.height+1;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
MATitleSubtitleMoneyTableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifierTitleSubTitleMoney];
if(!cell)
{
cell = [[MATitleSubtitleMoneyTableViewCell alloc] init];
}
cell.titleLbl.layer.borderColor = [UIColor blueColor].CGColor;
cell.titleLbl.layer.borderWidth = 1;
cell.subtitleLbl.layer.borderColor = [UIColor redColor].CGColor;
cell.subtitleLbl.layer.borderWidth = 1;
cell.moneyLbl.layer.borderColor = [UIColor greenColor].CGColor;
cell.moneyLbl.layer.borderWidth = 1;
[cell.titleLbl setText:[[tableViewData objectAtIndex:indexPath.row] objectForKey:@"title"]];
[cell.subtitleLbl setText:[[tableViewData objectAtIndex:indexPath.row] objectForKey:@"subtitle"]];
[cell.moneyLbl setText:[[tableViewData objectAtIndex:indexPath.row] objectForKey:@"cost"]];
return cell;
}
Я пробовал настройку setPreferredMaxLayoutWidth
внутри подклассов ячейки:
- (void)layoutSubviews
{
[super layoutSubviews];
NSLog(@"Money lbl: %@", NSStringFromCGRect(self.moneyLbl.frame));
NSLog(@"prefferredMaxSize: %f \n\n", self.moneyLbl.frame.origin.x-8);
[self.titleLbl setPreferredMaxLayoutWidth: self.moneyLbl.frame.origin.x-8];
}
Журнал:
2014-04-30 21:37:32.475 AutoLayoutTestBed[652:60b] Money lbl: {{209, 20}, {91, 61}}
2014-04-30 21:37:32.475 AutoLayoutTestBed[652:60b] prefferredMaxSize: 201.000000
Это то, что я ожидал бы, так как 8px между двумя элементами и консоль проверяет это. Он отлично работает в первой строке, независимо от того, сколько текста я добавляю в синюю рамку, что совпадает с раскадрой, но любое увеличение до зеленой коробки отменяет вычисление ширины. Я попытался установить это в tableView:willDisplayCell
и tableView:heightForRowAtIndexPath:
, а также на основе ответов других вопросов. Но независимо от того, что это просто не макет.
Любая помощь, идеи или комментарии были бы с благодарностью