Niestandardowy styl wyboru UITableViewCell?

83

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 UILabelznaki 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 UILabels 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 UILabels?

SimplyKiwi
źródło

Odpowiedzi:

174

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ę UITableViewCelli zastąp domyślną implementację setHighlighted:animatedwł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];
    }
}
jonkroll
źródło
11
Na marginesie, upewnij się, że nadpisujesz setHighlighted:animated:, który przyjmuje animatedparametr. Zastępowanie setHighlighted:metody jednoparametrowej nie zadziała.
Imre Kelényi,
14
Powinniśmy zadzwonić [super setHighlighted:highlighted animated:animated];?
SoftDesigner
Wielkie dzięki! Działa jak marzenie! I to daje mi kontrolę nad podświetlaniem innych niestandardowych widoków w komórce, jeśli chcę, ponieważ standardowe podświetlanie robi to dziwne.
imike
2
Ale ta metoda ma jeden problem, gdy zastępujesz setHighlightedi setSelected. 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ę czarny
ronan
1
@jonkroll Zrozumiałem koncepcję, ale moim wymaganiem jest, aby podczas wybierania komórki kolor textLabel tej komórki pozostał jako selectedColor, teraz jest to po prostu zmiana koloru textLabel podczas zaznaczania, po czym zaznaczony tekstLabel pozostaje w oryginalnym kolorze
Samarth Kejriwal
75

Jeś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

Alfa
źródło
2
@iBradApps ... tutaj nie tworzysz żadnej niestandardowej klasy ... komórki widoku tabeli interfejsu użytkownika
Alfa
2
Dając za to opinię - to jedyne rozwiązanie, które zadziałało w przypadku zmiany koloru nietekstowego wybranej komórki w iOS 7.
Vern Jensen
1
stylem
12
To rozwiązanie działało na iOS7, ale dopiero po ustawieniu selectionStyle na UITableViewCellStyleDefault.
Jay Q.
1
Ta metoda jest jedyną metodą, która jest całkowicie identyczna z zachowaniem Apple przy wybieraniu komórek „po wyjęciu z pudełka”. Należy przyjąć odpowiedź.
mkll
16

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;
}
Blizna
źródło
1
Świetne i czyste rozwiązanie! Wystarczy zaimplementować wywołanie willDeselectRowAtIndexPath i działa jak magia!
Matej Balantič
1
Możliwym minusem jest to, że ta metoda nie jest wywoływana, dopóki palec nie opuści wybranej komórki; inne podejścia zaczynają obowiązywać, gdy tylko dotkniesz komórki.
arlomedia
14

Aby wykonać tę pracę, musisz ustawić styl wyboru na, UITableViewCellSelectionStyleNonea 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.

who9vy
źródło
13

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 :)

Mrunal
źródło
Ta odpowiedź musi być najlepsza. :)
Chintan Patel
2
To nie zadziała. Jeśli chcesz, aby [cell.textLabel setHighlightedTextColor: [UIColor blueColor]]; Cell selectionStyle nie powinna mieć wartości NONE.
Femina,
6

Zastępowanie następujących funkcji w podklasie UITableViewCell.

override func setHighlighted(highlighted: Bool, animated: Bool) { }
override func setSelected(selected: Bool, animated: Bool) { }
superarts.org
źródło
Dziękuję Ci; był to jedyny, który nie powoduje zaznaczenia całego wiersza od lewej krawędzi ekranu do prawej podczas zmiany koloru tła.
Jose Ramirez
Miałem tylko nadpisywanie setSelected, dlatego z jakiegoś powodu komórka nadal czasami migała.
Zonily Jame
3

Aby dopasować zachowanie standardowego stylu wyboru, należy zastąpić zarówno setHighlighted:animated:i setSelected: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()
    }
}
Logan Gauthier
źródło
1

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 .

zeeawan
źródło
0

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;
}
Rudolf Real
źródło
0

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;
        }];
    }
  }
Alex Kolovatov
źródło