UITableView Komórka wybrała kolor?

319

Stworzyłem zwyczaj UITableViewCell. Widok tabeli pokazuje dane w porządku. Utknąłem w momencie, gdy użytkownik dotyka komórki widoku tabeli, a następnie chcę pokazać kolor tła komórki inny niż domyślne wartości [koloru niebieskiego] dla podświetlenia wyboru komórki. Używam tego kodu, ale nic się nie dzieje:

cell.selectedBackgroundView.backgroundColor=[UIColor blackColor];
Momi
źródło

Odpowiedzi:

365

Myślę, że byłeś na dobrej drodze, ale zgodnie z definicją klasy dla selectedBackgroundView:

Wartość domyślna to zero dla komórek w tabelach o prostym stylu (UITableViewStylePlain) i brak zero w przypadku tabel grup przekrojów UITableViewStyleGrouped).

Dlatego jeśli używasz tabeli w prostym stylu, musisz UIViewprzypisać -init nowy mający pożądany kolor tła, a następnie przypisać go do selectedBackgroundView.

Alternatywnie możesz użyć:

cell.selectionStyle = UITableViewCellSelectionStyleGray;

jeśli wszystko, czego chciałeś, to szare tło, gdy komórka jest zaznaczona. Mam nadzieję że to pomoże.

Andrew Little
źródło
1
Tę właściwość można również ustawić w serii ujęć, jeśli wolisz pozostawić rzeczy związane z widokiem do widoku.
IIllllll
1
Wersja Swift 3: cell.selectionStyle = .gray // Możesz także użyć .none, .blue lub .default
Sébastien REMY
6
Ta odpowiedź jest dość stara ... Czy coś się zmieniło w nowszych wersjach iOS? Mam tabelę w prostym stylu, a mój selectedBackgroundView NIE ma wartości zero. Co ciekawe zmiana tła backgroundColor w tym widoku nie ma żadnego efektu, zamiast tego muszę go zastąpić nowym UIView moim pożądanym tłem backgroundColor, aby działał.
ndreisg
Właśnie uratowałeś mnie przed całkowitym szaleństwem. Wielkie dzięki!
mrwheet
656

Nie ma potrzeby tworzenia niestandardowych komórek. Jeśli chcesz tylko zmienić wybrany kolor komórki, możesz to zrobić:

Cel C:

UIView *bgColorView = [[UIView alloc] init];
bgColorView.backgroundColor = [UIColor redColor];
[cell setSelectedBackgroundView:bgColorView];

Szybki:

let bgColorView = UIView()
bgColorView.backgroundColor = UIColor.red
cell.selectedBackgroundView = bgColorView
Maciej Swic
źródło
47
To działa, ale w zgrupowanym UITableView utracone są zaokrąglone rogi.
David
1
@David Czy cornerRadius = 7 działa gdziekolwiek w widoku zgrupowanej tabeli? Co jeśli komórka jest w środku? Nie mam czasu na testowanie tego.
Maciej Swic
2
bo szybki jest mały błąd. Prawidłowa linia to cell.selectedBackgroundView = bgColorView
John Kakon
13
Należy pamiętać, że aby to zadziałało, w Storyboard (lub pliku XIB) musisz wybrać wybrany kolor tła inny niż None. Jest to sprzeczne z niektórymi odpowiedziami, które mówią, że najpierw musisz ustawić opcję Brak, aby działała. W przypadku None nie będzie działać. Doprowadzało mnie do szaleństwa, dopóki się nie domyśliłem. Dzięki.
kakubei
1
Jak sprawiłbyś, żeby to działało, gdy używasz również scenorysu?
Jan
42

Widok tabeli Kolor tła wyboru komórki można ustawić za pomocą Scenorysu w Konstruktorze interfejsów:

Kolor zaznaczenia komórki widoku tabeli Brak

pkamb
źródło
1
Myślę, że nie możemy ustawić niestandardowego koloru z scenorysu. Musisz ustawić to programowo.
pallavi
37

Jeśli masz zgrupowaną tabelę z tylko jedną komórką na sekcję, po prostu dodaj ten dodatkowy wiersz do kodu: bgColorView.layer.cornerRadius = 10;

UIView *bgColorView = [[UIView alloc] init];
[bgColorView setBackgroundColor:[UIColor redColor]];
bgColorView.layer.cornerRadius = 10;
[cell setSelectedBackgroundView:bgColorView];
[bgColorView release]; 

Nie zapomnij zaimportować QuartzCore.

Christian Fritz
źródło
28

Swift 3: dla mnie zadziałało, gdy umieściłeś to w cellForRowAtIndexPath:metodzie

let view = UIView()
view.backgroundColor = UIColor.red
cell.selectedBackgroundView = view
phitsch
źródło
6
Myślę, że lepszym miejscem na umieszczenie tego jest awakeFromNib()metoda (w przypadku niestandardowej komórki).
LembergSun
22

Poniższe działa dla mnie w iOS 8.

Muszę ustawić styl wyboru na UITableViewCellSelectionStyleDefault na, aby działał niestandardowy kolor tła. Jeśli jakikolwiek inny styl, niestandardowy kolor tła zostanie zignorowany. Wygląda na to, że nastąpiła zmiana w zachowaniu, ponieważ poprzednie odpowiedzi muszą zamiast tego ustawić styl na none.

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
Ten kod przecieka pamięć. Wszelkie „przydzielanie” lub tworzenie obiektów musi odbywać się w bloku if (komórka == zero) {}. Lub widok zostanie utworzony za każdym razem, gdy komórka zostanie zwolniona przez iOS.
GeneCode
18

Utwórz niestandardową komórkę dla komórki tabeli i w niestandardowej klasie komórek. M umieść poniższy kod, będzie działał dobrze. Musisz umieścić żądany kolorowy obraz w selectionBackgroundUIImage.

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    UIImage *selectionBackground = [UIImage imageNamed:@"yellow_bar.png"];
    UIImageView *iview=[[UIImageView alloc] initWithImage:selectionBackground];
    self.selectedBackgroundView=iview;
}
rajesh
źródło
2
Myślę, że może to być bardziej wydajne pod względem pamięci niż ustawienie selectedBackgroundView podczas inicjowania komórki poprzez tworzenie widoku bg tylko po wybraniu jednej komórki.
dotslashlu
11

Rozszerzenie Swift 3.0

extension UITableViewCell {
    var selectionColor: UIColor {
        set {
            let view = UIView()
            view.backgroundColor = newValue
            self.selectedBackgroundView = view
        }
        get {
            return self.selectedBackgroundView?.backgroundColor ?? UIColor.clear
        }
    }
}

cell.selectionColor = UIColor.FormaCar.blue

Nik Kov
źródło
1
dodaj IBDesignable i IBInspectable
Michał Ziobro
1
@ MichałZiobro po prostu dodaj @IBInspectablevar, jeśli chcesz. @IBDesignablenie jest do tego przydatny.
Nik Kov
9
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIView *view = [[UIView alloc] init];
    [view setBackgroundColor:[UIColor redColor]];
    [cell setSelectedBackgroundView:view];
}

W tej metodzie musimy ustawić wybrany widok tła.

Hemanshu Liya
źródło
8

Jeśli chcesz dodać niestandardowy podświetlony kolor do komórki (a komórka zawiera przyciski, etykiety, obrazy itp.), Wykonałem następujące kroki:

Na przykład, jeśli chcesz wybrać żółty kolor:

1) Utwórz widok, który pasuje do całej komórki o kryciu 20% (z żółtym kolorem), na przykład wybrany w tle

2) Napisz w kontrolerze komórki:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
     self.backgroundselectedView.alpha=1;
    [super touchesBegan:touches withEvent:event];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    self.backgroundselectedView.alpha=0;
    [super touchesEnded:touches withEvent:event];
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    self.backgroundSelectedImage.alpha=0;
    [super touchesCancelled:touches withEvent:event];
}
Javier Flores Font
źródło
8

W Swift 4 możesz także globalnie ustawić kolor tła komórki tabeli (zaczerpnięty stąd ):

let backgroundColorView = UIView()
backgroundColorView.backgroundColor = UIColor.red
UITableViewCell.appearance().selectedBackgroundView = backgroundColorView
Sundance
źródło
6

Jeśli używasz niestandardowego TableViewCell, możesz również zastąpić awakeFromNib:

override func awakeFromNib() {
    super.awakeFromNib()

    // Set background color
    let view = UIView()
    view.backgroundColor = UIColor.redColor()
    selectedBackgroundView = view
}
Franck
źródło
1
Fajne rozwiązanie! Dzięki
Thomás Calmon,
Mam prosty widok tabeli z nie więcej niż 10 komórkami, na razie działa to świetnie.
code4latte
5

Jeszcze jedna wskazówka na temat sposobu, w jaki Christian pokazuje tło z zaokrąglonym rogiem dla zgrupowanego stołu.

Jeśli użyję cornerRadius = 10komórki, pokazuje zaokrąglone tło zaznaczenia czterech rogów. Nie jest tak samo z domyślnym interfejsem użytkownika widoku tabeli.

Myślę więc o łatwym sposobie rozwiązania tego problemu za pomocą cornerRadius . Jak widać z poniższych kodów, sprawdź lokalizację komórki (górny, dolny, środkowy lub górny spód) i dodaj jeszcze jedną warstwę podrzędną, aby ukryć górny róg lub dolny róg. To pokazuje dokładnie taki sam wygląd z domyślnym tłem wyboru widoku tabeli.

Testowałem ten kod na iPadzie splitterview. Możesz zmienić pozycję ramki patchLayer według potrzeb.

Daj mi znać, jeśli istnieje łatwiejszy sposób na osiągnięcie tego samego rezultatu.

if (tableView.style == UITableViewStyleGrouped) 
{
    if (indexPath.row == 0) 
    {
        cellPosition = CellGroupPositionAtTop;
    }    
    else 
    {
        cellPosition = CellGroupPositionAtMiddle;
    }

    NSInteger numberOfRows = [tableView numberOfRowsInSection:indexPath.section];
    if (indexPath.row == numberOfRows - 1) 
    {
        if (cellPosition == CellGroupPositionAtTop) 
        {
            cellPosition = CellGroupPositionAtTopAndBottom;
        } 
        else 
        {
            cellPosition = CellGroupPositionAtBottom;
        }
    }

    if (cellPosition != CellGroupPositionAtMiddle) 
    {
        bgColorView.layer.cornerRadius = 10;
        CALayer *patchLayer;
        if (cellPosition == CellGroupPositionAtTop) 
        {
            patchLayer = [CALayer layer];
            patchLayer.frame = CGRectMake(0, 10, 302, 35);
            patchLayer.backgroundColor = YOUR_BACKGROUND_COLOR;
            [bgColorView.layer addSublayer:patchLayer];
        } 
        else if (cellPosition == CellGroupPositionAtBottom) 
        {
            patchLayer = [CALayer layer];
            patchLayer.frame = CGRectMake(0, 0, 302, 35);
            patchLayer.backgroundColor = YOUR_BACKGROUND_COLOR;
            [bgColorView.layer addSublayer:patchLayer];
        }
    }
}
Wonil
źródło
4

Chcę zauważyć, że edytor XIB oferuje następujące standardowe opcje:

Sekcja: niebieski / szary / brak

(prawa kolumna z opcjami, 4. zakładka, pierwsza grupa „Komórka widoku tabeli”, 4. podgrupa, 1. z 3 pozycji brzmi „Wybór”)

Prawdopodobnie to, co chcesz zrobić, można osiągnąć, wybierając odpowiednią opcję standardową.

18446744073709551615
źródło
masz rację. Z tego powodu możesz po prostu zmienić kolor zaznaczenia w „cellForRowAtIndexPath”, dodając: UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: @ „Cell”]; cell.selectedBackgroundView = [[Przydzielanie UIView] initWithFrame: CGRectZero]; cell.selectedBackgroundView.backgroundColor = [UIColor colorWithRed: (255/255) zielony: (0/255) niebieski: (0/255) alfa: 0,1];
user8675
DZIĘKI! droga
Fattie
3

Jak na niestandardowym kolorze dla wybranej komórki UITableView, świetne rozwiązanie, jak na Macieja Swic za odpowiedź

Aby dodać do tego, deklarujesz odpowiedź Swica w konfiguracji Komórki zwykle pod:

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

Aby uzyskać dodatkowy efekt, zamiast kolorów systemowych, można użyć wartości RGB w celu uzyskania niestandardowego wyglądu kolorów. W moim kodzie tak to osiągnąłem:

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

} 

 static NSString *CellIdentifier = @"YourCustomCellName";
 MakanTableCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

// Configure the cell...

if (cell == nil) {

cell = [[[NSBundle mainBundle]loadNibNamed:@"YourCustomCellClassName" owner:self options:nil]objectAtIndex:0];
                    } 

UIView *bgColorView = [[UIView alloc] init];
bgColorView.backgroundColor = [UIColor colorWithRed:255.0/256.0 green:239.0/256.0 blue:49.0/256.0 alpha:1];
bgColorView.layer.cornerRadius = 7;
bgColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView:bgColorView];


return cell;

}

Daj mi znać, jeśli to również zadziała. Możesz zadzierać z cornerRadiusliczbą efektów w rogach wybranej komórki.

DrBongo
źródło
3

Mam nieco inne podejście niż wszystkie inne, które odzwierciedla wybór na dotyk, a nie po wybraniu. Mam podklasę UITableViewCell. Wszystko, co musisz zrobić, to ustawić kolor tła w zdarzeniach dotykowych, co symuluje wybór za pomocą dotyku, a następnie ustawić kolor tła w funkcji setSelected. Ustawienie koloru tła w funkcji selSelected pozwala odznaczyć komórkę. Pamiętaj, aby przekazać zdarzenie dotykowe super, w przeciwnym razie komórka nie zachowa się tak, jakby była wybrana.

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    self.backgroundColor = UIColor(white: 0.0, alpha: 0.1)
    super.touchesBegan(touches, withEvent: event)
}

override func touchesCancelled(touches: NSSet!, withEvent event: UIEvent!) {
    self.backgroundColor = UIColor.clearColor()
    super.touchesCancelled(touches, withEvent: event)
}

override func setSelected(selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
    self.backgroundColor = selected ? UIColor(white: 0.0, alpha: 0.1) : UIColor.clearColor()
}
Stephen Donnell
źródło
3

Aby dodać tło dla wszystkich komórek (używając odpowiedzi Macieja):

for (int section = 0; section < [self.tableView numberOfSections]; section++) {
        for (int row = 0; row < [self.tableView numberOfRowsInSection:section]; row++) {
            NSIndexPath* cellPath = [NSIndexPath indexPathForRow:row inSection:section];
            UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:cellPath];

            //stuff to do with each cell
            UIView *bgColorView = [[UIView alloc] init];
            bgColorView.backgroundColor = [UIColor redColor];
            [cell setSelectedBackgroundView:bgColorView];
        }
    } 
Jan
źródło
2

Aby zastąpić UITableViewCell„s setSelectedrównież działa.

override func setSelected(selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Set background color
    let view = UIView()
    view.backgroundColor = UIColor.redColor()
    selectedBackgroundView = view
}
Quanlong
źródło
2

dla tych, którzy chcą się pozbyć domyślnie wybranego szarego tła, wstaw ten wiersz kodu do swojej funkcji cellForRowAtIndexPath:

yourCell.selectionStyle = .None
Paul Lehn
źródło
1
dziękuję bardzo, to jest właściwa odpowiedź dla mnie, a nie dla innych.
DeyaEldeen,
Jak ustawić kolor „zielony” zamiast ustawiać brak, niebieski lub szary.
Satyam
2

dla Swift 3.0:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let cell = super.tableView(tableView, cellForRowAt: indexPath)

    cell.contentView.backgroundColor = UIColor.red
}
Wilson
źródło
Fajnie, ale zadziała tylko wtedy, gdy użytkownik wybierze coś (domyślny kolor wyboru pozostanie na początku)
Konstantin Salavatov
2

Używam podejścia poniżej i działa dobrze dla mnie,

class MyTableViewCell : UITableViewCell {

                var defaultStateColor:UIColor?
                var hitStateColor:UIColor?

                 override func awakeFromNib(){
                     super.awakeFromNib()
                     self.selectionStyle = .None
                 }

// if you are overriding init you should set selectionStyle = .None

                override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
                    if let hitColor = hitStateColor {
                        self.contentView.backgroundColor = hitColor
                    }
                }

                override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
                    if let defaultColor = defaultStateColor {
                        self.contentView.backgroundColor = defaultColor
                    }
                }

                override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) {
                    if let defaultColor = defaultStateColor {
                        self.contentView.backgroundColor = defaultColor
                    }
                }
            }
Suryavel TR
źródło
2

Swift 4+:

Dodaj następujące wiersze w komórce tabeli

let bgColorView = UIView()
bgColorView.backgroundColor =  .red
self.selectedBackgroundView = bgColorView

Wreszcie powinno być jak poniżej

override func setSelected(_ selected: Bool, animated: Bool)
    {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
        let bgColorView = UIView()
        bgColorView.backgroundColor =  .red
        self.selectedBackgroundView = bgColorView

    }
Rajesh Loganathan
źródło
1

Oto ważne części kodu potrzebne do zgrupowanej tabeli. Po wybraniu dowolnej komórki w sekcji pierwszy wiersz zmienia kolor. Bez początkowego ustawienia stylu cellselection na none, następuje denerwujące podwójne przeładowanie, gdy użytkownik kliknie wiersz 0, w którym komórka zmienia się na bgColorView, a następnie zanika i ponownie ładuje bgColorView. Powodzenia i daj mi znać, jeśli istnieje prostszy sposób na zrobienie tego.

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

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    if ([indexPath row] == 0) 
    {
        cell.selectionStyle = UITableViewCellSelectionStyleNone;

        UIView *bgColorView = [[UIView alloc] init];
        bgColorView.layer.cornerRadius = 7;
        bgColorView.layer.masksToBounds = YES;
        [bgColorView setBackgroundColor:[UIColor colorWithRed:.85 green:0 blue:0 alpha:1]];
        [cell setSelectedBackgroundView:bgColorView];

        UIColor *backColor = [UIColor colorWithRed:0 green:0 blue:1 alpha:1];
        cell.backgroundColor = backColor;
        UIColor *foreColor = [UIColor colorWithWhite:1 alpha:1];
        cell.textLabel.textColor = foreColor;

        cell.textLabel.text = @"row0";
    }
    else if ([indexPath row] == 1) 
    {
        cell.selectionStyle = UITableViewCellSelectionStyleNone;

        UIColor *backColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:1];
        cell.backgroundColor = backColor;
        UIColor *foreColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1];
        cell.textLabel.textColor = foreColor;

        cell.textLabel.text = @"row1";
    }
    else if ([indexPath row] == 2) 
    {
        cell.selectionStyle = UITableViewCellSelectionStyleNone;

        UIColor *backColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:1];
        cell.backgroundColor = backColor;
        UIColor *foreColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1];
        cell.textLabel.textColor = foreColor;

        cell.textLabel.text = @"row2";
    }
    return cell;
}

#pragma mark Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSIndexPath *path = [NSIndexPath indexPathForRow:0 inSection:[indexPath section]];
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:path];
    [cell setSelectionStyle:UITableViewCellSelectionStyleBlue];

    [tableView selectRowAtIndexPath:path animated:YES scrollPosition:UITableViewScrollPositionNone];

}

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tvStat cellForRowAtIndexPath:indexPath];
    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
}

#pragma mark Table view Gestures

-(IBAction)singleTapFrom:(UIGestureRecognizer *)tapRecog
{

    CGPoint tapLoc = [tapRecog locationInView:tvStat];
    NSIndexPath *tapPath = [tvStat indexPathForRowAtPoint:tapLoc];

    NSIndexPath *seleRow = [tvStat indexPathForSelectedRow];
    if([seleRow section] != [tapPath section])
        [self tableView:tvStat didDeselectRowAtIndexPath:seleRow];
    else if (seleRow == nil )
        {}
    else if([seleRow section] == [tapPath section] || [seleRow length] != 0)
        return;

    if(!tapPath)
        [self.view endEditing:YES];

    [self tableView:tvStat didSelectRowAtIndexPath:tapPath];
}
firescar96
źródło
1

W przypadku niestandardowej klasy komórki. Po prostu zastąp:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state

    if (selected) {
        [self setBackgroundColor: CELL_SELECTED_BG_COLOR];
        [self.contentView setBackgroundColor: CELL_SELECTED_BG_COLOR];
    }else{
        [self setBackgroundColor: [UIColor clearColor]];
        [self.contentView setBackgroundColor: [UIColor clearColor]];
    }
}
Lal Krishna
źródło
0

Łatwo jest, gdy styl widoku tabeli jest prosty, ale w stylu grupowym to mały problem, rozwiązuję go przez:

CGFloat cellHeight = [self tableView:tableView heightForRowAtIndexPath:indexPath];
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kGroupTableViewCellWidth+2, cellHeight)];
view.backgroundColor = kCommonHighlightedColor;
cell.selectedBackgroundView = view;
[view release];
UIRectCorner cornerFlag = 0;
CGSize radii = CGSizeMake(0, 0);
NSInteger theLastRow = --> (yourDataSourceArray.count - 1);
if (indexPath.row == 0) {
    cornerFlag = UIRectCornerTopLeft | UIRectCornerTopRight;
    radii = CGSizeMake(10, 10);
} else if (indexPath.row == theLastRow) {
    cornerFlag = UIRectCornerBottomLeft | UIRectCornerBottomRight;
    radii = CGSizeMake(10, 10);
}
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:cornerFlag cornerRadii:radii];
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
shapeLayer.path = maskPath.CGPath;
view.layer.mask = shapeLayer;

zauważyłem kGroupTableViewCellWidth, definiuję go jako 300, jest to szerokość szerokości komórki widoku tabeli grup w iPhonie

勇敢 的 心
źródło
0
[cell setSelectionStyle:UITableViewCellSelectionStyleGray];

Upewnij się, że użyłeś powyższej linii, aby użyć efektu wyboru

Tushar
źródło
0
override func setSelected(selected: Bool, animated: Bool) {
    // Configure the view for the selected state

    super.setSelected(selected, animated: animated)
    let selView = UIView()

    selView.backgroundColor = UIColor( red: 5/255, green: 159/255, blue:223/255, alpha: 1.0 )
    self.selectedBackgroundView = selView
}
Ranjan
źródło
Dodaj wyjaśnienie swojej odpowiedzi, aby była czytelna dla wszystkich przyszłych czytelników
techspider
0

Używam iOS 9.3 i ustawianie koloru za pomocą Storyboard lub ustawienie cell.selectionStylenie działało dla mnie, ale poniższy kod działał:

UIView *customColorView = [[UIView alloc] init];
customColorView.backgroundColor = [UIColor colorWithRed:55 / 255.0 
                                                  green:141 / 255.0 
                                                   blue:211 / 255.0 
                                                  alpha:1.0];
cell.selectedBackgroundView = customColorView;

return cell;

Znalazłem to rozwiązanie tutaj .

Felipe Andrade
źródło
0

Spróbuj obserwować kod.

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:[cellIdArray objectAtIndex:indexPath.row] forIndexPath:indexPath];

    // Configure the cell...
    cell.backgroundView =
    [[UIImageView alloc] init] ;
    cell.selectedBackgroundView =[[UIImageView alloc] init];

    UIImage *rowBackground;
    UIImage *selectionBackground;


    rowBackground = [UIImage imageNamed:@"cellBackgroundDarkGrey.png"];
    selectionBackground = [UIImage imageNamed:@"selectedMenu.png"];

    ((UIImageView *)cell.backgroundView).image = rowBackground;
    ((UIImageView *)cell.selectedBackgroundView).image = selectionBackground;



    return cell;
}

// Szybka wersja:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


        let cell = tableView.dequeueReusableCell(withIdentifier: "cell")! as UITableViewCell


        cell.selectedBackgroundView = UIImageView()
        cell.backgroundView=UIImageView()

        let selectedBackground : UIImageView = cell.selectedBackgroundView as! UIImageView
        selectedBackground.image = UIImage.init(named:"selected.png");

        let backGround : UIImageView = cell.backgroundView as! UIImageView
        backGround.image = UIImage.init(named:"defaultimage.png");

        return cell


    } 
Avijit Nagare
źródło
0

Swift 4.x

Aby zmienić kolor tła zaznaczenia na dowolnyKolor użyj Swift Extension

Utwórz rozszerzenie komórki UITableView jak poniżej

extension UITableViewCell{

    func removeCellSelectionColour(){
        let clearView = UIView()
        clearView.backgroundColor = UIColor.clear
        UITableViewCell.appearance().selectedBackgroundView = clearView
    } 

}

Następnie wywołaj removeCellSelectionColour () z instancją komórki.

iSrinivasan27
źródło