จะเปลี่ยนสีไฮไลต์สีน้ำเงินของ UITableViewCell ได้อย่างไร?


131

ฉันสงสัยว่าจะเปลี่ยนสีน้ำเงินไฮไลต์ / สีการเลือกของ a UITableViewCellมีความคิดอย่างไร?

คำตอบ:


213

คุณสามารถเปลี่ยนสีไฮไลต์ได้หลายวิธี

  1. เปลี่ยนคุณสมบัติ selectionStyle ของเซลล์ของคุณ หากเปลี่ยนUITableViewCellSelectionStyleGrayเป็นสีจะเป็นสีเทา

  2. เปลี่ยนselectedBackgroundViewคุณสมบัติ จริงๆแล้วสิ่งที่สร้างการไล่ระดับสีน้ำเงินคือมุมมอง คุณสามารถสร้างมุมมองและวาดสิ่งที่คุณต้องการและใช้มุมมองเป็นพื้นหลังของเซลล์มุมมองตารางของคุณ


8
เจ๋งพบคำอธิบายและตัวอย่างที่ดีที่นี่: cocoawithlove.com/2009/04/easy-custom-uitableview-drawing.html
Thomas Joos

1
ฉันตระหนักว่าใน IB คุณไม่สามารถตั้งค่า UITableViewCell "Selection" เป็น "None" ได้ - เพราะselectedBackgroundViewจะไม่ปรากฏขึ้นมา หลังจากตั้งค่า "การเลือก" เป็นค่าเริ่มต้นระบบจะselectedBackgroundViewแสดงขึ้น ทดสอบบน iOS 6 และ 7
จอนนี่

12
ขอบคุณสำหรับบันทึกที่ดี! สิ่งนี้ทำให้ง่ายมากในตอนนี้: คุณสร้างมุมมองใหม่ (ไม่จำเป็นต้องระบุเฟรม: cell.selectedBackgroundView = [UIView new];และคุณกำหนดสีที่คุณต้องการ:cell.selectedBackgroundView.backgroundColor = [UIColor colorWithHex:@"ecf2f5" andAlpha:1];
Dannie P

ดูที่ด้านล่างของหน้านี้มีแนวทางล่าสุด
Climbatize

144

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

cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];

    UIView *selectionColor = [[UIView alloc] init];
    selectionColor.backgroundColor = [UIColor colorWithRed:(245/255.0) green:(245/255.0) blue:(245/255.0) alpha:1];
    cell.selectedBackgroundView = selectionColor;
  • เซลล์คือไฟล์ UITableViewCell
  • ฉันสร้าง UIView และตั้งค่าสีพื้นหลังโดยใช้สี RGB (สีเทาอ่อน)
  • จากนั้นฉันตั้งค่าเซลล์selectedBackgroundViewให้เป็นเซลล์UIViewที่ฉันสร้างขึ้นด้วยสีพื้นหลังที่ฉันเลือก

นี้ทำงานได้ดีสำหรับฉัน. ขอบคุณสำหรับเคล็ดลับ Zonble


2
สิ่งนี้ใช้ได้ไม่ดีนักเมื่อใช้มุมมองตารางกับส่วนต่างๆ เมื่อเลือกเซลล์จะสูญเสียเส้นขอบและจะไม่ถูกปัดเศษเมื่อเซลล์แรกหรือเซลล์สุดท้าย
Kirk Woll

7
@kirk คุณหมายถึงจัดกลุ่ม :)
Tieme

@Tieme ไม่ฉันหมายถึงส่วน : "มุมมองตารางประกอบด้วยศูนย์หรือมากกว่าส่วนแต่ละส่วนมีแถวของตัวเอง"
Kirk Woll

คุณต้องวางไว้ใน 'cellForRowAtIndexPath' ทำงานได้ดีสำหรับฉันโดยมีส่วนเดียว ไม่ได้ลองใช้กับหลายส่วน
Vincent

เกมช้าไปหน่อย แต่ฉันสามารถยืนยันได้ว่ามันใช้งานได้ในมุมมองตารางที่มีหลายส่วน (ไม่รวมกลุ่ม)
matto0

30

UITableViewCell มีรูปแบบการเลือกเริ่มต้นสามแบบ: -

  1. สีน้ำเงิน
  2. สีเทา
  3. ไม่มี

การดำเนินการมีดังนี้: -

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

     [cell setSelectionStyle:UITableViewCellSelectionStyleNone];       
}

7
แทนที่จะเป็นสไตล์เริ่มต้นทั้งสามนี้เรายังสามารถปรับแต่งสำหรับสไตล์ที่เราคาดหวังได้ด้วยคุณสมบัติที่เลือก
Sunil Targe

ทำงานให้ฉัน ... ขอบคุณมาก
Mujeeb Farooqi

19

ใน Swift ให้ใช้สิ่งนี้ใน cellForRowAtIndexPath

let selectedView = UIView()
selectedView.backgroundColor = .white
cell.selectedBackgroundView = selectedView

หากคุณต้องการเลือกสีของคุณจะเหมือนกันในทุก ๆใช้นี้UITableViewCellAppDelegate

let selectedView = UIView()
selectedView.backgroundColor = .white
UITableViewCell.appearance().selectedBackgroundView = selectedView

18

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

class AppDelegate: UIResponder, UIApplicationDelegate {

    //... truncated

   func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {

        // set up your background color view
        let colorView = UIView()
        colorView.backgroundColor = UIColor.yellowColor()

        // use UITableViewCell.appearance() to configure 
        // the default appearance of all UITableViewCells in your app
        UITableViewCell.appearance().selectedBackgroundView = colorView

        return true
    }

    //... truncated
}

สมบูรณ์ มีความคิดอย่างไรในการตั้งค่าสีข้อความของเซลล์เริ่มต้นนั้นทั่วโลกเมื่อเลือก
BananaAcid

1
วิธีนี้ใช้งานได้ แต่การเลือกจะถูกล้างโดยตรงเมื่อกดตัวควบคุมมุมมองใหม่
bobmoff

วิธีที่ดีในการเปลี่ยนแปลงทั่วโลกกับ UITableViewCell
Shashi3456643

12

เพื่อความสมบูรณ์: หากคุณสร้างคลาสย่อยของUITableViewCellคุณเองคุณสามารถใช้- (void)setSelected:(BOOL)selected animated:(BOOL)animatedวิธีการและตั้งค่าสีพื้นหลังของมุมมองบางส่วนที่คุณเพิ่มในมุมมองเนื้อหา (หากเป็นเช่นนั้น) หรือของ contentView เอง (หากไม่ครอบคลุมมุมมองของคุณเอง

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    if(selected) {
        self.contentView.backgroundColor = UIColor.blueColor;
    } else {
        self.contentView.backgroundColor = UIColor.whiteColor;
    }
}

(ไม่ได้ใช้? เพื่อให้พอดีกับความกว้างเล็ก ๆ ของรหัสแหล่งที่มา DIV :)

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


สิ่งนี้ใช้ได้เฉพาะหลังจากกำหนดมุมมองใหม่ให้กับselectedBackgroundView ที่จุดเริ่มต้นของวิธีการเพิ่มself. selectedBackgroundView = [UIView new];
enadun

@enadun วิธีนี้ใช้ได้กับฉันบน iOS 12 โดยไม่มีการตั้งค่าselectedBackgroundViewคุณสมบัติเลย
เนท

11

ฉันต้องตั้งค่ารูปแบบการเลือกเพื่อUITableViewCellSelectionStyleDefaultให้สีพื้นหลังที่กำหนดเองทำงานได้ หากมีลักษณะอื่นสีพื้นหลังที่กำหนดเองจะถูกละเว้น ทดสอบบน iOS 8

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

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

6

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

@IBDesignable extension UITableViewCell {
    @IBInspectable var selectedColor: UIColor? {
        set {
            if let color = newValue {
                selectedBackgroundView = UIView()
                selectedBackgroundView!.backgroundColor = color
            } else {
                selectedBackgroundView = nil
            }
        }
        get {
            return selectedBackgroundView?.backgroundColor
        }
    }
}

สีการเลือก UITableViewCell ในสตอรี่บอร์ด


5
@IBDesignable class UIDesignableTableViewCell: UITableViewCell {
  @IBInspectable var selectedColor: UIColor = UIColor.clearColor() {
    didSet {
      selectedBackgroundView = UIView()
      selectedBackgroundView?.backgroundColor = selectedColor
    }
  }
}

ในกระดานเรื่องราวของคุณตั้งค่าคลาสของ UITableViewCell ของคุณเป็น UIDesignableTableViewCell บนตัวตรวจสอบคุณสมบัติคุณสามารถเปลี่ยนสีที่เลือกของเซลล์ของคุณเป็นสีใดก็ได้

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

นี่คือลักษณะของตัวตรวจสอบแอตทริบิวต์ของคุณ


สร้างสรรค์มาก! ที่ดี!
Kaushil Ruparelia

คุณสามารถทำให้ง่ายยิ่งขึ้นดูคำตอบของฉัน) stackoverflow.com/a/51764804/537694
Climbatize

ฉันใช้เซลล์ที่กำหนดเองเพื่อตั้งค่าป้ายกำกับดังนั้นจึงทำงานได้ดีขอบคุณ! เปลี่ยนสำหรับสวิฟท์ที่ 5: ตอนนี้มันไม่ได้UIColor.clear UIColor.clearColor()ไม่แน่ใจว่านั่นเป็นการเปลี่ยนแปลงใน Swift ด้วยหรือไม่ แต่ก็ใช้ได้@IBDesignableเช่นกัน
Neph

5

สวิฟต์ 3.0 / 4.0

หากคุณสร้างเซลล์ที่กำหนดเองคุณสามารถเปลี่ยนสีการเลือกawakeFromNib()สำหรับเซลล์ทั้งหมดได้:

 override func awakeFromNib() {
    super.awakeFromNib()

    let colorView = UIView()
    colorView.backgroundColor = UIColor.orange.withAlphaComponent(0.4)

    self.selectedBackgroundView = colorView


}

0

1- เพิ่มมุมมองในมุมมองเนื้อหาของเซลล์ของคุณ
2- คลิกขวาที่เซลล์ของคุณ
3- ทำให้มุมมองที่เพิ่มเป็น "selectedBackgroundView" ป้อนคำอธิบายภาพที่นี่

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