Kiedy klikam UITableViewCell
, część tła (obszary, których nie obejmuje mój obraz tła) zmienia kolor na niebieski, gdy klikam komórkę. Ponadto wszystkie UILabel
znaki w komórce zmieniają kolor na biały po kliknięciu, co jest tym, czego chcę.
Jednak to, czego nie chcę, to niebieskie tło po kliknięciu, ale jeśli to zrobię selectionstylenone
, stracę podświetlone kolory na UILabel
s w komórce.
Czy jest więc sposób, aby po prostu pozbyć się niebieskiego tła po kliknięciu komórki, ale zachować podświetlone kolory UILabel
s?
ios
objective-c
uitableview
click
selection
SimplyKiwi
źródło
źródło
Odpowiedzi:
Możesz to zrobić w następujący sposób. Ustaw styl zaznaczenia komórki tabeli na
UITableViewCellSelectionStyleNone
. Spowoduje to usunięcie niebieskiego podświetlenia tła. Następnie, aby podświetlenie etykiety tekstowej działało tak, jak chcesz, zamiast używać domyślnej klasy UITableViewCell, utwórz podklasęUITableViewCell
i zastąp domyślną implementacjęsetHighlighted:animated
własną implementacją, która ustawia kolory etykiet na dowolne, w zależności od podświetlonego stanu .- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { if (highlighted) { self.textLabel.textColor = [UIColor whiteColor]; } else { self.textLabel.textColor = [UIColor blackColor]; } }
źródło
setHighlighted:animated:
, który przyjmujeanimated
parametr. ZastępowaniesetHighlighted:
metody jednoparametrowej nie zadziała.[super setHighlighted:highlighted animated:animated];
?setHighlighted
isetSelected
. Najpierw wybierz komórkę, ok, zmień textColor na biały, następnie przewiń tę komórkę z części wizualnej ekranu, a następnie przewiń do tyłu, zobacz, tekst TextColor staje się czarnyJeśli pracujesz przed iOS7, ustaw styl wyboru komórek na brak
cell.selectionStyle = UITableViewCellSelectionStyleNone;
W przeciwnym razie zostaw to
UITableViewCellSelectionStyleDefault
Następnie:
UIView *selectedView = [[UIView alloc]init]; selectedView.backgroundColor = [UIColor redColor]; cell.selectedBackgroundView = selectedView;
Ten kod będzie działał poprawnie
źródło
Po ustawieniu stylu wyboru na none można użyć następujących metod delegatów:
-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
Zaimplementuj tutaj swój kod, w ten sposób
-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { CustomCell *cell = (CustomCell *)[tableView cellForRowAtIndexPath:indexPath]; [cell.lbls setTextColor:[UIColor whiteColor]]; return indexPath; }
źródło
Aby wykonać tę pracę, musisz ustawić styl wyboru na,
UITableViewCellSelectionStyleNone
a następnie zmienić metodę,setSelected:animated:
aby uzyskać żądany wynik. Robi to samo, co mechanizm automatycznego wyboru systemu iOS, gdy widzisz niebieski (lub szary) wybór.- (void)setSelected:(BOOL)selected animated:(BOOL)animated { if (selected) { self.textLabel.textColor = [UIColor whiteColor]; } else { self.textLabel.textColor = [UIColor blackColor]; } }
Możesz również dostosować to w inny sposób, np. Zmieniając tło UITableViewCell itp.
źródło
W cellForRowAtIndexPath użyj tego kodu:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone]; [cell.myLabel setHighlightedTextColor: [UIColor whiteColor]]; // for all your labels
Mam nadzieję, że to zadziała.
Miłego kodowania :)
źródło
Zastępowanie następujących funkcji w podklasie
UITableViewCell
.źródło
Aby dopasować zachowanie standardowego stylu wyboru, należy zastąpić zarówno
setHighlighted:animated:
isetSelected:animated:
. Prawdopodobnie będziesz chciał przenieść ten kod do metody współdzielonej, aby uniknąć duplikowania kodu.override func setHighlighted(highlighted: Bool, animated: Bool) { setAsSelectedOrHighlighted(highlighted, animated: animated) super.setHighlighted(highlighted, animated: animated) } override func setSelected(selected: Bool, animated: Bool) { setAsSelectedOrHighlighted(selected, animated: animated) super.setSelected(selected, animated: animated) } func setAsSelectedOrHighlighted(selectedOrHighlighted: Bool, animated: Bool) { let action = { // Set animatable properties } if animated { UIView.animateWithDuration(1.0, delay: 0, options: .CurveEaseInOut, animations: action, completion: nil) } else { action() } }
źródło
W swojej komórce niestandardowej zastąp domyślną implementację awakeFromNib & setSelected:
- (void)awakeFromNib { // Initialization code UIImageView * imageView = [[UIImageView alloc] initWithFrame:self.bounds]; imageView.image = [UIImage imageNamed:@"cell_selected_img"]; self.selectedBackgroundView = imageView; } - (void)setSelected:(BOOL)selected animated:(BOOL)animated { [super setSelected:selected animated:animated]; // Configure the view for the selected state if (selected) { self.lblCustomText.textColor = [UIColor whiteColor]; } else { self.lblCustomText.textColor = [UIColor blackColor]; } }
Upewnij się również, że styl zaznaczenia NIE jest ustawiony na Brak .
źródło
Jedyny sposób, w jaki mogłem go uruchomić, to:
- (void)awakeFromNib { UIView *bgColorView = [[UIView alloc] init]; bgColorView.backgroundColor = [UIColor colorWithRed:(55.0/255.0) green:(163.0/255.0) blue:(237.0/255.0) alpha:1.0]; bgColorView.layer.masksToBounds = YES; self.selectedBackgroundView = bgColorView; }
źródło
Możesz również użyć contentView.alpha. Oto przykład.
Najpierw ustaw styl zaznaczenia dla swojej komórki:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Następnie w niestandardowej klasie komórki zastąp tę metodę przykładem animacji:
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { [super setHighlighted:highlighted animated:animated]; if (highlighted) { [UIView animateWithDuration:0.15f animations:^{ self.contentView.alpha = 0.5f; }]; } else { [UIView animateWithDuration:0.35f animations:^{ self.contentView.alpha = 1.f; }]; } }
źródło