Kiểu lựa chọn UITableViewCell tùy chỉnh?


82

Khi tôi nhấp vào của tôi UITableViewCell, phần nền (những vùng mà hình nền của tôi không bao phủ) chuyển sang màu xanh lam khi tôi nhấp vào ô. Ngoài ra, tất cả các UILabels trên ô chuyển sang màu trắng khi nó được nhấp vào, đó là những gì tôi muốn.

Tuy nhiên điều tôi không muốn là nền màu xanh lam khi tôi nhấp vào nó nhưng nếu tôi làm vậy selectionstylenone, thì tôi sẽ mất màu được đánh dấu cho các UILabels trong ô.

Vậy có cách nào để vừa loại bỏ nền xanh khi nhấp vào ô mà vẫn giữ được màu tô đậm của chữ UILabels không?


Câu trả lời:


174

Bạn có thể làm điều này như sau. Đặt kiểu chọn ô trong bảng của bạn thành UITableViewCellSelectionStyleNone. Thao tác này sẽ xóa phần đánh dấu nền màu xanh lam. Sau đó, để làm cho việc đánh dấu nhãn văn bản hoạt động theo cách bạn muốn, thay vì sử dụng lớp UITableViewCell mặc định, hãy tạo một lớp con UITableViewCellvà ghi đè việc triển khai mặc định bằng cách triển khai của setHighlighted:animatedriêng bạn, đặt màu nhãn theo cách bạn muốn tùy thuộc vào trạng thái được đánh dấu .

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{
    if (highlighted) {
        self.textLabel.textColor = [UIColor whiteColor];
    } else {
        self.textLabel.textColor = [UIColor blackColor];
    }
}

11
Một lưu ý phụ, hãy đảm bảo bạn ghi đè setHighlighted:animated:, lấy animatedtham số. Ghi đè setHighlighted:phương thức một tham số sẽ không hoạt động.
Imre Kelényi

14
Chúng ta có nên gọi [super setHighlighted:highlighted animated:animated];không?
SoftDesigner

Cảm ơn rất nhiều! Hoạt động như một sự quyến rũ! Và điều này cho phép tôi kiểm soát việc làm nổi bật các chế độ xem tùy chỉnh khác trong ô nếu tôi muốn, bởi vì làm nổi bật tiêu chuẩn làm điều đó rất lạ.
imike

2
Nhưng phương pháp này có một vấn đề khi bạn ghi đè setHighlightedsetSelected. Đầu tiên, bạn chọn một ô, ok, textColor đổi thành màu trắng, sau đó bạn cuộn ô đó ra khỏi phần hình ảnh trên màn hình, sau đó cuộn lại, xem, textColor chuyển sang màu đen
ronan

1
@jonkroll Tôi đã hiểu khái niệm, nhưng yêu cầu của tôi là khi một ô đang được chọn thì màu của Nhãn văn bản của ô đó sẽ vẫn là Màu được chọn, ngay bây giờ nó chỉ thay đổi màu của Nhãn văn bản trong khi chọn, sau đó chọn textLabel vẫn trong màu gốc
Samarth Kejriwal

75

Nếu làm việc trước iOS7, hãy đặt kiểu chọn ô của bạn không có

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Khác, để nó bằng UITableViewCellSelectionStyleDefault

Sau đó:

UIView *selectedView = [[UIView alloc]init];
selectedView.backgroundColor = [UIColor redColor];
cell.selectedBackgroundView =  selectedView;

Mã này sẽ hoạt động bình thường


2
@iBradApps ... ở đây bạn không tạo ra bất kỳ lớp tùy chỉnh ... của tế bào ui tableview
Alfa

2
Đưa ra lời tán thành này - đó là giải pháp duy nhất phù hợp với tôi để thay đổi màu không phải văn bản của một ô đã chọn trong iOS 7.
Vern Jensen

1
selectionstyle nên selectionStyle
Braden

12
Giải pháp này đã hoạt động trên iOS7 nhưng chỉ sau khi tôi đặt selectStyle thành UITableViewCellStyleDefault.
Jay Q.

1
Phương pháp này là phương pháp duy nhất hoàn toàn giống với hành vi chọn ô "out of box" của Apple. Nó phải được chấp nhận câu trả lời.
mkll

16

Bạn có thể sử dụng các phương pháp ủy quyền sau sau khi bạn đặt kiểu lựa chọn thành không:

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath

Triển khai mã của bạn ở đây, như thế này

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    CustomCell *cell = (CustomCell *)[tableView cellForRowAtIndexPath:indexPath];
    [cell.lbls setTextColor:[UIColor whiteColor]];
    return indexPath;
}

1
Giải pháp tuyệt vời và sạch sẽ! Bạn chỉ phải thực hiện lệnh gọi willDeselectRowAtIndexPath và nó hoạt động như một phép thuật!
Matej Balantič

1
Một nhược điểm có thể có ở đây là phương thức này không được gọi cho đến khi ngón tay của bạn rời khỏi ô đã chọn; một số cách tiếp cận khác có hiệu lực ngay khi bạn chạm vào ô.
arlomedia

14

Để có được công việc này, bạn phải thiết lập kiểu lựa chọn UITableViewCellSelectionStyleNonevà sau đó bạn nên ghi đè phương thức setSelected:animated:để có được kết quả bạn muốn. Nó thực hiện tương tự như cơ chế chọn tự động của iOS khi bạn nhìn thấy vùng chọn màu xanh lam (hoặc xám).

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    if (selected) {
        self.textLabel.textColor = [UIColor whiteColor];
    } else {
        self.textLabel.textColor = [UIColor blackColor];
    }
}

Bạn cũng có thể tùy chỉnh điều này theo cách khác, ví dụ: bằng cách thay đổi nền UITableViewCell, v.v.


13

Trong cellForRowAtIndexPath sử dụng mã này:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

[cell.myLabel setHighlightedTextColor: [UIColor whiteColor]]; // for all your labels

Hy vọng điều này sẽ làm việc cho bạn.

Thưởng thức mã hóa :)


Câu trả lời này cần phải được đặt lên hàng đầu. :)
Chintan Patel

2
Điều này sẽ không hoạt động. Nếu bạn muốn tạo [cell.textLabel setHighlightedTextColor: [UIColor blueColor]]; Lựa chọn ô Kiểu không được là KHÔNG.
Femina

6

Ghi đè các chức năng sau trong lớp con của bạn UITableViewCell.

override func setHighlighted(highlighted: Bool, animated: Bool) { }
override func setSelected(selected: Bool, animated: Bool) { }

Cảm ơn bạn; đây là điều duy nhất không làm cho toàn bộ hàng từ cạnh trái của màn hình sang phải được chọn khi thay đổi màu nền.
Jose Ramirez

Tôi chỉ ghi đè setSelected đó là lý do tại sao đôi khi ô vẫn nhấp nháy.
Zonily Jame 19/09/18

3

Để phù hợp với hành vi của kiểu lựa chọn tiêu chuẩn, bạn sẽ muốn ghi đè cả hai setHighlighted:animated:setSelected:animated:. Có thể bạn sẽ muốn chuyển mã đó vào một phương thức được chia sẻ để tránh trùng lặp mã.

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

1

Trong ô tùy chỉnh của bạn, hãy ghi đè triển khai mặc định của 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];
    }
}

Ngoài ra hãy chắc chắn rằng phong cách lựa chọnKHÔNG thiết lập để None .


0

Cách duy nhất tôi có thể làm cho nó hoạt động là:

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

0

Ngoài ra, bạn có thể sử dụng contentView.alpha. Đây là ví dụ.

Đầu tiên, đặt kiểu lựa chọn cho ô của bạn:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Tiếp theo, trong lớp ô tùy chỉnh ghi đè phương thức này bằng ví dụ hoạt ảnh:

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