Хорошо, другая проблема с динамической высотой UITableViewCell, но с небольшим завихрением. К сожалению, я не могу перейти на iOS 8 только после освобождения, иначе проблема будет решена. Нужна iOS> = 7.1.Соотношение сторон UIView смущает системуLayoutSizeFittingSize
Я пытаюсь создать ячейку с двумя изображениями в верхней части ячейки, надписи под ними и надписью ниже. Я знаю, что два верхних изображения будут квадратными, и поэтому я хочу, чтобы они имели одинаковый размер и сохраняли квадратное соотношение сторон, но изменяли размер, когда размер экрана изменяется (например, изменение ориентации или другое устройство).
Изображение, которое могло бы помочь с визуализацией (не может включать в себя из-за репутации Nevermind цвета, визуализация помогают.): http://i.stack.imgur.com/kOhkl.png
Обратите внимание на пробел после последнего текста, который не должен быть там.
Я реализовал динамическую высоту в предыдущем приложении в соответствии с: Using Auto Layout in UITableView for dynamic cell layouts & variable row heights (с успехом) и использовал тот же метод теперь.
Я установил ограничения, используя как раскадровки, так и программно, но без успеха.
Вот и кикер. При вызове:
CGFloat height = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
В:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
значение высоты пути больше, чем высота при чтении:
cell.contentView.frame
Другой проблема заключается в том, что если я удалю ограничение соотношения сторон на изображения и только изменяет его на явное ограничение высоты, оно отлично работает.
Для тех, кто готов помочь мне собрать очень простой пример проект, иллюстрирующий проблему: https://github.com/alefr/DynamicTableCellHeight
Пришло установка использовать раскадровку для ограничений и есть дополнительный филиал: ExplicitHeightConstraint, что не делает ничего, но изменить соотношение сторон ограничения к ограничению высоты для изображений.
** Так что вопрос: ** Может ли кто-нибудь увидеть что-то не так с ограничениями, которые заставляют его сбивать с толку расчеты высоты, или у кого-нибудь есть альтернативные предложения, чтобы получить желаемый результат? (Хотя я бы хотел использовать автоматическую компоновку для просмотров).
В работе есть немало ограничений (хотя и ничего не придумано), поэтому я считаю, что легче смотреть в предоставленной раскадровке (github link), чем прямо указывать их здесь. Но если кому-то кажется, что я могу это сделать. Оценочные расчеты высоты выглядеть так:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
// Don't care about memory leaks now:
DynamicTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"dynamicCell"];
[self populateCell:cell withContent:self.tableData[indexPath.row]];
// Make sure the constraints have been set up for this cell, since it may have just been created from scratch.
// Use the following lines, assuming you are setting up constraints from within the cell's updateConstraints method:
[cell setNeedsUpdateConstraints];
[cell updateConstraintsIfNeeded];
// Set the width of the cell to match the width of the table view. This is important so that we'll get the
// correct cell height for different table view widths if the cell's height depends on its width (due to
// multi-line UILabels word wrapping, etc). We don't need to do this above in -[tableView:cellForRowAtIndexPath]
// because it happens automatically when the cell is used in the table view.
// Also note, the final width of the cell may not be the width of the table view in some cases, for example when a
// section index is displayed along the right side of the table view. You must account for the reduced cell width.
cell.bounds = CGRectMake(0.0f, 0.0f, CGRectGetWidth(tableView.bounds), CGRectGetHeight(cell.bounds));
// Do the layout pass on the cell, which will calculate the frames for all the views based on the constraints.
// (Note that you must set the preferredMaxLayoutWidth on multi-line UILabels inside the -[layoutSubviews] method
// of the UITableViewCell subclass, or do it manually at this point before the below 2 lines!)
[cell setNeedsLayout];
[cell layoutIfNeeded];
// Get the actual height required for the cell's contentView
CGFloat height = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
// So we can read debug values
CGRect contentFrame = cell.contentView.frame;
CGRect firstImageFrame = cell.firstArtwork.frame;
CGRect secondImageFrame = cell.secondArtwork.frame;
CGRect nameFrame = cell.name.frame;
CGRect numArtworksFrame = cell.numArtworks.frame;
// Add an extra point to the height to account for the cell separator, which is added between the bottom
// of the cell's contentView and the bottom of the table view cell.
height += 1.0f;
return height;
}
- (void)populateCell:(DynamicTableViewCell*)cell withContent:(DynamicContent*)content
{
cell.firstArtwork.image = content.firstImage;
cell.secondArtwork.image = content.secondImage;
cell.name.text = content.name;
cell.numArtworks.text = [NSString stringWithFormat:@"%@ artworks", content.numImages];
}
Благодаря
Похож systemLayoutSizeFittingSize использует присущий размер содержимого 1х изображения для вычисления высоты и не принимая во внимание соотношения сторон. Таким образом, высота 494,5, которую он возвращает, на самом деле равна высоте, используя внутренний размер изображения. –
Да, вы правы. Многие из изображений, использованных в образце, имели одинаковую разрешающую способность. Я попробовал его с разными изображениями с разрешением и получил разные результаты. Обновленный репозиторий с веткой, называемой SizeVariations, если кто-то захочет попробовать ее. Тогда, возможно, это желаемое поведение systemLayoutSizeFittingSize, если мы хотим подобрать все изображения. Не знаете, как бы я установил ограничения для «уважения» установки ограничений для UIImagesViews без необходимости устанавливать явную высоту для установки размера. Но, по крайней мере, у меня есть кое-что, чтобы продолжить. Спасибо, что указали это. – alefr
Честно говоря, вы действительно хотите попытаться использовать изображения, правильно рассчитанные для просмотра, в противном случае это может привести к экранированию рендеринга, который является большим хитом производительности для прокрутки. Используйте Core Animation Profiler и включите «Color Offscreen-rendered Yellow», и вы поймете, что я имею в виду. (P.S. Можете ли вы отметить мой первый комментарий как полезный?) –