UITableViewCell hiển thị nền trắng và không thể sửa đổi trên iOS7


186

Tôi đã triển khai một lớp ô xem bảng tùy chỉnh kế thừa từ đó UITableViewCell. Chế độ xem bảng chứa hình ảnh nền, vì vậy tôi muốn nền của ô trong suốt. Nó trông tuyệt vời trước iOS7.

Tuy nhiên, trong iOS7, ô luôn được hiển thị với nền trắng.


Ngay cả đối với Xcode7, 2015, có một lỗi trong bảng phân cảnh : bạn phải đặt màu nền của một ô trong mã.


bạn có thể thay đổi màu nền của ô trực tiếp bằng cách truy cập màu nền thuộc tính của nó. cell.backgroundColor = [UIColor ClearColor];
ViruMax

Câu trả lời:


384

Như Apple DOC đã nói ( Tham khảo lớp UITableViewCell ):

... Trong iOS 7, các ô có nền trắng theo mặc định ; trong các phiên bản trước của iOS, các ô kế thừa màu nền của chế độ xem bảng kèm theo. Nếu bạn muốn thay đổi màu nền của một ô, hãy làm như vậy trong bảngView: willDisplayCell: forRowAtIndexPath: phương thức của đại biểu xem bảng của bạn.

Vì vậy, trong trường hợp của tôi, để hiển thị các ô có nền trong suốt, chỉ cần thực hiện phương thức ủy nhiệm trong trình điều khiển xem bảng như dưới đây:

- (void)tableView:(UITableView *)tableView
  willDisplayCell:(UITableViewCell *)cell
forRowAtIndexPath:(NSIndexPath *)indexPath
{
  [cell setBackgroundColor:[UIColor clearColor]];
}

Chỉ cần Lưu ý : Như @null nói, "... có vẻ là một lỗi trong xây dựng giao diện ..." , tôi không hoàn toàn chắc chắn cho dù nó không có lỗi, nhưng dường như gây ra bình luận của ông có một số phiếu bầu lên. Vì vậy, có thể có điều gì đó sai nếu bạn sử dụng IB. :)


53
Thật không may là không đúng, dường như có một lỗi trong trình tạo giao diện và tôi không thể đặt nó vào ô tùy chỉnh của mình từ bảng phân cảnh.
Tarek Hallak

1
@null, aha, dường như SDK iOS 7 vẫn còn nhiều lỗi cần phải sửa. Tôi đã gặp một số, nhưng đối với Storyboard liên quan, tôi không biết. :)
Kjuly

4
Bạn cũng có thể làm điều này trong tableView:cellForRowAtIndexPath:phương pháp.
bugloaf

1
@KendallHelmstetterGelner chắc chắn? Tôi đã không nhận thấy nó, dường như vẫn còn làm việc cho tôi. :)
Kjuly

1
Như bugloaf đã nói ở trên - thực hiện trong bảngView: cellForRowAtIndexPath:
amergin

66

Tôi đã nghiên cứu nó một chút và phát hiện ra rằng nền ô màu được thiết lập bởi hệ thống Giao diện. Vì vậy, nếu tất cả các ô trong ứng dụng của bạn có nền rõ ràng, giải pháp đơn giản nhất sẽ là:

[[UITableViewCell appearance] setBackgroundColor:[UIColor clearColor]];

Và ngay cả khi chúng có nền khác nhau, màu sắc rõ ràng có vẻ thuận tiện nhất như màu mặc định.


1
Bạn của tôi là một con quái vật. Tôi phân lớp tất cả các của tôi UITableViewCell, vì vậy tôi không thể cung cấp cho siêu lớp một trình khởi tạo để đặt màu BG thành clearColor, nhưng đoán xem sao? Điều đó không hiệu quả ... Ý tôi là, TẠI SAO, APPLE?
Mazyod

Những công việc này. Tuy nhiên, màu trắng bật ra khỏi tầm nhìn. Đã đi với phản ứng hàng đầu cho hiệu quả tốt nhất (không xuất hiện).
Carl Prehn

@Anton Filimonov Tôi đã thiết lập giao diện ô xem bảng trong Appdelegate của mình bây giờ trong một khung nhìn cụ thể. Tôi muốn có màu khác cho ô, làm cách nào để tiếp cận Kịch bản này? Tôi đã cố gắng thiết lập màu khác nhau trong phương thức ủy nhiệm của CellWillDisplay nhưng không có hiệu quả. Bạn có thể vui lòng giúp tôi về điều này
Peer Mohamed Thabib

@PeerMohamedThabib vui lòng cho biết thêm về môi trường (iPad / iPhone, phiên bản iOS) và cung cấp một số mã. Và thực tế bạn có thể tự mình điều tra tình huống - chỉ cần tạo một lớp con của UITableViewCell, xác định lại phương thức setBackgroundColor: bên trong bảngView: willDisplayCellAtIndexPath:
Anton Filimonov

1
Ngay cả khi bạn có các ô hỗn hợp, một số có nền và một số không có (trong suốt). Cách dễ nhất là định nghĩa một lớp tùy chỉnh và viết cùng một mã. Bằng cách này, tất cả các lớp UITableViewCell sẽ vẫn mặc định và các lớp tùy chỉnh sẽ có màu rõ ràng. [[Giao diện CustomTableCell] setBackgroundColor: [UIColor clearColor]]; Điều này sẽ không ảnh hưởng đến UITableViewCells, và chỉ gây ảnh hưởng đến các ô tùy chỉnh.
Ansari

30

Viết cái này vào phương thức cellForRowAtIndexPath của bạn trước khi trả về ô;

cell.backgroundColor = [UIColor clearColor];

1
Điều này đã giúp tôi khắc phục sự cố trong iOS 8 trên iPhone 5.
Almo

13

Màu nền mặc định của UITableViewCelliOS 7 là màu trắng.

Bạn phải đặt thuộc backgroundColortính ở đâu đó trong mã của bạn. Ví dụ: đặt nó sau khi bạn vừa tạo ô.

cell.backgroundColor = [UIColor clearColor];

Tôi đã cố gắng nhưng nó không làm việc cho tôi. Bạn có chắc chắn rằng nó hoạt động?
Matrosov Alexander

Hoạt động với tôi cho một ô xem bảng tùy chỉnh trong phương thức initWithCoder: aDecoder.
ftvs

13

Tôi thực sự thấy rằng vấn đề phát sinh từ màu Nền của UITableView không được đặt thành xóa. Nếu bạn thay đổi màu Nền của UITableViewCell thành xóa và bạn thấy bạn vẫn thấy màu trắng, hãy đảm bảo rằng màu nền của UITableView được đặt thành xóa (hoặc bất cứ điều gì bạn muốn).

[self.tableView setBackgroundView:nil];
[self.tableView setBackgroundColor:[UIColor clearColor]];

Trong Swift

tableView.backgroundView = nil
tableView.backgroundColor = UIColor.clearColor()

Chỉ cần FYI bạn cũng có thể thiết lập điều này trong IB. Chỉ cần đảm bảo rằng bạn thay đổi màu nền trong phần 'Chế độ xem' và không chỉ phần 'Chế độ xem bảng' mà rõ ràng không có ảnh hưởng đáng chú ý.
AndyDunn

1
điều này cũng làm việc cho tôi, tôi đang tìm phiên bản nhanh của nó. Đã thêm những gì làm việc cho tôi trong mã :)
Mugunthan Balakrishnan

10

Đây chắc chắn là một lỗi iOS. Trong iOS 8, cài đặt màu nền Interface Builderhoạt động tốt cho iPhone, nhưng trong iPad thì luôn như vậy whiteColor. Để sửa nó, trong cellForIndexPaththông báo nguồn dữ liệu, hãy đặt nó vào:

cell.backgroundColor = cell.backgroundColor

Và nó sẽ hoạt động. Đây chính xác là lý do tại sao tôi nói đó là một lỗi vì bản thân mã này khá nhảm nhí, nhưng nó hoạt động.


Vẫn là trường hợp cho Xcode7 / iOS9. Tôi đã thêm mã rõ ràng trong bảngView: willDisplayCell: forRowAtIndexPath như đề xuất ở trên.
Andrew Duncan

Trong XCode 7.0.1, ứng dụng biên dịch phổ biến cho thấy nền đen trên iPhone chạy iOS 7,8,9 nhưng nền trắng trên iPad chạy iOS 9.0.2 (và có thể là những người khác nhưng không thể xác minh). Các mã trên đã sửa nó.
ScottyB

Đối với bảng tĩnh, ghi đè willDisplayCell với cell.backgroundColor = UIColor.clearColor (). Việc chỉ định lại thiết lập màu trong IB không phù hợp với tôi.
Viktor Kucera

4

Có thể là UITableViewCell của bạn được chọn theo mặc định .. Bạn có thể xác nhận điều này bằng trình gỡ lỗi trực quan mới Xcode 6s (hoặc tìm hiểu chính xác chế độ xem nào khiến ô trắng này xuất hiện).

nhập mô tả hình ảnh ở đây

Thật thú vị, sau khi biết điều này .. thiết lập màu nền của ô đã chọn thành xóa vẫn không hoạt động .. thực hiện một số nghiên cứu khác, hóa ra tôi chỉ phải sửa đổi kiểu chọn khi tôi tạo ô tùy chỉnh này:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // do customization here
    }
    self.selectionStyle = UITableViewCellSelectionStyleNone;
    [self setBackgroundColor:[UIColor clearColor]];
    return self;
}

liên kết bị hỏng cho trình gỡ lỗi trực quan
Suragch

3

Tôi thấy rằng không có cái nào ở trên hoạt động từ XCode 5.1.1, iOS 7.1.

Nếu bạn đang sử dụng Trình tạo giao diện với các ô nguyên mẫu, hãy chọn ô nguyên mẫu, sau đó từ bộ chọn thuộc tính trong phần Xem, thay đổi mặc định biểu mẫu Nền thành Xóa màu:

nhập mô tả hình ảnh ở đây

Điều này dường như làm việc tốt. Không có thay đổi mã nào ở trên là cần thiết, - đây là một giải pháp IB thuần túy.


2

Câu trả lời được chấp nhận đã không khắc phục vấn đề cho tôi. Tôi phải làm điều này:

  1. Trong trình tạo giao diện, chọn chế độ xem bảng. Sau đó, từ trình kiểm tra thuộc tính, từ phần Chế độ xem , đặt Nền thành trong suốt (độ mờ 0%).

nhập mô tả hình ảnh ở đây

  1. Từ phương thức lớp nguồn dữ liệu của bảng phương thức cellForRowAtIndexPath:

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
        reuseIdentifier:CellIdentifier];
    cell.backgroundColor = [UIColor clearColor]; //Make cell transparent

Chà, bạn sử dụng Trình tạo giao diện .. như @null đã nhận xét bên dưới câu trả lời của tôi, thì ... dường như có một lỗi trong trình xây dựng giao diện , khắc, tôi không hoàn toàn chắc chắn liệu nó có lỗi hay không, nhưng dường như điều đó gây ra bình luận đã nhận được nhiều phiếu bầu. ;)
Kjuly

Một cái gì đó trong iOS7 chắc chắn là lỗi khi nói đến nền di động trong suốt. Tôi hy vọng câu trả lời của tôi sẽ giúp những người khác đang đối mặt với tình huống tương tự như tôi.
RajV

Đây không phải là cách phù hợp để tạo các ô cho chế độ xem bảng của bạn, đặc biệt nếu bạn đang sử dụng Trình tạo giao diện / Bảng phân cảnh. Trong đoạn mã bạn đang tạo một ô mới mỗi khi đại biểu của bạn được yêu cầu một ô, đây không phải là sử dụng lại! Để đạt được lợi ích hiệu suất của việc tái sử dụng tế bào, bạn nên sử dụng cell = [tableView dequeueReusableCellWithIdentifier:<#Reuse ID#> forIndexPath:indexPath]. Trong các phiên bản trước, bạn bỏ đối số indexPath và sau đó kiểm tra nil, khởi tạo initWithStyle:reuseIdentifiertheo đoạn mã của bạn trong trường hợp không.
ikuramedia

ikuramedia: Tôi đã để lại mã sử dụng lại khỏi bài viết của mình. Tất nhiên, tôi sử dụng lại các tế bào. Đó không phải là điểm của bài viết này.
RajV

2

Đối với tôi thiết lập cell.backgroundColor = cell.contentView.backgroundColor; hoặc trong tableView:willDisplayCell:forRowAtIndexPath:hoặc tableView:cell:forRowAtIndexPath:làm công việc.

Điều này là do tôi đặt màu nền của contentView trong Trình tạo giao diện như mong muốn.


1

Khi thêm các đối tượng UI vào một ô, Xcode 5 / IOS 7 sẽ thêm một "Chế độ xem nội dung" mới sẽ là giám sát của tất cả các thành phần trong ô. Để đặt màu nền của ô, hãy đặt màu nền của Chế độ xem nội dung này. Các giải pháp trên không hiệu quả với tôi nhưng giải pháp này hiệu quả với tôi.


Chế độ xem nội dung có sẵn trong các phiên bản SDK trước, bạn chỉ cần đặt màu nền cho chế độ xem nội dung bao phủ chế độ xem nền của ô.
Kjuly

Chà, nó không tự động bật lên trong trình tạo giao diện trước xcode 5. Chính xác thì quan điểm của bạn là gì?
DrBug

Ý tôi là, câu trả lời của bạn đã thảo luận cho một vấn đề khác, không phải câu hỏi của tôi yêu cầu. Bạn chỉ muốn đặt màu nền cho ô của mình, phải không? Vì vậy, bất kể các ô có nền trắng theo mặc định hay không trong iOS 7, bạn luôn có thể triển khai nó bằng cách đặt màu cho chế độ xem nội dung, khiến chế độ xem nội dung nằm trên chế độ xem nền của ô. Có lý? ;)
Kjuly

1

Giải pháp Swift 1.2:

Chỉ cần thêm một định nghĩa rõ ràng cho màu nền của ô của bạn như vậy:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    // Configure the cell...
    cell.backgroundColor = UIColor.clearColor()

    return cell
}

Lấy làm tiếc. Đó là xấu của tôi. Nó hoạt động. Tôi đã bỏ lỡ một số cài đặt khác.
Sung Kim

1

Có một vấn đề tương tự, đã phải

  1. Đặt màu xanh làm vùng chọn Kiểu và
  2. thêm mã này vào mã để sửa nó

    override func tableView(tableView: UITableView, shouldHighlightRowAtIndexPath indexPath: NSIndexPath) -> Bool {
    
      var bgColorView: UIView = UIView()
      bgColorView.backgroundColor = UIColor(red: (76.0 / 255.0), green: (161.0 / 255.0), blue: (255.0 / 255.0), alpha: 1.0)
      bgColorView.layer.masksToBounds = true
      tableView.cellForRowAtIndexPath(indexPath)!.selectedBackgroundView = bgColorView
      return true
    }

0

Bạn cũng có thể sử dụng mã màu để làm cho UITableView Cell sinh lợi.

[cell setBackgroundColor:[self colorWithHexString:@"1fbbff"]];

Đây là mã để áp dụng phương pháp mã màu:

-(UIColor*)colorWithHexString:(NSString*)hex
{
    NSString *cString = [[hex stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] uppercaseString];


    if ([cString length] < 6) return [UIColor grayColor];

    if ([cString hasPrefix:@"0X"]) cString = [cString substringFromIndex:2];

    if ([cString length] != 6) return  [UIColor grayColor];

    NSRange range;
    range.location = 0;
    range.length = 2;
    NSString *rString = [cString substringWithRange:range];

    range.location = 2;
    NSString *gString = [cString substringWithRange:range];

    range.location = 4;
    NSString *bString = [cString substringWithRange:range];

    unsigned int r, g, b;
    [[NSScanner scannerWithString:rString] scanHexInt:&r];
    [[NSScanner scannerWithString:gString] scanHexInt:&g];
    [[NSScanner scannerWithString:bString] scanHexInt:&b];

    return [UIColor colorWithRed:((float) r / 255.0f)
                         green:((float) g / 255.0f)
                          blue:((float) b / 255.0f)
                         alpha:1.0f];
}
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.