alx
@alx
MobApp Developer

Как посчитать ширину ячейки для UICollectionView?

Внутри ячейки есть только один элемент - UILabel. Примерно как на картинке:

071b4c44ebc845f48029244ee9fd5fd4.png

Текст в этом UILabel может быть разный, соответственно, знать заранее ширину нельзя. Видел варианты с подсчетом ширины текста, используя название и размер шрифта. Но привязываться в коде к стилю элементов не хочу.

В контроллере sizeForItemAt вызывается раньше, чем cellForItemAt, т.е. до того как в UILabel появится реальный текст. Поэтому, реальный размер в sizeForItemAt вычислить не удастся.

Подскажите, каков должен быть правильный алгоритм решения подобной задачи? Зачем вообще sizeForItemAt, если в него можно забить только какие-то фиксированные для всех ячеек значения.
  • Вопрос задан
  • 261 просмотр
Пригласить эксперта
Ответы на вопрос 2
alexyat
@alexyat
iOS Developer
вот метод для подсчета высоты текста
+(CGFloat)sizeHeightForText:(NSString *)text withFont:(UIFont *)font withWidth:(float)width
{
	CGSize constraint = CGSizeMake(width, 20000.0f);
	CGSize size = [text sizeWithFont:font
				   constrainedToSize:constraint 
					   lineBreakMode:NSLineBreakByWordWrapping];
	return floorf(size.height)+1;
}

в конце floorf нужно для того чтобы не было blending при отрисовке.

использовать так

float newTextHeight = MIN(maxTextHeight, [YAYHelper sizeForText:name.text withFont:name.font withWidth:name.frame.size.width]);


maxTextHeight - на всякий случай чтобы не было слишком больших ячеек.
sizeForText: - текст для которого считаем
withFont: - шрифт который будем использовать
withWidth: - ширина лейбла
Ответ написан
Комментировать
ManWithBear
@ManWithBear
Swift Adept, Prague
Вариант от Alexander работает, но ужасен.
В идеале вам нужно создать и хранить где-нибудь пустую ячейку, в которую для просчета закидываете все данные, говорите ей [cell sizeToFit] (как вариант sizeThatFits), потом возвращаете ее размеры.
А вообще смотрите в сторону https://github.com/Instagram/IGListKit от Инстаграмма.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы