Jak zmienić niebieski kolor podświetlenia UITableViewCell?

132

Zastanawiam się, jak zmienić niebieski kolor podświetlenia / wyboru UITableViewCell, jakieś pomysły?

Thomas Joos
źródło

Odpowiedzi:

215

Kolor podświetlenia można zmienić na kilka sposobów.

  1. Zmień właściwość selectionStyle komórki. Jeśli zmienisz go na UITableViewCellSelectionStyleGray, będzie szary.

  2. Zmień selectedBackgroundViewwłaściwość. Właściwie to, co tworzy niebieski gradient, to widok. Możesz utworzyć widok i narysować, co chcesz, i użyć widoku jako tła komórek widoku tabeli.

strefowy
źródło
8
fajne, znalazłem dobre wyjaśnienie i przykład tutaj: cocoawithlove.com/2009/04/easy-custom-uitableview-drawing.html
Thomas Joos
1
Zdałem sobie sprawę, że w IB nie można ustawić „Selection” w UITableViewCell na „None” - ponieważ selectedBackgroundViewwtedy po prostu nigdy się nie pojawi. Dopiero po ustawieniu „Selection” na Default, selectedBackgroundViewpokaże się. Testowane na iOS 6 i 7.
Jonny
12
Dzięki za wspaniałą notatkę! To sprawia, że ​​jest to teraz takie proste: tworzysz nowy widok (nie musisz nawet określać ramki: cell.selectedBackgroundView = [UIView new];i ustawiasz dowolny kolor, który chcesz:cell.selectedBackgroundView.backgroundColor = [UIColor colorWithHex:@"ecf2f5" andAlpha:1];
Dannie P
spójrz na dół tej strony, są nowsze podejścia
Climbatize
145

Zonble już udzielił doskonałej odpowiedzi. Pomyślałem, że przydatne może być dołączenie krótkiego fragmentu kodu w celu dodania UIViewdo komórki widoku tabeli, która będzie przedstawiać jako wybrany widok tła.

cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];

    UIView *selectionColor = [[UIView alloc] init];
    selectionColor.backgroundColor = [UIColor colorWithRed:(245/255.0) green:(245/255.0) blue:(245/255.0) alpha:1];
    cell.selectedBackgroundView = selectionColor;
  • komórka jest moja UITableViewCell
  • Utworzyłem UIView i ustawiłem jego kolor tła za pomocą kolorów RGB (jasnoszary)
  • I wtedy ustawić komórkę selectedBackgroundViewza UIViewktóry stworzyłem z moim wybranym kolorze tła

To działało dobrze dla mnie. Dzięki za wskazówkę Zonble.

T Davey
źródło
2
Nie działa to zbyt dobrze w przypadku korzystania z widoków tabeli z przekrojami. Po zaznaczeniu komórka utraci obramowanie i nie zostanie zaokrąglona w przypadku pierwszej lub ostatniej komórki.
Kirk Woll
7
@kirk, masz na myśli zgrupowane :)
Tieme
@Tieme, nie, mam na myśli sekcje : „Widok tabeli składa się z zera lub więcej sekcji, z których każda ma własne wiersze”.
Kirk Woll,
Musisz go umieścić w „cellForRowAtIndexPath”. U mnie działa dobrze, z jedną sekcją. Nie próbowałem tego z wieloma sekcjami.
Vincent
Trochę za późno na mecz, ale mogę potwierdzić, że działa w widoku tabeli z wieloma sekcjami (nie pogrupowanymi)
matto0
30

UITableViewCell ma trzy domyślne style wyboru: -

  1. niebieski
  2. Szary
  3. Żaden

Wdrożenie jest następujące: -

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *) indexPath {

     [cell setSelectionStyle:UITableViewCellSelectionStyleNone];       
}
Arshad Parwez
źródło
7
zamiast tych trzech domyślnych stylów możemy również dostosować do oczekiwanego stylu za pomocą właściwości selectedBackgroundView.
Sunil Targe
Pracował dla mnie ... Wielkie dzięki.
Mujeeb Farooqi
20

W Swift użyj tego w cellForRowAtIndexPath

let selectedView = UIView()
selectedView.backgroundColor = .white
cell.selectedBackgroundView = selectedView

Jeśli chcesz, aby wybrany kolor był taki sam we wszystkich UITableViewCell, użyj tego w AppDelegate.

let selectedView = UIView()
selectedView.backgroundColor = .white
UITableViewCell.appearance().selectedBackgroundView = selectedView
alitosuner
źródło
18

Jeśli chcesz zmienić to w całej aplikacji, możesz dodać logikę do delegata aplikacji

class AppDelegate: UIResponder, UIApplicationDelegate {

    //... truncated

   func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {

        // set up your background color view
        let colorView = UIView()
        colorView.backgroundColor = UIColor.yellowColor()

        // use UITableViewCell.appearance() to configure 
        // the default appearance of all UITableViewCells in your app
        UITableViewCell.appearance().selectedBackgroundView = colorView

        return true
    }

    //... truncated
}
NatashaTheRobot
źródło
Idealny. Masz jakiś pomysł, jak ustawić kolor tekstu tej domyślnej komórki na całym świecie przy zaznaczaniu?
BananaAcid
1
to działa, ale zaznaczenie jest usuwane bezpośrednio po naciśnięciu nowego kontrolera widoku.
bobmoff
Niezły sposób na wprowadzanie globalnych zmian w UITableViewCell
Shashi3456643
12

dla kompletności: jeśli utworzyłeś własną podklasę UITableViewCell, możesz zaimplementować - (void)setSelected:(BOOL)selected animated:(BOOL)animatedmetodę i ustawić kolor tła niektórych widoków, które dodałeś w widoku zawartości. (jeśli tak jest) lub samego contentView (jeśli nie jest objęty jednym z Twoich własnych widoków.

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    if(selected) {
        self.contentView.backgroundColor = UIColor.blueColor;
    } else {
        self.contentView.backgroundColor = UIColor.whiteColor;
    }
}

(nie użyłeś? aby dopasować małą szerokość kodu źródłowego DIV :)

To podejście ma dwie zalety w porównaniu z użyciem selectedBackgroundView, zużywa mniej pamięci i nieco mniej procesora, co nawet nie zauważysz, chyba że u wyświetlisz setki komórek.

Martijn Scheffer
źródło
Działa to tylko po przypisaniu nowego widoku do metody selectedBackgroundView Na samym początku metody addself. selectedBackgroundView = [UIView new];
enadun
@enadun Ta metoda działa dla mnie w systemie iOS 12, bez żadnego ustawienia selectedBackgroundViewwłaściwości.
Nate
11

Muszę ustawić styl wyboru na, UITableViewCellSelectionStyleDefaultaby niestandardowy kolor tła działał. Jeśli jakikolwiek inny styl, niestandardowy kolor tła zostanie zignorowany. Przetestowano na iOS 8.

Pełny kod komórki w następujący sposób:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"MyCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    // This is how you change the background color
    cell.selectionStyle = UITableViewCellSelectionStyleDefault;
    UIView *bgColorView = [[UIView alloc] init];
    bgColorView.backgroundColor = [UIColor redColor];
    [cell setSelectedBackgroundView:bgColorView];

    return cell;
}
samwize
źródło
6

Na podstawie odpowiedzi @ użytkownika możesz po prostu dodać to rozszerzenie w dowolnym miejscu kodu aplikacji i ustawić kolor wyboru bezpośrednio w edytorze scenorysów dla każdej komórki aplikacji:

@IBDesignable extension UITableViewCell {
    @IBInspectable var selectedColor: UIColor? {
        set {
            if let color = newValue {
                selectedBackgroundView = UIView()
                selectedBackgroundView!.backgroundColor = color
            } else {
                selectedBackgroundView = nil
            }
        }
        get {
            return selectedBackgroundView?.backgroundColor
        }
    }
}

Kolor wyboru UITableViewCell w serii ujęć

Wspinaj się
źródło
5
@IBDesignable class UIDesignableTableViewCell: UITableViewCell {
  @IBInspectable var selectedColor: UIColor = UIColor.clearColor() {
    didSet {
      selectedBackgroundView = UIView()
      selectedBackgroundView?.backgroundColor = selectedColor
    }
  }
}

W swoim storyboardzie ustaw klasę swojego UITableViewCell na UIDesignableTableViewCell, w Inspektorze atrybutów możesz zmienić wybrany kolor komórki na dowolny kolor.

Możesz tego użyć do wszystkich swoich komórek. Tak będzie wyglądał Twój Inspektor atrybutów.

Tak będzie wyglądał Twój Inspektor atrybutów

użytkownik
źródło
Bardzo kreatywne! świetny!
Kaushil Ruparelia
możesz uczynić to jeszcze prostszym, spójrz na moją odpowiedź;) stackoverflow.com/a/51764804/537694
Climbatize
Używam niestandardowej komórki do ustawiania etykiet, więc to działa dobrze, dzięki! Zmiana na Swift 5: teraz UIColor.clear, nie UIColor.clearColor(). Nie jestem pewien, czy to też zmiana w Swift, ale działa również bez @IBDesignable.
Neph
5

Swift 3.0 / 4.0

Jeśli utworzyłeś własną niestandardową komórkę, możesz zmienić kolor zaznaczenia awakeFromNib()dla wszystkich komórek:

 override func awakeFromNib() {
    super.awakeFromNib()

    let colorView = UIView()
    colorView.backgroundColor = UIColor.orange.withAlphaComponent(0.4)

    self.selectedBackgroundView = colorView


}
Sam Bing
źródło
0

1- Dodaj widok do widoku zawartości swojej komórki.
2- Kliknij prawym przyciskiem komórkę.
3- Ustaw dodany widok jako „selectedBackgroundView” wprowadź opis obrazu tutaj

Badr
źródło
Możesz dodać nowy UIViewdo UI(Table)ViewControllerbez dodawania go do hierarchii widoków, przeciągając go na pasek nad kontrolerem w programie Interface Designer. Następnie możesz wykonać powyższą sztuczkę, aby ustawić ją jako selectedBackgroundViewkomórki.
gklka