UITableView Cell chọn màu?


319

Tôi đã tạo ra một tùy chỉnh UITableViewCell. Chế độ xem bảng đang hiển thị dữ liệu tốt. Điều tôi bị mắc kẹt là khi người dùng chạm vào ô của chế độ xem bảng, sau đó tôi muốn hiển thị màu nền của ô khác với các giá trị [màu xanh] mặc định để làm nổi bật lựa chọn ô. Tôi sử dụng mã này nhưng không có gì xảy ra:

cell.selectedBackgroundView.backgroundColor=[UIColor blackColor];

Câu trả lời:


365

Tôi nghĩ rằng bạn đã đi đúng hướng, nhưng theo định nghĩa lớp cho selectedBackgroundView:

Mặc định là không cho các ô trong các bảng kiểu đơn giản (UITableViewStylePlain) và không phải là không cho các bảng nhóm phần UITableViewStylegrouped).

Do đó, nếu bạn đang sử dụng bảng kiểu đơn giản, thì bạn sẽ cần cấp phát một cái mới UIViewcó màu nền mong muốn và sau đó gán nó cho selectedBackgroundView.

Ngoài ra, bạn có thể sử dụng:

cell.selectionStyle = UITableViewCellSelectionStyleGray;

nếu tất cả những gì bạn muốn là một nền màu xám khi ô được chọn. Hi vọng điêu nay co ich.


1
Thuộc tính này cũng có thể được đặt trong bảng phân cảnh nếu bạn muốn để lại các nội dung liên quan đến chế độ xem.
IIllIIll

1
Phiên bản Swift 3: cell.selectionStyle = .gray // Bạn cũng có thể sử dụng .none, .blue hoặc .default
Sébastien REMY

6
Câu trả lời này khá cũ ... Có một số thay đổi trong các phiên bản iOS mới hơn? Tôi có một bảng kiểu đơn giản và lựa chọnBackgroundView của tôi là KHÔNG. Điều thú vị là thay đổi màu nền trên chế độ xem này không có bất kỳ ảnh hưởng nào, thay vào đó tôi phải thay thế nó bằng một UIView mới bằng nền màu mong muốn của tôi để làm cho nó hoạt động.
ndreisg

Bạn vừa cứu tôi khỏi phát điên hoàn toàn. Cảm ơn nhiều!
mrwheet

656

Không cần cho các tế bào tùy chỉnh. Nếu bạn chỉ muốn thay đổi màu đã chọn của ô, bạn có thể làm điều này:

Mục tiêu-C:

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

Nhanh:

let bgColorView = UIView()
bgColorView.backgroundColor = UIColor.red
cell.selectedBackgroundView = bgColorView

47
Điều này hoạt động, nhưng trong một UITableView được nhóm lại, các góc tròn bị mất.
David

1
@David Liệu angleRadius = 7 có hoạt động ở bất cứ đâu trong chế độ xem bảng được nhóm không? Nếu tế bào ở giữa thì sao? Đừng có thời gian để kiểm tra điều này.
Maciej Swic

2
cho swift là một sai lầm nhỏ. Dòng chính xác là cell.selectedBackgroundView = bgColorView
John Kakon

13
Xin lưu ý rằng để làm việc này, trong Bảng phân cảnh (hoặc tệp XIB), bạn phải chọn màu Nền được chọn khác với Không có. Điều này trái với một số câu trả lời nói rằng trước tiên bạn cần đặt nó thành Không cho nó hoạt động. Không có, nó sẽ không hoạt động. Đã làm tôi phát điên cho đến khi tôi nhận ra nó. Cảm ơn.
kakubei

1
Làm thế nào bạn sẽ làm cho công việc này khi bạn cũng đang sử dụng bảng phân cảnh?
Giăng

42

Màu nền của bảng chọn ô có thể được đặt qua Bảng phân cảnh trong Trình tạo giao diện:

bảng xem màu lựa chọn ô Không có


1
Tôi nghĩ rằng chúng ta không thể thiết lập màu tùy chỉnh từ bảng phân cảnh. Cần thiết lập nó theo chương trình.
pallavi

37

Nếu bạn có một bảng được nhóm chỉ với một ô cho mỗi phần, chỉ cần thêm dòng bổ sung này vào mã: bgColorView.layer.cornerRadius = 10;

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

Đừng quên nhập QuartzCore.


28

Swift 3: đối với tôi nó hoạt động khi bạn đưa nó vào cellForRowAtIndexPath:phương thức

let view = UIView()
view.backgroundColor = UIColor.red
cell.selectedBackgroundView = view

6
Tôi nghĩ rằng nơi tốt hơn để đặt đây là awakeFromNib()phương thức (trong trường hợp ô tùy chỉnh).
LpriceSun

22

Các hoạt động sau đây cho tôi trong iOS 8.

Tôi phải đặt kiểu chọn thành UITableViewCellSelectionStyleDefault màu nền tùy chỉnh để hoạt động. Nếu bất kỳ phong cách khác, màu nền tùy chỉnh sẽ bị bỏ qua. Dường như có một sự thay đổi trong hành vi vì các câu trả lời trước đó cần đặt kiểu thành không thay thế.

Mã đầy đủ cho ô như sau:

- (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;
}

Mã này bị rò rỉ bộ nhớ. Bất kỳ "cấp phát" hoặc tạo đối tượng phải ở trong khối if (cell == nil) {}. Hoặc chế độ xem sẽ được tạo mỗi khi ô được phát hành bởi iOS.
GeneCode

18

Tạo một ô tùy chỉnh cho ô bảng của bạn và trong lớp ô tùy chỉnh.m đặt mã bên dưới, nó sẽ hoạt động tốt. Bạn cần đặt hình ảnh màu mong muốn trong selectionBackgroundUIImage.

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    UIImage *selectionBackground = [UIImage imageNamed:@"yellow_bar.png"];
    UIImageView *iview=[[UIImageView alloc] initWithImage:selectionBackground];
    self.selectedBackgroundView=iview;
}

2
Tôi nghĩ rằng điều này có thể hiệu quả hơn về bộ nhớ so với việc thiết lập một BackgroundView được chọn khi khởi tạo ô bằng cách chỉ tạo chế độ xem bg khi một ô được chọn.
dotlashlu

11

Tiện ích mở rộng 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


1
thêm IBDesignable và IBInspectable
Michał Ziobro

1
@ MichałZiobro chỉ cần thêm @IBInspectablevào var nếu bạn muốn. @IBDesignablekhông hữu ích cho việc này.
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];
}

Chúng ta cần đặt chế độ xem nền đã chọn trong phương thức này.


8

Nếu bạn muốn thêm màu được tô sáng tùy chỉnh vào ô của mình (và ô của bạn chứa các nút, nhãn, hình ảnh, v.v.) Tôi đã làm theo các bước tiếp theo:

Ví dụ: nếu bạn muốn màu vàng được chọn:

1) Tạo chế độ xem phù hợp với tất cả các ô có độ mờ 20% (có màu vàng) được gọi là ví dụ hình nền được chọn

2) Trong bộ điều khiển tế bào viết điều này:

- (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];
}

8

Trong Swift 4, bạn cũng có thể đặt màu nền của ô bảng trên toàn cầu (lấy từ đây ):

let backgroundColorView = UIView()
backgroundColorView.backgroundColor = UIColor.red
UITableViewCell.appearance().selectedBackgroundView = backgroundColorView

6

Nếu bạn đang sử dụng TableViewCell tùy chỉnh, bạn cũng có thể ghi đè awakeFromNib:

override func awakeFromNib() {
    super.awakeFromNib()

    // Set background color
    let view = UIView()
    view.backgroundColor = UIColor.redColor()
    selectedBackgroundView = view
}

1
Giải pháp tốt đẹp! Cảm ơn
Thomás Calmon

Tôi đang có một bảng xem đơn giản với không quá 10 ô, điều này hoạt động rất tốt cho đến nay.
code4latte

5

Thêm một mẹo nữa theo cách của Christian để hiển thị nền góc tròn cho bảng được nhóm.

Nếu tôi sử dụng cornerRadius = 10cho ô, nó hiển thị nền lựa chọn tròn bốn góc. Nó không giống với giao diện người dùng mặc định của chế độ xem bảng.

Vì vậy, tôi nghĩ về cách dễ dàng để giải quyết nó với angleRadius . Như bạn có thể thấy từ các mã bên dưới, hãy kiểm tra vị trí của ô (trên cùng, dưới cùng, giữa hoặc topbottom) và thêm một lớp phụ để ẩn góc trên cùng hoặc góc dưới cùng. Điều này chỉ hiển thị chính xác giao diện với nền lựa chọn của chế độ xem bảng mặc định.

Tôi đã thử mã này với iPad splitterview. Bạn có thể thay đổi vị trí khung của patchLayer nếu cần.

Xin vui lòng cho tôi biết nếu có cách dễ dàng hơn để đạt được kết quả tương tự.

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];
        }
    }
}

4

Tôi muốn lưu ý rằng trình soạn thảo XIB cung cấp cho bạn các tùy chọn tiêu chuẩn sau:

Mục: xanh / xám / không

(cột bên phải có các tùy chọn, tab thứ 4, nhóm đầu tiên "Ô xem bảng", nhóm phụ thứ 4, 1 trong 3 mục ghi "Lựa chọn")

Có lẽ những gì bạn muốn làm có thể đạt được bằng cách chọn tùy chọn tiêu chuẩn phù hợp.


bạn đúng. Do, nếu bạn làm như vậy, bạn có thể đơn giản thay đổi màu lựa chọn trong "cellForRowAtIndexPath" bằng cách thêm: UITableViewCell * cell = [tableView dequeueReabilitiesCellWithIdentifier: @ "Cell"]; cell.selectedBackgroundView = [[UIView alloc] initWithFrame: CGRectZero]; cell.selectedBackgroundView.backgroundColor = [UIColor colorWithRed: (255/255) green: (0/255) blue: (0/255) alpha: 0.1];
dùng8675

CẢM ƠN! con đường để đi
Fattie

3

Theo màu tùy chỉnh cho một ô đã chọn UITableView, giải pháp tuyệt vời theo câu trả lời của Maciej Swic

Chỉ cần thêm vào đó, bạn khai báo câu trả lời của Swic trong cấu hình Cell thường ở dưới:

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

Và để thêm hiệu ứng, thay vì màu hệ thống, bạn có thể sử dụng các giá trị RGB cho giao diện màu tùy chỉnh. Trong mã của tôi đây là cách tôi đạt được nó:

- (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;

}

Hãy cho tôi biết nếu điều đó làm việc cho bạn là tốt. Bạn có thể nhầm với cornerRadiussố hiệu ứng trên các góc của ô đã chọn.


3

Tôi đã có một cách tiếp cận hơi khác so với những người khác phản ánh lựa chọn trên cảm ứng hơn là sau khi được chọn. Tôi có một UITableViewCell được phân lớp. Tất cả những gì bạn phải làm là đặt màu nền trong các sự kiện cảm ứng, mô phỏng lựa chọn khi chạm và sau đó đặt màu nền trong chức năng setSelected. Đặt màu nền trong chức năng selSelected cho phép bỏ chọn ô. Đảm bảo chuyển sự kiện chạm tới siêu phẩm, nếu không, ô sẽ không thực sự hoạt động như thể được chọn.

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()
}

3

Để thêm nền cho tất cả các ô (sử dụng câu trả lời của Maciej):

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];
        }
    } 

2

Để ghi đè UITableViewCell's setSelectedcũng làm việc.

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

    // Set background color
    let view = UIView()
    view.backgroundColor = UIColor.redColor()
    selectedBackgroundView = view
}

2

Đối với những người chỉ muốn thoát khỏi nền màu xám được chọn mặc định, hãy đặt dòng mã này vào ô của bạnForRowAtIndexPath func:

yourCell.selectionStyle = .None

1
cảm ơn rất nhiều, đây là câu trả lời đúng cho tôi chứ không phải những người khác.
DeyaEldeen

Cách đặt màu như "xanh" thay vì không đặt hoặc màu xanh hoặc xám.
Satyam

2

cho Swift 3.0:

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

    cell.contentView.backgroundColor = UIColor.red
}

Đẹp, nhưng sẽ chỉ hoạt động sau khi người dùng chọn thứ gì đó (màu lựa chọn mặc định sẽ vẫn bắt đầu)
Konstantin Salavatov

2

Tôi sử dụng cách tiếp cận dưới đây và hoạt động tốt cho tôi,

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
                    }
                }
            }

2

Swift 4+:

Thêm các dòng sau trong ô bảng của bạn

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

Cuối cùng, nó sẽ như dưới đây

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

    }

1

Đây là phần quan trọng của mã cần thiết cho một bảng được nhóm. Khi bất kỳ ô nào trong một phần được chọn, hàng đầu tiên sẽ đổi màu. Không có thiết lập ban đầu kiểu di động là không có tải lại gấp đôi khi người dùng nhấp vào hàng0 trong đó ô thay đổi thành bgColorView sau đó mờ dần và tải lại bgColorView. Chúc may mắn và cho tôi biết nếu có một cách đơn giản hơn để làm điều này.

- (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];
}

1

Trong trường hợp của lớp tế bào tùy chỉnh. Chỉ cần ghi đè:

- (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]];
    }
}

0

Thật dễ dàng khi kiểu xem bảng đơn giản, nhưng theo kiểu nhóm, có một chút rắc rối, tôi giải quyết nó bằng cách:

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;

lưu ý kgroupTableViewCellWidth, tôi xác định nó là 300, đó là chiều rộng của chiều rộng ô xem bảng nhóm trong iPhone


0
[cell setSelectionStyle:UITableViewCellSelectionStyleGray];

Hãy chắc chắn rằng bạn đã sử dụng dòng trên để sử dụng hiệu ứng lựa chọn


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
}

Vui lòng thêm một số giải thích về câu trả lời của bạn để làm cho nó dễ đọc cho tất cả các độc giả tương lai
techspider

0

Tôi đang sử dụng iOS 9.3 và cài đặt màu thông qua Storyboard hoặc cài đặt cell.selectionStylekhông hoạt động với tôi, nhưng mã bên dưới hoạt động:

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;

Tôi tìm thấy giải pháp này ở đây .


0

Hãy thử theo dõi mã.

- (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;
}

// Phiên bản Swift:

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


    } 

0

Swift 4.x

Để thay đổi Màu nền lựa chọn thành anyColour, hãy sử dụng Swift Extension

Tạo phần mở rộng UITableView Cell như bên dưới

extension UITableViewCell{

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

}

Sau đó gọi removeCellSelectionColour () với thể hiện của ô.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.