Как установить свойство UITableViewCellSelectionStyle на определенный пользовательский цвет?
Я разрабатываю приложение для iPhone. В моем представлении таблицы мне нужен пользовательский цвет для Cell Selection Style, я читаю UITableViewCell Class Reference, но для стиля выделения есть только три константы (синий, серый, ни один). Я видел одно приложение, которое использовало другой цвет, чем те, которые указаны в ссылке.
Как мы можем использовать цвет, отличный от тех, которые указаны в ссылке?
Спасибо заранее.
Ответы
Ответ 1
Лучший способ установить выбор - установить 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
в нужный цвет.
Этот фон автоматически применяется при выборе строки.
Ответ 2
Настройка selectedBackgroundView
кажется недействительной, если для параметра cell.selectionStyle
установлено значение UITableViewCellSelectionStyleNone
. Когда я не устанавливаю стиль, просто используется серый по умолчанию.
Используя первое предложение, которое вставляет пользовательский UIView
в ячейку, манипулирует ячейкой, но не появляется, когда камера касается, только после того, как выбранное действие завершено, что слишком поздно, потому что я толкаю к новому виду. Как получить выбранное представление в ячейке для отображения до начала выбранной операции?
Ответ 3
Если вы подклассифицировали UITableViewCell, вы можете настроить различные элементы ячейки, переопределив следующее:
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
if(highlighted) {
self.backgroundColor = [UIColor redColor];
} else {
self.backgroundColor = [UIColor clearColor];
}
[super setHighlighted:highlighted animated:animated];
}
EDIT для iOS7:
как заявила Сашо, вам также нужно
cell.selectionStyle = UITableViewCellSelectionStyleNone
Ответ 4
Я попробовал некоторые из вышеперечисленных, и Я действительно предпочитаю создать свой собственный подкласс UITableViewCell, а затем переопределить методы touchsBegan/touchsCancelled/touchesEnded. Для этого игнорируйте все свойства selectedBackgroundView и highlightColor в ячейке и вместо этого просто устанавливайте эти цвета вручную, когда вызывается один из вышеуказанных методов. Например, если вы хотите, чтобы ячейка имела зеленый фон с красным текстом, попробуйте это (в пределах вашего пользовательского подкласса ячейки):
- (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;
В противном случае вы сначала получите текущий стиль выделения.
EDIT:
Я предлагаю использовать метод touchsCancelled для возврата к исходным цветам ячеек, но просто игнорирую метод touchesEnded.
Ответ 5
Переопределить 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
}
Вы можете выбрать анимировать этот просмотр, когда он будет отменен и будет удовлетворять вашим требованиям.
Ответ 6
Sublcass UITableViewCell и переопределить setHighlighted:animated:
Вы можете определить цвет настраиваемого цвета, установив backgroundColor (см. ответ WIllster):
- (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];
}
Ответ 7
- (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];
}
}
Ответ 8
- (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;
}