Как установить свойство imageView в UITableCellView, чтобы показать только цвет фона? - PullRequest
0 голосов
/ 05 марта 2012

У меня есть собственный класс, унаследованный от класса UITableViewCell, который показывает либо изображение (слева от заголовка), либо общий темный квадрат, если изображение недоступно). Следующий код показывает темный квадрат на светлом фоне ячейки:

imageView = [[UIImageView alloc] initWithFrame:CGRectMake(11, 6, 40, 40)];
[imageView setBackgroundColor:kBackgroundGreyColour];
[cell.contentView addSubview:imageView];

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

UIImageView* iv = [[UIImageView alloc] initWithFrame:CGRectMake(11, 6, 40, 40)];
[iv setBackgroundColor:[UIColor redColor]];
self.imageView.hidden = NO;
self.imageView.opaque = iv.opaque;
self.imageView.alpha = iv.alpha;
self.imageView.image = iv.image;
[self bringSubviewToFront:self.imageView];
[self.imageView setBackgroundColor:[UIColor redColor]];

Я добавил все эти строки, чтобы задать для всех существующих свойств UIImageView те же значения, что и для созданного экземпляра UIImageView в первом фрагменте кода, но во втором фрагменте кода не отображается темный квадрат. Он просто ничего не показывает, а ячейка выглядит так, как будто есть только светлый фон и не видно изображение. Но я вижу, что свойство imageView не равно nil, поэтому выполнение всех этих строк кода во втором фрагменте должно что-то показывать?

Однако, как только я назначу новое изображение свойству imageView (например, self.imageView.image = [[UIImage alloc] init ...], квадрат показывает назначенное изображение без проблем.

Редактировать: просто обратите внимание, что во втором случае я устанавливаю фрейм imageView в функции layoutSubview, например ::

-(void)layoutSubviews
{
    [super layoutSubviews];
    self.imageView.frame = CGRectMake(11, 6, 40, 40);
}

Итак, мои вопросы: 1. Какие свойства существующего свойства imageView мне нужно установить и на какие значения, чтобы код отображал квадрат, заполненный определенным цветом (как это делает первый фрагмент кода)?

  1. Существует ли способ создания UIImage программно, чтобы он отображал только цвет фона без какого-либо изображения, связанного с ним (и который я мог бы использовать, чтобы установить свойство imageView.image для отображения этого цвета).

  2. Можно ли заменить существующее свойство imageView в классе UITableViewCell настраиваемым представлением без добавления настраиваемого подпредставления (как это сделал первый фрагмент кода), чтобы я мог показать заполнитель UIView с фоном цвет, когда изображение недоступно?

1 Ответ

2 голосов
/ 05 марта 2012

Причина, по которой ваш код не работает, как вы уже догадались;Потому что, когда вы устанавливаете цвет фона для изображения, он ничего не создает в свойстве изображения.И вы выяснили, что вы также не можете напрямую установить свойство imageview ячейки.

Я бы сказал, что ваш лучший выбор - это первый вариант;Для создания UIImage программно.Хотя я настоятельно рекомендую просто создать его в своем любимом программном обеспечении для редактирования изображений, а затем включить его в комплект.Это облегчает последующую замену, когда вы можете получить более качественное изображение, а рядом с ним нет кода и усилий, необходимых для замены.

Но если вы все еще хотите сделать все это программно, это не так просто, как выНадеюсь.

CGRect rect = CGRectMake(11, 6, 40, 40);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();

CGContextSetFillColorWithColor(context, [kBackgroundGreyColour CGColor]);
CGContextFillRect(context, rect);

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

self.imageview.image = image;

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

Маленький зеленый чертенок все это делает за экраном (извините, слишком много Терри Пратчетта).

...