วิธีปรับแต่งสีพื้นหลังของ UITableViewCell


188

ฉันต้องการปรับแต่งพื้นหลัง (และอาจเป็นเส้นขอบด้วย) ของ UITableViewCells ทั้งหมดภายใน UITableView ของฉัน จนถึงตอนนี้ฉันยังไม่สามารถปรับแต่งสิ่งนี้ได้ดังนั้นฉันจึงมีเซลล์พื้นหลังสีขาวจำนวนมากซึ่งเป็นค่าเริ่มต้น

มีวิธีในการทำเช่นนี้กับ SDK iPhone หรือไม่?

คำตอบ:


193

คุณต้องตั้งค่า backgroundColor ของ contentView ของเซลล์เป็นสีของคุณ หากคุณใช้อุปกรณ์เสริม (เช่นลูกศรสำหรับเปิดเผยเป็นต้น) อุปกรณ์เหล่านั้นจะปรากฏเป็นสีขาวดังนั้นคุณอาจต้องหมุนเวอร์ชันที่กำหนดเอง


108
เช่น myCell.contentView.backgroundColor = [UIColor greenColor];
JoBu1324

1
คำตอบของ vlado.grigorov มีความยืดหยุ่นมากขึ้น - ดูคำตอบของ William Denniss
JoBu1324

3
ลิงค์ใด ๆ เกี่ยวกับวิธีการม้วนของตัวเองUITableViewCellAccessoryCheckmarkเช่น? ขอบคุณ
Dan Rosenstark

6
หากต้องการดูบางครั้งคุณต้องตั้งค่า:cell.textLabel.backgroundColor = [UIColor clearColor];
Evan Moran

205

นี่เป็นวิธีที่มีประสิทธิภาพที่สุดที่ฉันได้พบเพื่อแก้ปัญหานี้ให้ใช้วิธีมอบหมาย willDisplayCell (ซึ่งจะดูแลสีขาวสำหรับพื้นหลังป้ายข้อความด้วยเช่นกันเมื่อใช้ cell.textLabel.text และ / หรือ cell.detailTextLabel.text ):

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { ... }

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

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

ดังนั้นภายในเนื้อความของวิธีการมอบหมายเซลล์เพิ่มรหัสต่อไปนี้เพื่อสลับสีของเซลล์หรือเพียงใช้การเรียกใช้ฟังก์ชันเพื่อทำให้เซลล์ทั้งหมดของตารางมีสีเดียวกัน

if (indexPath.row % 2)
{
    [cell setBackgroundColor:[UIColor colorWithRed:.8 green:.8 blue:1 alpha:1]];
}
else [cell setBackgroundColor:[UIColor clearColor]];

โซลูชันนี้ทำงานได้ดีในสถานการณ์ของฉัน ...


นี่เป็นวิธีการแก้ปัญหาที่สะอาดกว่า โซลูชันอื่น ๆ ส่วนใหญ่ต้องการ subclassing UITableViewCell โซลูชันของ vlado.grigorov ใช้ไม่ได้สำหรับฉัน
Ronnie Liew

แน่นอนและนี่คือวิธีที่ Apple แนะนำเองตามการนำเสนอ WWDC ที่ฉันได้เห็น
Mike Weller

ดี - ยกเว้นเมื่อคุณต้องการเพิ่มแถวใหม่ที่ด้านบนของรายการ วิธีนี้ทำให้การเพิ่มสีทั้งหมดเป็นแบบเดียวกัน การรีเฟรชแก้ไขได้ แต่ใช้เวลาไม่จำเป็น พบเมื่อวานนี้ ...
JOM

ดูเหมือนว่าจะทำงานได้ดียกเว้นเมื่อใช้ Core Data เซลล์ใหม่ที่เพิ่มผ่าน NSFetchedResultsController ดูเหมือนจะไม่เรียก willDisplayCell อย่างถูกต้อง ฉันที่สูญเสียทำให้มันทำงาน ...
radven

เส้นที่เทียบเท่าสำหรับการตั้งค่าสีพื้นหลังใน Swift 2.0:cell.backgroundColor = UIColor.clearColor
kbpontius

104

มันง่ายมากเนื่องจาก OS 3.0 เพิ่งตั้งค่าสีพื้นหลังของเซลล์ในเมธอด willDisplayCell คุณต้องไม่ตั้งค่าสีใน cellForRowAtIndexPath

ใช้ได้ทั้งสไตล์ธรรมดาและจัดกลุ่ม:

รหัส:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    cell.backgroundColor = [UIColor redColor];
}

PS: นี่คือเอกสารแยกสำหรับ willDisplayCell:

"มุมมองตารางจะส่งข้อความนี้ไปยังผู้รับมอบสิทธิ์ก่อนที่จะใช้เซลล์เพื่อวาดแถวดังนั้นจึงอนุญาตให้ผู้รับมอบสิทธิ์ปรับแต่งวัตถุเซลล์ก่อนที่จะแสดงวิธีการนี้เปิดโอกาสให้ผู้ได้รับมอบหมายแทนที่คุณสมบัติของรัฐที่ตั้งไว้ก่อนหน้านี้ มุมมองตารางเช่นการเลือกและสีพื้นหลังหลังจากผู้ร่วมประชุมส่งคืนมุมมองตารางจะตั้งค่าคุณสมบัติอัลฟาและเฟรมเท่านั้นและเมื่อเคลื่อนไหวแถวเมื่อเลื่อนเข้าหรือออกเท่านั้น "

ฉันได้พบข้อมูลนี้ในโพสต์นี้จาก colionel ขอบคุณเขา!


3
ควรทำเครื่องหมายเป็นคำตอบที่ถูกต้องเนื่องจากคุณไม่ต้องทำอะไรเลยหากคุณมีการเปิดเผยผู้ตรวจสอบ
Ashish Awaghad

1
สิ่งนี้ไม่ทำงานหากคุณต้องการสีพื้นหลังของเซลล์ที่แตกต่างกันไปยังพื้นหลังของมุมมองตารางสำหรับฉัน
Chris

สำหรับเซลล์กลุ่มคุณสามารถตั้งค่าไว้ที่ cellForRow
Sharen Eayrs

58

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

นี่คือตัวอย่างที่พื้นหลังของเซลล์เป็นสีเหลือง panted:

UIView* backgroundView = [ [ [ UIView alloc ] initWithFrame:CGRectZero ] autorelease ];
backgroundView.backgroundColor = [ UIColor yellowColor ];
cell.backgroundView = backgroundView;
for ( UIView* view in cell.contentView.subviews ) 
{
    view.backgroundColor = [ UIColor clearColor ];
}

1
หากคุณทำเช่นนี้ตรวจสอบให้แน่ใจว่าตั้งค่าคุณสมบัติทึบแสงเป็นไม่เช่นกัน
Lily Ballard

11
ไม่แนะนำให้ใช้การควบคุมเซลล์แบบโปร่งใส ประสิทธิภาพการเลื่อนจะได้รับผลกระทบมากมายซึ่งเป็นเหตุผลว่า Apple มักจะใช้ตัวควบคุมทึบแสง
Mike Weller

3
บน iOS 4.2 ขึ้นไปดูเหมือนว่าลูปไม่จำเป็นอีกต่อไป
Frank Schmitt

ดีมาก. ทำงานได้สมบูรณ์แบบเมื่อใช้มุมมองอุปกรณ์เสริม !!
RyanG

19

ใส่สิ่งนี้ไว้ในไฟล์คลาส UITableView (.m) ของคุณ:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell  forRowAtIndexPath:(NSIndexPath *)indexPath 
{
    UIColor *color = ((indexPath.row % 2) == 0) ? [UIColor colorWithRed:255.0/255 green:255.0/255 blue:145.0/255 alpha:1] : [UIColor clearColor];
    cell.backgroundColor = color;
}

7

ฉันเห็นด้วยกับ Seba ฉันพยายามตั้งค่าสีแถวสลับในวิธีการมอบสิทธิ์ rowForIndexPath แต่ได้รับผลลัพธ์ที่ไม่สอดคล้องกันระหว่าง 3.2 และ 4.2 ดังต่อไปนี้ใช้งานได้ดีสำหรับฉัน

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {

    if ((indexPath.row % 2) == 1) {
        cell.backgroundColor = UIColorFromRGB(0xEDEDED);
        cell.textLabel.backgroundColor = UIColorFromRGB(0xEDEDED);
        cell.selectionStyle = UITableViewCellSelectionStyleGray;
    }
    else
    {
        cell.backgroundColor = [UIColor whiteColor];
        cell.selectionStyle = UITableViewCellSelectionStyleGray;
    }

}

1
ยังไม่เข้าใจว่าทำไมการตั้งค่าใน willDisplayCell สร้างความแตกต่าง มันถูกเรียกว่าต่อไปไม่ว่าเราจะใช้สิ่งนั้นหรือไม่
Sharen Eayrs

6

หลังจากลองใช้วิธีแก้ไขปัญหาต่าง ๆ ทั้งหมดแล้ววิธีการต่อไปนี้เป็นวิธีที่ดีที่สุด เปลี่ยนสีในวิธีการมอบสิทธิ์ต่อไปนี้:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (...){
        cell.backgroundColor = [UIColor blueColor];
    } else {
        cell.backgroundColor = [UIColor whiteColor];
    }
}

4

vlado.grigorov มีคำแนะนำที่ดี - วิธีที่ดีที่สุดคือการสร้าง backgroundView และให้สีที่ตั้งค่าทุกอย่างอื่นให้กับ clearColor นอกจากนี้ฉันคิดว่าวิธีนี้เป็นวิธีเดียวในการล้างสีอย่างถูกต้อง (ลองใช้ตัวอย่างของเขา - แต่ตั้งค่า 'clearColor' แทน 'yellowColor') ซึ่งเป็นสิ่งที่ฉันพยายามทำ


ข้อดีของวิธีนี้คือคุณสามารถคงสีของคุณสมบัติเวลาการออกแบบไว้ในตัวสร้างส่วนต่อประสาน ปัญหาการออกแบบน้อยหนึ่งที่ต้องมีการโต้ตอบของนักพัฒนา
แลนด์

1
cell.backgroundView = [[[UIView alloc] initWithFrame: cell.bounds] autorelease]; cell.backgroundView.backgroundColor = [UIColor redColor];
Brian

3

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

เหตุผลก็คือเซลล์ครอบคลุมความกว้างของมุมมองจริง มุมโค้งมนเป็นเพียงส่วนหนึ่งของรูปแบบการวาดและมุมมองเนื้อหาอยู่ในพื้นที่นี้

หากคุณเปลี่ยนสีของเซลล์เนื้อหาคุณจะพบจุดสีขาวที่มุม หากคุณเปลี่ยนสีของเซลล์ทั้งหมดคุณจะมีบล็อกสีที่ทอดยาวตามความกว้างของมุมมอง

คุณสามารถปรับแต่งเซลล์ได้อย่างแน่นอน แต่มันไม่ง่ายอย่างที่คิดในตอนแรก


1
นี่เป็นเรื่องจริงสำหรับเซลล์ในตารางที่จัดกลุ่ม แต่ตารางธรรมดาไม่มีอะไรให้กังวลมากนัก เซลล์ที่ไม่มีการตกแต่งที่ไม่มีอุปกรณ์เสริมควรดูดี
Ben Gottlieb

เบ็น - จุดดี ฉันใช้ตารางที่จัดกลุ่มเป็นหลัก แต่อย่างที่คุณพูดถึงตารางธรรมดาไม่ประสบปัญหาใด ๆ เหล่านี้
Andrew Grant

3

สร้างมุมมองและตั้งค่านี้เป็นมุมมองพื้นหลังของเซลล์

UIView *lab = [[UIView alloc] initWithFrame:cell.frame];
            [lab setBackgroundColor:[UIColor grayColor]];
            cell.backgroundView = lab;
            [lab release];

3

หากต้องการขยายคำตอบของ N.Berendt - หากคุณต้องการตั้งค่าสีของเซลล์ตามสถานะบางอย่างในวัตถุข้อมูลเซลล์จริงในขณะที่คุณกำหนดค่าข้อมูลส่วนที่เหลือสำหรับเซลล์ตารางซึ่งโดยทั่วไปจะเป็นเมื่อคุณอยู่ใน วิธี cellForRowAtIndexPath คุณสามารถทำได้โดยการแทนที่เมธอด willDisplayCell เพื่อตั้งค่าสีพื้นหลังของเซลล์จากสีพื้นหลังของมุมมองเนื้อหา - สิ่งนี้ทำให้เกิดปัญหาเกี่ยวกับพื้นหลังของปุ่มเปิดเผยเป็นต้นซึ่งไม่ถูกต้อง แต่ยังช่วยให้คุณสามารถควบคุมสีใน cellForRowAtIndexPath ที่ที่คุณทำการปรับแต่งเซลล์อื่น ๆ ทั้งหมดของคุณ

ดังนั้น: หากคุณเพิ่มวิธีนี้ในการมอบหมายมุมมองตาราง:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    cell.backgroundColor = cell.contentView.backgroundColor;
}

จากนั้นในวิธี cellForRowAtIndexPath ของคุณคุณสามารถทำได้:

if (myCellDataObject.hasSomeStateThatMeansItShouldShowAsBlue) {
    cell.contentView.backgroundColor = [UIColor blueColor];
}

สิ่งนี้จะช่วยประหยัดไม่ต้องดึงวัตถุข้อมูลของคุณอีกครั้งในวิธี willDisplayCell และยังช่วยให้มีสองสถานที่ที่คุณทำการปรับแต่ง / ปรับแต่งเซลล์ตารางของคุณ - การปรับแต่งทั้งหมดสามารถไปในวิธี cellForRowAtIndexPath


3

สร้างภาพเพื่อใช้เป็นพื้นหลังด้วย Photoshop หรือ gimp แล้วตั้งชื่อว่า myimage จากนั้นเพิ่มเมธอดนี้ในคลาส tableViewController ของคุณ:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    UIImage *cellImage = [UIImage imageNamed:@"myimage.png"];//myimage is a 20x50 px with  gradient  color created with gimp
    UIImageView *cellView = [[UIImageView alloc] initWithImage:cellImage];
    cellView.contentMode = UIContentViewModeScaleToFill;
    cell.backgroundView = cellView;
    //set the background label to clear
    cell.titleLabel.backgroundColor= [UIColor clearColor];
}

สิ่งนี้จะใช้งานได้หากคุณตั้งค่า UITableView เป็นกำหนดเองในตัวตรวจสอบแอตทริบิวต์


2

โซลูชันของฉันคือการเพิ่มรหัสต่อไปนี้ไปยังเหตุการณ์ cellForRowAtIndexPath:

UIView *solidColor = [cell viewWithTag:100];
if (!solidColor) {

    solidColor = [[UIView alloc] initWithFrame:cell.bounds];
    solidColor.tag = 100; //Big tag to access the view afterwards
    [cell addSubview:solidColor];
    [cell sendSubviewToBack:solidColor];
    [solidColor release];
}
solidColor.backgroundColor = [UIColor colorWithRed:254.0/255.0
                                             green:233.0/255.0
                                              blue:233.0/255.0
                                             alpha:1.0];

ทำงานภายใต้สถานการณ์ใด ๆ แม้จะมีปุ่มเปิดเผยและดีกว่าสำหรับตรรกะของคุณที่จะดำเนินการกับสถานะสีของเซลล์ใน cellForRowAtIndexPath กว่าในเหตุการณ์ cellWillShow ฉันคิดว่า


1

คลาสย่อย UITableViewCell และเพิ่มสิ่งนี้ในการนำไปใช้:

-(void)layoutSubviews
{
    [super layoutSubviews];
    self.backgroundColor = [UIColor blueColor];
}

1
    UIView *bg = [[UIView alloc] initWithFrame:cell.frame];
    bg.backgroundColor = [UIColor colorWithRed:175.0/255.0 green:220.0/255.0 blue:186.0/255.0 alpha:1]; 
    cell.backgroundView = bg;
    [bg release];

1

สิ่งนี้จะทำงานใน Xcode ล่าสุด

-(UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath {
    cell.backgroundColor = [UIColor grayColor];
}

0

ลองสิ่งนี้:

- (void)tableView:(UITableView *)tableView1 willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [cell setBackgroundColor:[UIColor clearColor]];
    tableView1.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: @"Cream.jpg"]];
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.