Позиционирование изображенияПримечание UITableViewCell
В каждом UITableViewCell из UITableView я помещаю изображение в свой imageView. Однако, если я увеличиваю высоту ячейки с помощью tableView: heightForRowAtIndexPath: чтобы разместить больше текста, я обнаружил, что:
- Изображение выравнивается по центру по вертикали.
- Левый край изображения увеличивается. Это подталкивает текст так, чтобы его левое поле больше не выравнивалось с текстом в ячейках выше и ниже.
Я хотел бы, чтобы изображение было выровнено по вертикали, так что оно находится в верхнем левом углу ячейки (например, первая ячейка на изображении ниже) и не имеет увеличенного левого поля (так что левое поле текста во второй ячейке выравнивается с текстом в первой ячейке).
Изменение рамки, центра и т.д. изображения, похоже, не влияет. Есть идеи? Спасибо...
(У меня есть изображение проблемы, но SO не позволит мне опубликовать изображение еще, потому что я ноб с менее чем 10 репутацией. Grrr...)
Ответы
Ответ 1
Вам нужно подклассифицировать UITableViewCell и переопределить layoutSubviews следующим образом:
- (void) layoutSubviews
{
[super layoutSubviews];
self.imageView.frame = CGRectMake( 10, 10, 50, 50 ); // your positioning here
}
В вашем методе cellForRowAtIndexPath: обязательно верните экземпляр вашего нового типа ячейки.
Ответ 2
В тот момент, когда вы считаете, что вам нужно настроить размеры или позиции элементов в стилях по умолчанию, нужно время, которое вам нужно подумать о создании пользовательской ячейки с вашими собственными размерами и позиционироваться так, как вы хотите. Вот почему вы можете создавать пользовательские ячейки.:)
Ответ 3
Другой способ (работает в iOS 6) - создать UIImageView и добавить его в ячейку в качестве подвью
UIImageView *yourImageView = [[UIImageView alloc] initWithFrame:CGRectMake(x,y,20,20)];
[yourImageView setImage:[UIImage imageNamed:[imagesArray objectAtIndex:indexPath.row]]]; //You can have an Array with the name of
[yourcell.contentView addSubview:yourImageView]; //add the imageView as a subview
Ответ 4
Действительно полезная функция, которую вы, возможно, не пробовали (в UITableViewDelegate
), это tableView:willDisplayCell:forRowAtIndexPath:
. Он вызывается непосредственно перед отображением ячейки, и ее цель - дать вам возможность сделать что-то в макете без изменения ОС перед ее отображением. Эффективно у вас есть полный контроль. Я использовал его для изменения шрифтов в ячейках, но вы можете перебирать подзоны ячеек и изменять их фреймы.
Тем не менее я согласен, что вы находитесь в точке, где пришло время заглянуть в пользовательские ячейки и прекратить борьбу с ОС. Это не сложно, и Apple дает хороший пример в Руководство по программированию таблиц для iOS.
Ответ 5
Вы можете создать пользовательскую ячейку и поместить объекты, в которых они вам нужны, а также установить значения автоматической маски.
Ответ 6
Вариант решения TomSwift Swift 4 (который мне очень понравился):
override public func layoutSubviews() {
super.layoutSubviews()
imageView?.frame = CGRect( x: 16, y: 9, width: imageView!.intrinsicContentSize.width, height: imageView!.intrinsicContentSize.height)
}