Позиционирование imageView UITableViewCell - PullRequest
16 голосов
/ 17 ноября 2010

В каждом UITableViewCell UITableView я помещаю изображение в его imageView. Однако, если я увеличу высоту ячейки, используя tableView: heightForRowAtIndexPath: чтобы вместить больше текста, я обнаружил, что:

  1. Изображение выровнено по центру по вертикали.
  2. Левое поле изображения увеличивается. Это сдвигает текст вправо, поэтому его левое поле больше не выравнивается по тексту в ячейках выше и ниже.

Я бы хотел, чтобы изображение было выровнено по вертикали, чтобы оно находилось в верхнем левом углу ячейки (как первая ячейка на изображении ниже) и чтобы его левое поле не увеличивалось (чтобы левое поле текста во второй ячейке совпадает с текстом в первой ячейке).

Изменение кадра, центра и т. Д. ImageView, похоже, не оказывает никакого влияния. Есть идеи? Спасибо ...

(У меня есть изображение проблемы, но ТАК не позволяет мне публиковать изображение еще, потому что я новичок с менее чем 10 репутацией. Grrr ...)

Ответы [ 6 ]

46 голосов
/ 17 ноября 2010

Вам необходимо создать подкласс UITableViewCell и переопределить layoutSubviews следующим образом:

- (void) layoutSubviews
{   
    [super layoutSubviews];

    self.imageView.frame = CGRectMake( 10, 10, 50, 50 ); // your positioning here
}

В вашем cellForRowAtIndexPath: метод обязательно верните экземпляр нового типа ячейки.

6 голосов
/ 17 ноября 2010

В тот момент, когда вы думаете, что вам нужно настроить размеры или позиции элементов в стилях по умолчанию, вам нужно подумать о создании пользовательской ячейки с размерами и позиционированием ваших собственных элементов так, как вы хотите.Вот почему вы можете создавать собственные ячейки.:)

4 голосов
/ 22 марта 2013

Другой способ (работает в 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
1 голос
/ 18 ноября 2010

Действительно полезная функция, которую вы, возможно, еще не пробовали (в UITableViewDelegate): tableView:willDisplayCell:forRowAtIndexPath:. Он вызывается непосредственно перед отображением ячейки, и его цель - дать вам возможность сделать что-то с макетом без ОС, изменившей его снова перед отображением. Эффективно у вас есть полный контроль. Я использовал его для изменения шрифтов в ячейках, но вы можете перебирать подпредставления ячейки и изменять их кадры.

Тем не менее я согласен, что вы находитесь в той точке, когда пришло время заглянуть в пользовательские ячейки и прекратить борьбу с ОС. Это не сложно сделать, и Apple приводит хороший пример в Руководство по программированию табличного представления для iOS .

0 голосов
/ 11 января 2019

Вариант решения Swift 4 от TomSwift (который мне очень понравился):

override public func layoutSubviews() {
        super.layoutSubviews()
        imageView?.frame = CGRect( x: 16, y: 9, width: imageView!.intrinsicContentSize.width, height:  imageView!.intrinsicContentSize.height)
    }
0 голосов
/ 17 ноября 2010

Вы можете создать собственную ячейку и разместить объекты там, где они вам нужны, а также установить значения автоматической маски.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...