UITableViewCell แสดงพื้นหลังสีขาวและไม่สามารถแก้ไขได้ใน iOS7


186

UITableViewCellฉันได้ดำเนินการระดับตารางที่กำหนดเองมุมมองมือถือที่สืบทอดมาจาก Tableview มีภาพพื้นหลังดังนั้นฉันต้องการให้พื้นหลังของเซลล์โปร่งใส มันดูดีก่อน iOS7

อย่างไรก็ตามใน iOS7 เซลล์จะแสดงเป็นพื้นหลังสีขาวเสมอ


แม้แต่ Xcode7, 2015 ก็มีข้อผิดพลาดในกระดานเรื่องราว : คุณต้องตั้งค่าสีพื้นหลังของเซลล์ในรหัส


คุณสามารถเปลี่ยนสีพื้นหลังของเซลล์ได้โดยตรงโดยเข้าถึงสีพื้นหลังของคุณสมบัติ cell.backgroundColor = [UIColor clearColor];
ViruMax

คำตอบ:


384

ดังที่ Apple DOC กล่าว ( การอ้างอิงระดับ UITableViewCell ):

... ใน iOS 7 เซลล์มีพื้นหลังเป็นสีขาวโดยค่าเริ่มต้น ; ใน iOS เวอร์ชันก่อนหน้าเซลล์จะสืบทอดสีพื้นหลังของมุมมองตารางที่ล้อมรอบ ถ้าคุณต้องการเปลี่ยนสีพื้นหลังของเซลล์ให้ทำเช่นนั้นในtableView: willDisplayCell: forRowAtIndexPath:เมธอดของผู้รับมอบสิทธิ์มุมมองตารางของคุณ

ดังนั้นสำหรับกรณีของฉันที่จะแสดงเซลล์ที่มีพื้นหลังโปร่งใสเพียงแค่ต้องใช้วิธีการมอบหมายในตัวควบคุมมุมมองตารางเช่นด้านล่าง:

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

Just Note : @null พูดว่า"... ดูเหมือนว่าจะมีข้อผิดพลาดในตัวสร้างส่วนต่อประสาน ... "ฉันไม่แน่ใจว่ามันมีบั๊กหรือเปล่า แต่ดูเหมือนว่าเพราะความคิดเห็นของเขาได้รับการโหวตหลายครั้ง ดังนั้นอาจมีบางอย่างผิดปกติถ้าคุณใช้ IB :)


53
น่าเสียดายที่ไม่จริงดูเหมือนว่าจะมีข้อผิดพลาดในตัวสร้างส่วนต่อประสานและฉันไม่สามารถตั้งค่าเป็นเซลล์ที่กำหนดเองของฉันจากกระดานเรื่องราว
Tarek Hallak

1
@ null, aha, ดูเหมือนว่า iOS 7 SDK ยังคงมีข้อบกพร่องมากมายที่ต้องได้รับการแก้ไข ฉันเคยพบบ้างแล้ว แต่สำหรับ Storyboard เกี่ยวข้องกับฉันไม่ทราบ :)
Kjuly

4
คุณสามารถทำได้ในtableView:cellForRowAtIndexPath:วิธีการ
bugloaf

1
@KendallHelmstetterGelner แน่ใจเหรอ? ฉันยังไม่ได้สังเกตมันดูเหมือนว่ายังใช้ได้สำหรับฉัน :)
Kjuly

1
ตามที่ bugloaf บอกไว้ด้านบน - ทำใน tableView: cellForRowAtIndexPath:
amergin

66

ฉันตรวจสอบเล็กน้อยและพบว่า backgroundColor ของเซลล์นั้นถูกกำหนดโดยระบบลักษณะที่ปรากฏ ดังนั้นหากเซลล์ทั้งหมดในใบสมัครของคุณมีพื้นหลังชัดเจนทางออกที่ง่ายที่สุดคือ:

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

และแม้ว่าพวกเขาจะมีพื้นหลังที่แตกต่างกันสีที่ชัดเจนน่าจะสะดวกที่สุดเท่าที่เป็นค่าเริ่มต้น


1
คุณเพื่อนของฉันเป็นสัตว์ประหลาด ฉันทำคลาสย่อยทั้งหมดของฉันUITableViewCellดังนั้นมันจึงไม่ใช่ปัญหาสำหรับฉันที่จะให้ซูเปอร์คลาสพร้อมกับเครื่องมือเริ่มต้นในการตั้งค่าสี BG เป็นclearColorแต่เดาว่าอะไร ไม่ได้ผล ... ฉันหมายความว่าทำไมแอปเปิ้ล?
Mazyod

วิธีนี้ใช้ได้ผล อย่างไรก็ตามสีขาวปรากฏออกมาจากมุมมอง ไปด้วยการตอบสนองด้านบนเพื่อผลที่ดีที่สุด (ไม่ popping)
Carl Prehn

@Anton Filimonov ฉันได้ตั้งค่าลักษณะที่ปรากฏของเซลล์มุมมองตารางใน Appdelegate ของฉันตอนนี้ใน viewController เฉพาะที่ฉันต้องการมีสีที่แตกต่างกันสำหรับเซลล์ฉันจะเข้าหาสถานการณ์นี้ได้อย่างไร ฉันพยายามตั้งค่าสีที่แตกต่างในวิธีการมอบหมาย CellWillDisplay แต่ไม่มีผล คุณช่วยฉันด้วยเรื่องนี้ได้ไหม
เพียร์โมฮาเหม็ดทาบาบ

@PeerMohamedThabib โปรดบอกเพิ่มเติมเกี่ยวกับสภาพแวดล้อม (iPad / iPhone, iOS เวอร์ชัน) และให้รหัสบางอย่าง และจริง ๆ แล้วคุณสามารถตรวจสอบสถานการณ์ด้วยตัวคุณเอง - เพียงแค่สร้าง subclass ของ UITableViewCell แล้วกำหนด setBackgroundColor: method ใหม่ (เพียงเรียกการดำเนินการของ superclass ภายใน) แล้วใส่เบรกพอยต์กับวิธีนี้แล้วคุณจะเห็นว่าสีของเซลล์เปลี่ยนไปอย่างไร ภายใน tableView: willDisplayCellAtIndexPath:
Anton Filimonov

1
แม้ว่าคุณจะมีเซลล์ผสมอยู่ แต่บางเซลล์มีพื้นหลังและบางส่วนไม่มี (โปร่งใส) วิธีที่ง่ายที่สุดคือการกำหนดคลาสที่กำหนดเองและเขียนรหัสเดียวกัน วิธีนี้คลาส UITableViewCell ทั้งหมดจะยังคงอยู่ในค่าเริ่มต้นและคลาสแบบกำหนดเองจะมีสีที่ชัดเจน [[ลักษณะที่ปรากฏของ CustomTableCell] setBackgroundColor: [UIColor clearColor]]; สิ่งนี้จะไม่ส่งผลกระทบต่อ defult UITableViewCells และมีผลกับเซลล์ที่กำหนดเองเท่านั้น
Ansari

30

เขียนสิ่งนี้ในวิธี cellForRowAtIndexPath ของคุณก่อนส่งคืนเซลล์

cell.backgroundColor = [UIColor clearColor];

1
สิ่งนี้ช่วยฉันด้วยปัญหาใน iOS 8 บน iPhone 5
Almo

13

สีพื้นหลังเริ่มต้นของUITableViewCelliOS 7 เป็นสีขาว

คุณต้องตั้งค่าbackgroundColorคุณสมบัติในรหัสของคุณ ตัวอย่างเช่นตั้งค่าหลังจากที่คุณสร้างเซลล์ขึ้นใหม่

cell.backgroundColor = [UIColor clearColor];

ฉันพยายาม แต่มันไม่ได้ผลสำหรับฉัน คุณแน่ใจหรือว่าใช้งานได้?
Matrosov Alexander

เหมาะสำหรับฉันสำหรับเซลล์มุมมองตารางแบบกำหนดเองในวิธี initWithCoder: aDecoder
ftvs

13

ฉันพบจริงว่าปัญหาเกิดจากสีพื้นหลังของ UITableView ไม่ได้ถูกกำหนดให้ชัดเจน หากคุณเปลี่ยนสีพื้นหลังของ UITableViewCell เพื่อล้างและคุณพบว่าคุณยังคงเห็นสีขาวให้ตรวจสอบให้แน่ใจว่าสีพื้นหลังของ UITableView ถูกตั้งค่าให้ชัดเจน (หรือสิ่งที่คุณต้องการ)

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

ในสวิฟท์

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

เพียงแค่ FYI คุณสามารถตั้งค่านี้ใน IB ได้ เพียงตรวจสอบให้แน่ใจว่าคุณเปลี่ยนสีพื้นหลังภายในส่วน 'มุมมอง' และไม่ใช่เฉพาะส่วน 'มุมมองตาราง' ซึ่งเห็นได้ชัดว่าไม่มีผลกระทบที่เห็นได้ชัดเจน
AndyDunn

1
สิ่งนี้ได้ผลกับฉันเช่นกันฉันกำลังมองหาเวอร์ชั่นที่รวดเร็ว เพิ่มสิ่งที่ทำงานสำหรับฉันในรหัส :)
Mugunthan บาลาค

10

นี่เป็นข้อบกพร่องของ iOS แน่นอน ใน iOS 8, การตั้งค่าสีพื้นหลังในInterface Builderการทำงานที่ดีสำหรับ iPhone, iPad whiteColorแต่มันเสมอ หากต้องการแก้ไขในcellForIndexPathข้อความแหล่งข้อมูลให้ใส่สิ่งนี้ใน:

cell.backgroundColor = cell.backgroundColor

และมันจะทำงาน นี่คือเหตุผลที่ฉันบอกว่ามันเป็นข้อผิดพลาดเนื่องจากรหัสตัวเองนั้นค่อนข้าง bullsh * t แต่มันใช้งานได้


ยังคงเป็นกรณีสำหรับ Xcode7 / iOS9 ฉันเพิ่มรหัสที่ชัดเจนใน tableView: willDisplayCell: forRowAtIndexPath ตามที่แนะนำข้างต้น
Andrew Duncan

ในแอพ Universal ที่รวบรวม XCode 7.0.1 พบพื้นหลังสีดำบน iPhone ที่ใช้ iOS 7,8,9 แต่พื้นหลังสีขาวบน iPad ที่ใช้ iOS 9.0.2 (และอาจเป็นอย่างอื่น แต่ไม่สามารถยืนยันได้) รหัสข้างต้นแก้ไขได้
ScottyB

สำหรับการแทนที่ tableView แบบสแตติก willDisplayCell ด้วย cell.backgroundColor = UIColor.clearColor () การกำหนดการตั้งค่าสีใน IB ไม่ได้ผลสำหรับฉัน
Viktor Kucera

4

อาจเป็นไปได้ว่า UITableViewCell ของคุณถูกเลือกโดยค่าเริ่มต้น .. คุณสามารถยืนยันได้โดยใช้ดีบักภาพใหม่ Xcode 6s (หรือดูว่ามุมมองใดที่ทำให้เซลล์สีขาวปรากฏขึ้น)

ป้อนคำอธิบายรูปภาพที่นี่

น่าสนใจหลังจากรู้เรื่องนี้แล้ว .. การตั้งค่าสีพื้นหลังของเซลล์ที่เลือกเพื่อล้างยังคงไม่ทำงาน .. ทำการวิจัยเพิ่มเติมบางอย่างปรากฎว่าฉันต้องปรับเปลี่ยนรูปแบบการเลือกเมื่อฉันสร้างเซลล์ที่กำหนดเองนี้:

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

ลิงก์เสียสำหรับ visual debugger
Suragch

3

ฉันพบว่าไม่มีการทำงานใด ๆ ข้างต้นจาก XCode 5.1.1, iOS 7.1

หากคุณใช้ตัวสร้างส่วนต่อประสานกับเซลล์ต้นแบบให้เลือกเซลล์ต้นแบบจากตัวเลือกคุณลักษณะในส่วนมุมมองเปลี่ยนค่าเริ่มต้นของรูปพื้นหลังเป็นสีใส:

ป้อนคำอธิบายรูปภาพที่นี่

ดูเหมือนว่าจะทำงานได้ดี ไม่จำเป็นต้องทำการเปลี่ยนแปลงโค้ดข้างต้นใด ๆ - นี่เป็นโซลูชัน IB บริสุทธิ์


2

คำตอบที่ยอมรับไม่ได้แก้ปัญหาให้ฉัน ฉันต้องทำสิ่งนี้:

  1. ในเครื่องมือสร้างอินเตอร์เฟสเลือกมุมมองตาราง จากนั้นจากตัวตรวจสอบคุณสมบัติจากส่วนมุมมองให้ตั้งค่าพื้นหลังเป็นแบบโปร่งใส (ความทึบ 0%)

ป้อนคำอธิบายรูปภาพที่นี่

  1. จากคลาสแหล่งข้อมูลของตาราง cellForRowAtIndexPath วิธีการ:

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

คุณใช้ Interface Builder .. เนื่องจาก @null แสดงความคิดเห็นด้านล่างคำตอบของฉัน“ ... ดูเหมือนว่าจะมีข้อผิดพลาดในตัวสร้างส่วนต่อประสาน…”ฉันไม่แน่ใจทั้งหมดว่ามีข้อผิดพลาดหรือไม่ แต่ดูเหมือนว่าเป็นสาเหตุนั้น ความคิดเห็นมีคะแนนโหวตหลายครั้ง ;)
Kjuly

บางสิ่งบางอย่างใน iOS7 เป็นรถบั๊กแน่นอนเมื่อมันมาถึงพื้นหลังของเซลล์โปร่งใส ฉันหวังว่าคำตอบของฉันจะช่วยให้ผู้อื่นที่กำลังเผชิญสถานการณ์แบบเดียวกันกับฉัน
RajV

นี่ไม่ใช่วิธีที่ถูกต้องในการสร้างเซลล์สำหรับมุมมองตารางของคุณโดยเฉพาะถ้าคุณใช้ตัวสร้างส่วนติดต่อ / กระดานเรื่องราว ในข้อมูลโค้ดคุณกำลังสร้างเซลล์ใหม่ทุกครั้งที่ผู้ร่วมประชุมของคุณถูกขอให้ทำสิ่งนี้จะไม่นำมาใช้ซ้ำ! cell = [tableView dequeueReusableCellWithIdentifier:<#Reuse ID#> forIndexPath:indexPath]เพื่อให้ได้รับประโยชน์ประสิทธิภาพการทำงานของเซลล์ที่นำมาใช้ใหม่คุณควรใช้ ในเวอร์ชันก่อนหน้านี้คุณวางอาร์กิวเมนต์ indexPath จากนั้นทดสอบค่าศูนย์โดยเริ่มต้นด้วยinitWithStyle:reuseIdentifierข้อมูลโค้ดของคุณในกรณีศูนย์
ikuramedia

ikuramedia: ฉันปล่อยให้รหัสที่ใช้ซ้ำออกจากโพสต์ของฉัน แน่นอนฉันนำเซลล์กลับมาใช้ใหม่ นั่นไม่ใช่จุดโพสต์นี้
RajV

2

สำหรับฉันการตั้งค่า cell.backgroundColor = cell.contentView.backgroundColor; ทั้งในtableView:willDisplayCell:forRowAtIndexPath:หรือtableView:cell:forRowAtIndexPath:ทำงาน

นี่เป็นเพราะฉันตั้งค่าสีพื้นหลังของ contentView ในตัวสร้างส่วนต่อประสานตามที่ต้องการ


1

เมื่อเพิ่มวัตถุ UI ลงในเซลล์ Xcode 5 / IOS 7 จะเพิ่ม "มุมมองเนื้อหา" ใหม่ซึ่งจะเป็นผู้ดูแลองค์ประกอบทั้งหมดในเซลล์ ในการตั้งค่าสีพื้นหลังของเซลล์ให้ตั้งค่าสีพื้นหลังของมุมมองเนื้อหานี้ การแก้ปัญหาข้างต้นไม่ได้ผลสำหรับฉัน แต่อันนี้ใช้ได้ดีสำหรับฉัน


มุมมองเนื้อหามีอยู่ใน SDK เวอร์ชันก่อนหน้าเช่นกันคุณเพียงแค่ตั้งค่าสีพื้นหลังสำหรับมุมมองเนื้อหาที่ครอบคลุมมุมมองพื้นหลังของเซลล์
Kjuly

มันไม่ได้ป็อปอัพโดยอัตโนมัติในเครื่องมือสร้างอินเตอร์เฟสก่อนหน้า xcode 5 ประเด็นของคุณคืออะไร?
DrBug

ฉันหมายความว่าคำตอบของคุณพูดถึงปัญหาอื่นไม่ใช่คำถามที่ฉันขอ คุณแค่ต้องการตั้งค่าสีพื้นหลังสำหรับเซลล์ของคุณใช่ไหม ดังนั้นไม่ว่าเซลล์จะมีพื้นหลังสีขาวเป็นค่าเริ่มต้นหรือไม่ใน iOS 7 คุณสามารถใช้งานได้โดยตั้งค่าสีสำหรับมุมมองเนื้อหาทำให้มุมมองเนื้อหาวางอยู่เหนือมุมมองพื้นหลังของเซลล์ ทำให้รู้สึก? ;)
Kjuly

1

โซลูชันของ Swift 1.2:

เพียงเพิ่มคำจำกัดความที่ชัดเจนสำหรับสีพื้นหลังของเซลล์ดังนี้:

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

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

    return cell
}

ขอโทษ มันไม่ดีของฉัน มันได้ผล. ฉันพลาดการตั้งค่าอื่น ๆ
Sung Kim

1

มีปัญหาที่คล้ายกันต้อง

  1. ตั้งค่าสีน้ำเงินเป็น selectionStyle และ
  2. เพิ่มรหัสนี้เพื่อแก้ไข

    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

คุณยังสามารถใช้รหัสสีเพื่อทำให้เซลล์ UITableView ของคุณมีกำไร

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

นี่คือรหัสสำหรับใช้วิธีรหัสสี:

-(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];
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.