Я разрабатываю приложение для iPhone, в моем табличном представлении мне нужен пользовательский цвет для стиля выделения ячеек, я прочитал Описание класса UITableViewCell, но для стиля выделения определены только три константы (синий, серый, нет). Я видел одно приложение, в котором использовались цвета, отличные от тех, что указаны в справочнике.
Как мы можем использовать цвет, отличный от указанного в справочнике?
Заранее спасибо.
Ответ в этом посте так запутан. Пожалуйста, игнорируйте самые высокие оценки и идите голосовать за правильные ответы, которые указаны внизу.





Переопределите didSelectRowAtIndexPath: и нарисуйте UIView цвета по вашему выбору и вставьте его за UILabel внутри ячейки. Я бы сделал это примерно так:
UIView* selectedView; //inside your header
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath];
selectedView = [[UIView alloc] initWithFrame:[cell frame]];
selectedView.backgroundColor = [UIColor greenColor]; //whatever
[cell insertSubview:selectedView atIndex:0]; //tweak this as necessary
[selectedView release]; //clean up
}
Вы можете выбрать анимацию этого вида, когда он будет отключен и будет соответствовать вашим требованиям.
Этот подход позволяет избежать использования встроенного в Apple selectedBackgroundView на каждом UITableViewCell. Если вы используете selectedBackgroundView, ваш выбор будет анимироваться, а также будет отменен, когда будет указано.
Было бы лучше переопределить setSelected:highlighted: в ячейке и выполнить там логику, если вы собираетесь использовать этот подход, чтобы он работал во всех контроллерах представления. Как сказал Мэтт, использование selectedBackgroundView - гораздо лучший подход.
Лучший способ установить выбор - установить selectedBackgroundView в ячейке, когда вы ее создаете.
т.е.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
cell.selectedBackgroundView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SelectedCellBackground.png"]] autorelease];
}
// configure the cell
}
Используемое изображение должно иметь красивый градиент (например, выбор по умолчанию). Если вам просто нужен плоский цвет, вы можете использовать UIView вместо UIImageView и установить backgroundColor на нужный вам цвет.
Этот фон затем автоматически применяется при выборе строки.
А как насчет сгруппированных представлений таблиц стилей? Я просто использовал прямоугольное изображение, и оно просвечивало через закругленные кривые ячеек tableview. +1 за отличный ответ.
Для сгруппированных ячеек табличного представления вам нужно 4 фона - верхний, нижний, средний, верхний и нижний, и вам нужно применять их в зависимости от того, где находится ячейка в группе.
Вы не можете сделать это без использования изображений?
@ james.ingham: вы можете использовать любой вид для selectedBackgroundView. Вы можете использовать обычный UIView и установить плоский backgroundColor. Вы можете использовать специально нарисованный подкласс UIView. Вы не можете просто установить другой оттенок; это не может быть сделано.
должен выполнить автоматический выпуск для selectedBackgroundView, чтобы он не протекал.
Это верно только наполовину. Он будет отображаться только тогда, когда ячейка выбрана, а не во время нажатия. См. Ответ Уилстера для решения.
Настройка selectedBackgroundView кажется неэффективной, если для cell.selectionStyle установлено значение UITableViewCellSelectionStyleNone. Когда я не устанавливаю стиль, используется серый цвет по умолчанию.
Использование первого предложения, которое вставляет пользовательский UIView в ячейку, действительно манипулирует ячейкой, но он не отображается при касании ячейки, только после завершения выбранного действия, что слишком поздно, потому что я нажимаю на новое представление. Как сделать так, чтобы выбранное представление в ячейке отображалось до начала выбранной операции?
Это правильно. Мне нужно установить selectionStyle на Blur или Gray. Никто не заставит это работать. В любом случае вы можете сделать это, переопределив метод -setHighlited:animated: класса UITableViewCell.
Я пробовал кое-что из вышеперечисленного и На самом деле я предпочитаю создать свой собственный подкласс UITableViewCell, а затем переопределить методы touchesBegan / touchesCancelled / touchesEnded. Для этого игнорируйте все свойства selectedBackgroundView и highlightedColor в ячейке, а вместо этого просто устанавливайте эти цвета вручную при каждом вызове одного из вышеперечисленных методов. Например, если вы хотите установить для ячейки зеленый фон с красным текстом, попробуйте следующее (в своем подклассе пользовательской ячейки):
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//Set backgorund
self.backgroundColor = [UIColor themeBlue];
//Set text
self.textLabel.textColor = [UIColor themeWhite];
//Call super
[super touchesBegan:touches withEvent:event];
}
Обратите внимание, что для этого вам необходимо установить:
self.selectionStyle = UITableViewCellSelectionStyleNone;
В противном случае вы сначала получите текущий стиль выделения.
Обновлено: Я предлагаю использовать метод touchesCancelled, чтобы вернуться к исходным цветам ячеек, но просто игнорируйте метод touchesEnded.
Если вы создали подкласс UITableViewCell, вы можете настроить различные элементы ячейки, переопределив следующее:
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
if (highlighted) {
self.backgroundColor = [UIColor redColor];
} else {
self.backgroundColor = [UIColor clearColor];
}
[super setHighlighted:highlighted animated:animated];
}
РЕДАКТИРОВАТЬ для iOS7: как сказал Сашо, вам также нужно
cell.selectionStyle = UITableViewCellSelectionStyleNone
В iOS 7 вышеуказанное решение работало в сочетании с «cell. SelectionStyle = UITableViewCellSelectionStyleNone».
Подкласс UITableViewCell и переопределить setHighlighted:animated:
Вы можете определить собственный цвет выбора цвета, установив backgroundColor (см. Ответ Виллстера):
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
if (highlighted) {
self.backgroundColor = [UIColor redColor];
} else {
self.backgroundColor = [UIColor clearColor];
}
[super setHighlighted:highlighted animated:animated];
}
Вы можете определить собственное фоновое изображение, установив свойство backgroundView:
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
if ( highlighted == YES )
self.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"seasonal_list_event_bar_default.png"]];
else
self.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"seasonal_list_event_bar_active.png"]];
[super setHighlighted:highlighted animated:animated];
}
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
// Set Highlighted Color
if (highlighted) {
self.backgroundColor = [UIColor colorWithRed:234.0f/255 green:202.0f/255 blue:255.0f/255 alpha:1.0f];
} else {
self.backgroundColor = [UIColor clearColor];
}
}
UITableViewCell имеет метод для установки цвета выделенного состояния. Здесь спиннет кода // выполняет анимацию между обычным и выделенным состоянием
- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath {
return YES;
}
- (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath {
// Add your Colour.
SocialTableViewCell *cell = (SocialTableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
[self setCellColor:Ripple_Colour ForCell:cell]; //highlight colour
}
- (void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath {
// Reset Colour.
SocialTableViewCell *cell = (SocialTableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
[self setCellColor:Ripple_Colour ForCell:cell]; //normal color
}
- (void)setCellColor:(UIColor *)color ForCell:(UITableViewCell *)cell {
cell.contentView.backgroundColor = color;
cell.backgroundColor = color;
}
Чтобы добавить собственный цвет, используйте приведенный ниже код. А для прозрачности используйте alpha: 0.0
cell.selectedBackgroundView = UIView(frame: CGRect.zero)
cell.selectedBackgroundView?.backgroundColor = UIColor(red:0.27, green:0.71, blue:0.73, alpha:1.0)
Если вы используете собственный цвет и хотите придать ему вид с закругленными углами, используйте:
cell.layer.cornerRadius = 8
Кроме того, используйте это для лучшей анимации и ощущения
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
}
Я настоятельно рекомендую подход Мэтта Галлахера вместо того, который вы приняли! Пожалуйста, подумайте о том, чтобы посмотреть, если вы еще этого не сделали.