2014-09-04 6 views
7

Хорошо, другая проблема с динамической высотой 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]; 
} 

Благодаря

+2

Похож systemLayoutSizeFittingSize использует присущий размер содержимого 1х изображения для вычисления высоты и не принимая во внимание соотношения сторон. Таким образом, высота 494,5, которую он возвращает, на самом деле равна высоте, используя внутренний размер изображения. –

+1

Да, вы правы. Многие из изображений, использованных в образце, имели одинаковую разрешающую способность. Я попробовал его с разными изображениями с разрешением и получил разные результаты. Обновленный репозиторий с веткой, называемой SizeVariations, если кто-то захочет попробовать ее. Тогда, возможно, это желаемое поведение systemLayoutSizeFittingSize, если мы хотим подобрать все изображения. Не знаете, как бы я установил ограничения для «уважения» установки ограничений для UIImagesViews без необходимости устанавливать явную высоту для установки размера. Но, по крайней мере, у меня есть кое-что, чтобы продолжить. Спасибо, что указали это. – alefr

+0

Честно говоря, вы действительно хотите попытаться использовать изображения, правильно рассчитанные для просмотра, в противном случае это может привести к экранированию рендеринга, который является большим хитом производительности для прокрутки. Используйте Core Animation Profiler и включите «Color Offscreen-rendered Yellow», и вы поймете, что я имею в виду. (P.S. Можете ли вы отметить мой первый комментарий как полезный?) –

ответ

3

Я была такая же ситуация, я решил ее переопределить systemLayoutSizeFittingSize функцию в данной клетке и заменить ограничение aspectRation на высоту ограничения. В следующем примере mediaPlayerAspectRationConstraint добавляется в представление во время жизненного цикла представления, и mediaPlayerHeightContraint будет использовать для определения правильной высоты ячейки (см. Код ниже).

И после этого я использовал

CGFloat height = [cell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height; 

вместо [cell.contentView systemLayoutSizeFittingSize:].

- (CGSize)systemLayoutSizeFittingSize:(CGSize)targetSize { 
    self.mediaPlayerHeightContraint.constant = CGRectGetHeight(self.experienceMedia.frame); 

    //Lets replace it with an exact height constraint (workaround). 

    //To remove the Unable to simultaneously satisfy constraints. exceptions 
    [self.contentView layoutIfNeeded]; 

    [self.experienceMedia removeConstraint:self.mediaPlayerAspectRationConstraint]; 
    [self.experienceMedia addConstraint:self.mediaPlayerHeightContraint]; 

    [self setNeedsUpdateConstraints]; 

    CGSize res = [self.contentView systemLayoutSizeFittingSize:targetSize]; 

    [self.contentView layoutIfNeeded]; 

    [self.experienceMedia removeConstraint:self.mediaPlayerHeightContraint]; 
    [self.experienceMedia addConstraint:self.mediaPlayerAspectRationConstraint]; 

    [self setNeedsUpdateConstraints]; 

    return res; 
} 
+0

Спасибо yoooouuu! : D – Trenskow

+0

Удивительный ответ! –

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