UITableView Cell เลือกสีหรือไม่


319

ฉันสร้างที่กำหนดเองUITableViewCellแล้ว มุมมองตารางแสดงข้อมูลได้ดี สิ่งที่ฉันติดอยู่คือเมื่อผู้ใช้แตะที่เซลล์ของ tableview จากนั้นฉันต้องการแสดงสีพื้นหลังของเซลล์อื่นนอกเหนือจากค่า [สีฟ้า] เริ่มต้นสำหรับการเน้นการเลือกเซลล์ ฉันใช้รหัสนี้ แต่ไม่มีอะไรเกิดขึ้น:

cell.selectedBackgroundView.backgroundColor=[UIColor blackColor];

คำตอบ:


365

ฉันคิดว่าคุณกำลังติดตามถูก แต่ตามคำจำกัดความของชั้นสำหรับselectedBackgroundView:

ค่าเริ่มต้นคือศูนย์สำหรับเซลล์ในตารางสไตล์ธรรมดา (UITableViewStylePlain) และไม่ใช่ศูนย์สำหรับตารางกลุ่มส่วน UITableViewStyleGrouped

ดังนั้นถ้าคุณกำลังใช้ตารางธรรมดาสไตล์แล้วคุณจะต้อง alloc-init ใหม่มีสีพื้นหลังที่คุณต้องการและจากนั้นกำหนดให้UIViewselectedBackgroundView

หรือคุณสามารถใช้:

cell.selectionStyle = UITableViewCellSelectionStyleGray;

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


1
คุณสมบัตินี้ยังสามารถตั้งค่าในกระดานเรื่องราวหากคุณต้องการออกจากมุมมองที่เกี่ยวข้องกับมุมมอง
IIllIIll

1
Swift 3 version: cell.selectionStyle = .gray // คุณสามารถใช้. no, .blue หรือ. default
Sébastien REMY

6
คำตอบนี้ค่อนข้างเก่า ... มีการเปลี่ยนแปลงบางอย่างใน iOS รุ่นที่ใหม่กว่าหรือไม่? ฉันมีตารางแบบธรรมดาและ MyBackgroundView ที่เลือกของฉันไม่เป็นศูนย์ การเปลี่ยน backgroundColor ที่น่าสนใจในมุมมองนี้ไม่มีผลใด ๆ แทนฉันต้องแทนที่ UIView ใหม่ด้วย backgroundColor ที่ฉันต้องการเพื่อให้ทำงานได้
ndreisg

คุณเพิ่งช่วยฉันจากการเป็นบ้าอย่างสมบูรณ์ ขอบคุณมาก!
mrwheet

656

ไม่จำเป็นต้องใช้เซลล์ที่กำหนดเอง หากคุณต้องการเปลี่ยนสีที่เลือกของเซลล์คุณสามารถทำได้ดังนี้:

Objective-C:

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

สวิฟท์:

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

47
วิธีนี้ใช้ได้ผล แต่ใน UITableView ที่จัดกลุ่มแล้วมุมมนจะหายไป
David

1
@David cornerRadius = 7 ทำงานที่ใดก็ได้ในมุมมองตารางที่จัดกลุ่มหรือไม่ เกิดอะไรขึ้นถ้าเซลล์อยู่ตรงกลาง ไม่มีเวลาที่จะทดสอบสิ่งนี้
Maciej Swic

2
สำหรับความรวดเร็วเป็นความผิดพลาดเล็กน้อย บรรทัดที่ถูกต้องคือ cell.selectedBackgroundView = bgColorView
John Kakon

13
โปรดทราบว่าเพื่อให้สิ่งนี้ใช้งานได้ใน Storyboard (หรือไฟล์ XIB) คุณต้องเลือกสีพื้นหลังที่เลือกนอกเหนือจากไม่มี ตรงข้ามกับคำตอบที่บอกว่าคุณต้องตั้งค่าเป็นไม่มีก่อนเพื่อให้สามารถใช้งานได้ ด้วยไม่มีมันจะไม่ทำงาน ทำให้ฉันเป็นบ้าจนกระทั่งฉันคิดออก ขอบคุณ
kakubei

1
คุณจะทำให้มันทำงานอย่างไรเมื่อคุณใช้กระดานเรื่องราวด้วย?
จอห์น

42

Table View สีพื้นหลังการเลือกเซลล์สามารถตั้งค่าผ่าน Storyboard ใน Interface Builder:

สีการเลือกเซลล์มุมมองตาราง


1
ฉันคิดว่าเราไม่สามารถกำหนดสีที่กำหนดเองได้จากกระดานเรื่องราว จำเป็นต้องตั้งโปรแกรม
pallavi

37

หากคุณมีตารางที่จัดกลุ่มซึ่งมีเพียงเซลล์เดียวต่อส่วนให้เพิ่มบรรทัดพิเศษนี้ในโค้ด: bgColorView.layer.cornerRadius = 10;

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

อย่าลืมนำเข้า QuartzCore


28

Swift 3: สำหรับฉันมันใช้งานได้เมื่อคุณใส่ในcellForRowAtIndexPath:วิธีการ

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

6
ฉันคิดว่าสถานที่ที่ดีกว่าที่จะวางawakeFromNib()วิธีนี้คือ(ในกรณีของเซลล์ที่กำหนดเอง)
LembergSun

22

การทำงานต่อไปนี้สำหรับฉันใน iOS 8

ฉันต้องตั้งค่ารูปแบบการเลือกเพื่อUITableViewCellSelectionStyleDefaultให้สีพื้นหลังแบบกำหนดเองทำงานได้ หากรูปแบบอื่น ๆ สีพื้นหลังที่กำหนดเองจะถูกละเว้น ดูเหมือนจะมีการเปลี่ยนแปลงในพฤติกรรมเป็นคำตอบก่อนหน้านี้ต้องกำหนดสไตล์ให้ไม่มีใครแทน

รหัสเต็มสำหรับเซลล์ดังนี้:

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

รหัสนี้มีหน่วยความจำรั่ว การ "จัดสรร" หรือการสร้างวัตถุใด ๆ จะต้องอยู่ในบล็อก (เซลล์ == nil) {} หรือมุมมองจะถูกสร้างขึ้นทุกครั้งที่เซลล์เปิดตัวโดย iOS
GeneCode

18

สร้างเซลล์ที่กำหนดเองสำหรับเซลล์ตารางของคุณและในเซลล์ที่กำหนดเอง class.m ใส่รหัสด้านล่างมันจะทำงานได้ดี คุณต้องวางภาพสีที่ต้องการใน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
ฉันคิดว่านี่อาจเป็นหน่วยความจำที่มีประสิทธิภาพมากกว่าการตั้งค่า SelectedBackgroundView เมื่อเริ่มต้นเซลล์โดยสร้างมุมมอง bg เมื่อเลือกเซลล์เดียวเท่านั้น
dotslashlu

11

ส่วนขยาย 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
เพิ่ม IBDesignable และ IBInspectable
Michał Ziobro

1
@ MichałZiobroเพียงเพิ่ม@IBInspectablevar ถ้าคุณต้องการ @IBDesignableไม่มีประโยชน์สำหรับสิ่งนี้
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];
}

เราจำเป็นต้องตั้งค่ามุมมองพื้นหลังที่เลือกในวิธีนี้


8

หากคุณต้องการเพิ่มสีที่เน้นสีที่กำหนดเองไปยังเซลล์ของคุณ (และเซลล์ของคุณมีปุ่ม, ป้าย, รูปภาพ, ฯลฯ .. ) ฉันทำตามขั้นตอนต่อไป:

ตัวอย่างเช่นหากคุณต้องการสีเหลืองที่เลือก:

1) สร้างมุมมองที่เหมาะกับเซลล์ทั้งหมดที่มีความทึบแสง 20% (มีสีเหลือง) เรียกว่าตัวอย่างเช่น backgroundelectedView

2) ในตัวควบคุมเซลล์เขียนสิ่งนี้:

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

ใน Swift 4 คุณสามารถตั้งค่าสีพื้นหลังของเซลล์ตารางของคุณได้ทั่วโลก (จากที่นี่ ):

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

6

หากคุณใช้ TableViewCell ที่กำหนดเองคุณสามารถแทนที่awakeFromNib:

override func awakeFromNib() {
    super.awakeFromNib()

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

1
ทางออกที่ดี! ขอบคุณ
Thomás Calmon

ฉันมีมุมมองแบบโต๊ะธรรมดาที่มีเซลล์ไม่เกิน 10 เซลล์มันใช้งานได้ดีมากจนถึงตอนนี้
code4latte

5

อีกหนึ่งเคล็ดลับเกี่ยวกับวิธีของคริสเตียนในการแสดงพื้นหลังมุมโค้งมนสำหรับตารางที่จัดกลุ่ม

ถ้าฉันใช้cornerRadius = 10เซลล์มันจะแสดงพื้นหลังการเลือกแบบกลมของมุมทั้งสี่ มันไม่เหมือนกันกับ UI เริ่มต้นของมุมมองตาราง

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

ผมทดสอบรหัสนี้กับ splitterviewiPad คุณสามารถเปลี่ยนตำแหน่งเฟรม patchLayer ได้ตามต้องการ

โปรดแจ้งให้เราทราบหากมีวิธีที่ง่ายกว่าในการบรรลุผลลัพธ์เดียวกัน

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

ฉันต้องการทราบว่าตัวแก้ไข XIB เสนอตัวเลือกมาตรฐานต่อไปนี้ให้คุณ:

ส่วน: สีน้ำเงิน / สีเทา / ไม่มี

(คอลัมน์ขวามือพร้อมตัวเลือกแท็บที่ 4 กลุ่มแรก "เซลล์มุมมองตาราง" กลุ่มย่อยที่ 4 รายการที่ 1 จาก 3 รายการอ่าน "การเลือก")

อาจเป็นสิ่งที่คุณต้องการจะทำได้โดยการเลือกตัวเลือกมาตรฐานที่เหมาะสม


คุณถูก. เนื่องจากหากคุณทำเช่นนั้นคุณสามารถเปลี่ยนสีการเลือกได้ง่ายๆใน "cellForRowAtIndexPath" โดยการเพิ่ม: UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: @ "Cell"]; cell.selectedBackgroundView = [[UIView alloc] initWithFrame: CGRectZero]; cell.selectedBackgroundView.backgroundColor = [UIColor colorWithRed: (255/255) สีเขียว: (0/255) สีน้ำเงิน: (0/255) อัลฟา: 0.1];
user8675

ขอขอบคุณ! วิธีเดินทาง
Fattie

3

ตามสีที่กำหนดเองสำหรับเซลล์ที่เลือกในUITableViewการแก้ปัญหาที่ดีตามคำตอบของ Maciej Swic

เพียงเพิ่มไปยังที่คุณประกาศคำตอบของ Swic ในการกำหนดค่าเซลล์มักจะอยู่ภายใต้:

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

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

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

}

แจ้งให้เราทราบว่าเหมาะกับคุณเช่นกัน คุณสามารถยุ่งกับcornerRadiusจำนวนผลกระทบที่มุมของเซลล์ที่เลือก


3

ฉันมีวิธีการที่แตกต่างกันเล็กน้อยกว่าคนอื่น ๆ ที่สะท้อนถึงการเลือกแบบสัมผัสมากกว่าหลังจากถูกเลือก ฉันมี UITableViewCell แบบ subclassed สิ่งที่คุณต้องทำคือตั้งค่าสีพื้นหลังในเหตุการณ์การสัมผัสซึ่งจำลองการเลือกเมื่อสัมผัสจากนั้นตั้งค่าสีพื้นหลังในฟังก์ชั่น setSelected การตั้งค่าสีพื้นหลังในฟังก์ชัน selSelected ช่วยให้สามารถยกเลิกการเลือกเซลล์ได้ ตรวจสอบให้แน่ใจว่าได้ส่งเหตุการณ์การสัมผัสไปยังซุปเปอร์มิฉะนั้นเซลล์จะไม่ทำหน้าที่เสมือนว่ามันถูกเลือก

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

วิธีเพิ่มพื้นหลังสำหรับทุกเซลล์ (ใช้คำตอบของ 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

เพื่อแทนที่UITableViewCell's setSelectedยังทำงาน

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

สำหรับผู้ที่ต้องการกำจัดพื้นหลังสีเทาที่เลือกไว้เป็นค่าเริ่มต้นให้วางโค้ดบรรทัดนี้ลงใน cellForRowAtIndexPath func ของคุณ:

yourCell.selectionStyle = .None

1
ขอบคุณมากนี่เป็นคำตอบที่ถูกสำหรับฉันไม่ใช่คนอื่น
DeyaEldeen

วิธีการตั้งค่าสีเช่น "สีเขียว" แทนการตั้งค่าไม่มีหรือสีน้ำเงินหรือสีเทา
Satyam

2

สำหรับ Swift 3.0:

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

    cell.contentView.backgroundColor = UIColor.red
}

ดี แต่จะใช้ได้เฉพาะเมื่อผู้ใช้เลือกบางสิ่ง (สีการเลือกเริ่มต้นจะยังคงอยู่ในช่วงเริ่มต้น)
Konstantin Salavatov

2

ฉันใช้วิธีการด้านล่างและทำงานได้ดีสำหรับฉัน

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+:

เพิ่มบรรทัดต่อไปนี้ในเซลล์ตารางของคุณ

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

ในที่สุดมันควรจะเป็นด้านล่าง

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

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

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

ในกรณีของระดับเซลล์ที่กำหนดเอง เพียงแทนที่:

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

เป็นเรื่องง่ายเมื่อสไตล์การดูตารางเป็นแบบเรียบง่าย แต่ในสไตล์กลุ่มมันเป็นปัญหาเล็กน้อยฉันแก้ไขโดย:

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;

สังเกต kGroupTableViewCellWidth ฉันกำหนดเป็น 300 มันคือความกว้างของความกว้างของเซลล์มุมมองตารางกลุ่มใน iPhone


0
[cell setSelectionStyle:UITableViewCellSelectionStyleGray];

ตรวจสอบให้แน่ใจว่าคุณใช้บรรทัดด้านบนเพื่อใช้เอฟเฟกต์การเลือก


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
}

โปรดเพิ่มคำอธิบายของคำตอบของคุณเพื่อให้สามารถอ่านได้สำหรับผู้อ่านในอนาคต
techspider

0

ฉันใช้ iOS 9.3 และการตั้งค่าสีผ่านกระดานเรื่องราวหรือการตั้งค่าcell.selectionStyleไม่ได้ผลสำหรับฉัน แต่รหัสด้านล่างใช้งานได้:

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;

ผมพบว่าการแก้ปัญหานี้ที่นี่


0

ลองใช้รหัสต่อไปนี้

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

// เวอร์ชันสวิฟท์:

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

ในการเปลี่ยนพื้นหลังการเลือกสีเป็น anyColour ให้ใช้ Swift Extension

สร้างส่วนขยายของเซลล์ UITableView ดังต่อไปนี้

extension UITableViewCell{

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

}

จากนั้นเรียกremoveCellSelectionColour ()ด้วยอินสแตนซ์ของเซลล์

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