Я реализую табличное представление с выбором цвета, где пользователь может выбрать, скажем, 10 цветов (зависит от продукта). Пользователь также может выбрать другие параметры (например, емкость жесткого диска, ...).
Все варианты цвета находятся в их собственном разделе таблицы.
Я хочу отобразить небольшой квадрат слева от textLabel, показывающий фактический цвет.
Прямо сейчас я добавляю простой квадратный UIView, присваиваю ему правильный цвет фона, например так:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:RMProductAttributesCellID];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:RMProductAttributesCellID] autorelease];
cell.indentationWidth = 44 - 8;
UIView *colorThumb = [[[UIView alloc] initWithFrame:CGRectMake(8, 8, 28, 28)] autorelease];
colorThumb.tag = RMProductAttributesCellColorThumbTag;
colorThumb.hidden = YES;
[cell.contentView addSubview:colorThumb];
}
RMProductAttribute *attr = (RMProductAttribute *)[_product.attributes objectAtIndex:indexPath.section];
RMProductAttributeValue *value = (RMProductAttributeValue *)[attr.values objectAtIndex:indexPath.row];
cell.textLabel.text = value.name;
cell.textLabel.backgroundColor = [UIColor clearColor];
UIView *colorThumb = [cell viewWithTag:RMProductAttributesCellColorThumbTag];
colorThumb.hidden = !attr.isColor;
cell.indentationLevel = (attr.isColor ? 1 : 0);
if (attr.isColor) {
colorThumb.layer.cornerRadius = 6.0;
colorThumb.backgroundColor = value.color;
}
[self updateCell:cell atIndexPath:indexPath];
return cell;
}
Это нормально отображается без проблем.
Моя единственная проблема заключается в том, что когда я выбираю «цветную» строку, во время анимации выделения с переходом в синий цвет, мой пользовательский UIView (colorThumb) скрывается. Он снова становится видимым сразу после окончания анимации выбора / отмены выбора, но это приводит к появлению уродливого артефакта.
Что я должен сделать, чтобы исправить это? Разве я не вставляю подпредставление в нужном месте?
(В didSelectRowAtIndexPath нет ничего особенного, я просто изменяю принадлежность ячейки на флажок или ничего, и отменяю выбор текущего indexPath).
источник
Ответы:
UITableViewCell
изменяет цвет фона всех вложенных представлений, когда ячейка выделена или выделена. Вы можете решить эту проблему, переопределив ячейки TableviewsetSelected:animated
иsetHighlighted:animated
сбросив цвет фона представления.В Задаче C:
В Swift 3.1:
источник
if (highlighted)
иif (selected)
условии? Я думаю, что это будет работать, если у нас нет таких условий.Это связано с тем, что ячейка табличного представления автоматически меняет цвет фона всех представлений внутри представления содержимого для выделенного состояния. Вы можете рассмотреть возможность создания подкласса
UIView
для рисования вашего цвета или использованияUIImageView
растянутого изображения размером 1x1 px.источник
setHighlighted:animated:
иsetSelected:animated:
Нашел довольно элегантное решение вместо того, чтобы возиться с методами выделения / подсветки tableViewCell. Вы можете создать подкласс UIView, который игнорирует установку его цвета фона, чтобы очистить цвет.
Свифт 3/4:
Свифт 2:
Версия Obj-C:
источник
Другой способ справиться с этой проблемой - заполнить вид графическим ядром, например:
источник
Для Swift 2.2 это работает
и причина объясняется @ Andriy
источник
Вдохновленный Yatheesha BL «s ответ я создал UITableViewCell категории / расширение , которое позволяет включать и выключать эту функцию прозрачности„“.
стриж
Objective-C
KeepBackgroundCell совместим с CocoaPods. Вы можете найти его на GitHub
источник
Вы можете
cell.selectionStyle = UITableViewCellSelectionStyleNone;
затем установить backgroundColor на- (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath
источник
Вдохновленный Yatheesha BL .
Если вы вызовете super.setSelected (selected, animated: animated), он очистит весь заданный вами цвет фона . Итак, мы не будем называть супер метод.
В Свифте:
источник
В этом случае это Septs, чтобы избежать получения серого цвета для всех элементов в ячейке (если вы используете настраиваемую ячейку табличного представления):
Установите для selectionStyle значение .none 👉
selectionStyle = .none
Переопределите этот метод.
Вызовите супер, чтобы воспользоваться преимуществами супер-настройки.
Делайте то, что когда-либо выделяя логику, которую вы хотите.
источник
UITableViewCell по какой-то причине изменяет backgroundColor всех подпредставлений при выделении.
Это может помочь:
DVColorLockView
Используйте что-то подобное, чтобы UITableView не менял цвет вашего вида во время выделения.
источник
Нарисуйте вид вместо установки цвета фона
источник
SIMPLEST решение без ошибок с анимацией (как в ответе с самым высоким рейтингом) и без подклассов и рисования - установите цвет границы слоя вместо backgroundColor и установите очень большую ширину границы.
источник
Попробуйте следующий код:
источник
Не забудьте переопределить,
setSelected
а такжеsetHighlighted
источник
Это похоже на ответ Павла Гурова, но более гибко в том смысле, что позволяет любому цвету быть постоянным.
источник
Я хотел сохранить поведение выбора по умолчанию, за исключением одного подпредставления ячейки, которое я хотел игнорировать автоматическое изменение цвета фона. Но мне также нужно было иметь возможность менять цвет фона в другое время.
Решение, которое я придумал, состояло в том,
UIView
чтобы создать подкласс, чтобы он игнорировал обычную настройку цвета фона и добавил отдельную функцию для обхода защиты.Swift 4
источник
вот мое решение, используйте contentView, чтобы показать selectionColor, это отлично работает
источник
Поместите этот код в свой подкласс
UITableViewCell
Swift 3 синтаксис
источник
Добавление другого решения, если вы используете раскадровки. Создайте подкласс
UIView
, который не позволяетbackgroundColor
быть установленным после того, как это первоначально установлено.источник
Если вышеупомянутое фоновое решение не решает вашу проблему, ваша проблема может лежать в вашей
datasource
вашей таблице.Для меня я создавал экземпляр объекта DataSource (вызываемый
BoxDataSource
) для обработки методов tableView делегата и dataSource следующим образом:Это вызывало освобождение источника данных при каждом касании ячейки, и, таким образом, все содержимое исчезало. Причина в том, что ARC освобождает / собирает мусор.
Чтобы это исправить, мне нужно было перейти в пользовательскую ячейку и добавить переменную источника данных:
Затем вам нужно установить dataSource на источник данных ячейки, который
var
вы только что создали в cellForRow, так что это не освобождается от ARC.Надеюсь, это поможет.
источник