कस्टम UITableViewCell चयन शैली?


82

जब मैं अपने पर क्लिक करता हूं UITableViewCell, तो सेल पर क्लिक करने पर बैकग्राउंड भाग (मेरी पृष्ठभूमि इमेज कवर नहीं करने वाले क्षेत्र) नीला हो जाता है। इसके अलावा, UILabelसेल के सभी s सफेद होने पर मुड़ जाते हैं जब इसे क्लिक किया जाता है जो मुझे चाहिए।

हालाँकि जो मैं नहीं चाहता वह नीली पृष्ठभूमि है जब मैं इसे क्लिक करता हूं लेकिन अगर मैं करता हूं selectionstylenone, तो मैं UILabelसेल में हाइलाइट किए गए रंगों को खो देता हूं ।

तो क्या सेल को क्लिक करने के बाद नीले रंग की पृष्ठभूमि से छुटकारा पाने का कोई तरीका है लेकिन हाइलाइट किए गए रंगों को रखने के लिए UILabel?


जवाबों:


174

आप इस प्रकार कर सकते हैं। अपनी तालिका सेल की चयन शैली सेट करें UITableViewCellSelectionStyleNone। यह नीले रंग की पृष्ठभूमि को उजागर करेगा। फिर, टेक्स्ट लेबल को हाइलाइट करने के लिए, यूआईटेबल व्यूसेल क्लास का उपयोग करने के बजाय, जिस तरह से आप चाहते हैं, उस तरह से काम UITableViewCellकरने के लिए setHighlighted:animated, अपने स्वयं के क्रियान्वयन के साथ डिफ़ॉल्ट कार्यान्वयन को ओवरक्लॉज़ करें और लेबल किए गए रंगों को सेट करें जो कि आप हाइलाइट की गई अवस्था के आधार पर चाहते हैं। ।

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{
    if (highlighted) {
        self.textLabel.textColor = [UIColor whiteColor];
    } else {
        self.textLabel.textColor = [UIColor blackColor];
    }
}

11
एक साइड नोट के रूप में, सुनिश्चित करें कि आप ओवरराइड करते हैं setHighlighted:animated:, जो animatedपैरामीटर लेता है । एक पैरामीटर setHighlighted:पद्धति को ओवरराइड करने से काम नहीं चलेगा।
इमर केलनेई

14
क्या हमें फोन करना चाहिए [super setHighlighted:highlighted animated:animated];?
सॉफ्टडिजेनर

आपका बहुत बहुत धन्यवाद! एक जादू की तरह काम करता है! और यह मुझे सेल में एक और कस्टम विचार हाइलाइट करने पर नियंत्रण देता है यदि मैं चाहता हूं, क्योंकि मानक हाइलाइटिंग अजीब कर रहा है।
imike

2
लेकिन इस विधि में एक समस्या है जब आप ओवरराइड करते हैं setHighlightedऔर setSelected। पहले आप एक सेल का चयन करें, ठीक है टेक्स्टक्लोर्न को सफेद रंग में बदलें, फिर आप उस सेल को अपनी स्क्रीन के दृश्य भाग से स्क्रॉल करें, फिर वापस स्क्रॉल करें, देखें, टेक्स्टरेल काला हो जाता है
रॉनन

1
@ जोंक्रोल मैं अवधारणा को समझ गया, लेकिन मेरी आवश्यकता यह है कि जब एक सेल का चयन किया जा रहा है, तो उस सेल के टेक्स्टलैब का रंग चयनित रंग के रूप में रहना चाहिए, अभी यह सिर्फ टेक्स्टलेबेल का रंग बदल रहा है, जबकि चयन, उसके बाद चयनित टेक्स्टलैब मूल रंग में रहता है
समर्थ केजरीवाल

75

यदि iOS7 से पहले काम कर रहे हैं, तो अपनी सेल चयन शैली को कोई भी न बनाएं

cell.selectionStyle = UITableViewCellSelectionStyleNone;

और, इसे छोड़ दो UITableViewCellSelectionStyleDefault

फिर:

UIView *selectedView = [[UIView alloc]init];
selectedView.backgroundColor = [UIColor redColor];
cell.selectedBackgroundView =  selectedView;

यह कोड ठीक से काम करेगा


2
@iBradApps ... यहां आप कोई कस्टम क्लास नहीं बना रहे हैं ... यूआई टेबलव्यू सेल की
अल्फा

2
इसे एक उत्थान देते हुए - यह एकमात्र समाधान है जो मेरे लिए iOS 7. में चयनित सेल के गैर-पाठ रंग को बदलने के लिए काम करता है
Vern Jensen

1
चयन
शैली

12
यह समाधान iOS7 पर काम करता है, लेकिन मैं चयन करने के बाद ही USableViewCellStyleDefault पर सेट करता हूं।
जे। क्यू।

1
यह विधि एकमात्र तरीका है जो कि एप्पल के "आउट ऑफ बॉक्स" सेल चयन व्यवहार के लिए पूरी तरह से पहचान है। इसका उत्तर स्वीकार किया जाना चाहिए।
mkll

16

चयन शैली को किसी के पास सेट करने के बाद आप निम्नलिखित प्रतिनिधि विधियों का उपयोग कर सकते हैं:

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath

अपना कोड यहां लागू करें, इस तरह

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    CustomCell *cell = (CustomCell *)[tableView cellForRowAtIndexPath:indexPath];
    [cell.lbls setTextColor:[UIColor whiteColor]];
    return indexPath;
}

1
महान और साफ समाधान! आपको केवल willDeselectRowAtIndexPath कॉल को कार्यान्वित करना होगा और यह जादू की तरह काम करता है!
मतज बालँतीक

1
यहां एक संभावित नकारात्मक पक्ष यह है कि इस विधि को तब तक नहीं बुलाया जाता है जब तक कि आपकी उंगली चयनित सेल को नहीं छोड़ती है; जैसे ही आप कक्ष को स्पर्श करते हैं कुछ अन्य दृष्टिकोण प्रभावी हो जाते हैं।
अर्लोमेडिया

14

इस कार्य को प्राप्त करने के लिए आपको चयन शैली को सेट करना होगा UITableViewCellSelectionStyleNoneऔर फिर आपको setSelected:animated:अपनी इच्छानुसार परिणाम प्राप्त करने की विधि को ओवरराइड करना चाहिए । यह वही काम करता है जब आप नीले (या ग्रे) चयन को देखते हैं तो iOS का स्वचालित चयन तंत्र करता है।

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    if (selected) {
        self.textLabel.textColor = [UIColor whiteColor];
    } else {
        self.textLabel.textColor = [UIColor blackColor];
    }
}

आप इसे अन्य तरीके से भी कस्टमाइज़ कर सकते हैं, जैसे UITableViewCell बैकग्राउंड को बदलकर, आदि।


13

CellForRowAtIndexPath में इस कोड का उपयोग करें:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

[cell.myLabel setHighlightedTextColor: [UIColor whiteColor]]; // for all your labels

आशा है कि यह आपके लिए काम करेगा।

कोडिंग का आनंद लें :)


यह उत्तर शीर्ष पर होना चाहिए। :)
चिंतन पटेल

2
यह काम नहीं करेगा। यदि आप बनाना चाहते हैं [cell.textLabel setHighlightedTextColor: [UIColor blueColor]]; सेल चयन नहीं होना चाहिए।
फेमिना

6

अपने उपवर्ग में निम्नलिखित कार्यों को ओवरराइड करना UITableViewCell

override func setHighlighted(highlighted: Bool, animated: Bool) { }
override func setSelected(selected: Bool, animated: Bool) { }

धन्यवाद; यह केवल एक ही था जो स्क्रीन के बाएं किनारे से पूरी पंक्ति का कारण नहीं बनता है, पृष्ठभूमि का रंग बदलते समय चुना जाना चाहिए।
जोस रामिरेज़

मैं केवल ओवरराइडिंग सेटिसेलेक्ट किया गया था यही कारण है कि किसी कारण से सेल कभी-कभी चमकती थी।
ज़ोनली जैम

3

मानक चयन शैली व्यवहार से मेल खाने के लिए, आप दोनों को ओवरराइड करना चाहेंगे setHighlighted:animated:और setSelected:animated:। आप शायद डुप्लिकेट कोड से बचने के लिए उस कोड को एक साझा विधि में स्थानांतरित करना चाहते हैं।

override func setHighlighted(highlighted: Bool, animated: Bool) {

    setAsSelectedOrHighlighted(highlighted, animated: animated)
    super.setHighlighted(highlighted, animated: animated)
}

override func setSelected(selected: Bool, animated: Bool) {

    setAsSelectedOrHighlighted(selected, animated: animated)
    super.setSelected(selected, animated: animated)
}

func setAsSelectedOrHighlighted(selectedOrHighlighted: Bool, animated: Bool) {

    let action = {
        // Set animatable properties
    }

    if animated {
        UIView.animateWithDuration(1.0, delay: 0, options: .CurveEaseInOut, animations: action, completion: nil)
    }
    else {
        action()
    }
}

1

अपने कस्टम सेल में, awakeFromNib और setSelected के डिफ़ॉल्ट कार्यान्वयन को ओवरराइड करें:

- (void)awakeFromNib {
    // Initialization code
    UIImageView * imageView = [[UIImageView alloc] initWithFrame:self.bounds];
    imageView.image = [UIImage imageNamed:@"cell_selected_img"];
    self.selectedBackgroundView = imageView;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
    if (selected) {
        self.lblCustomText.textColor = [UIColor whiteColor];
    } else {
        self.lblCustomText.textColor = [UIColor blackColor];
    }
}

यह भी सुनिश्चित करें कि चयन शैली है नहीं करने के लिए सेट नहीं


0

एक ही तरीका है जिससे मैं काम कर सकता था:

- (void)awakeFromNib {
    UIView *bgColorView = [[UIView alloc] init];
    bgColorView.backgroundColor = [UIColor colorWithRed:(55.0/255.0) green:(163.0/255.0) blue:(237.0/255.0) alpha:1.0];
    bgColorView.layer.masksToBounds = YES;
    self.selectedBackgroundView = bgColorView;
}

0

इसके अलावा आप contentView.alpha का उपयोग कर सकते हैं। यहाँ उदाहरण है।

सबसे पहले, अपने सेल के लिए चयन शैली सेट करें:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

अगला, कस्टम सेल क्लास में एनीमेशन उदाहरण के साथ इस विधि को ओवरराइड करें:

  - (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
    [super setHighlighted:highlighted animated:animated];

    if (highlighted) {
        [UIView animateWithDuration:0.15f animations:^{
            self.contentView.alpha = 0.5f;
        }];
    } else {
        [UIView animateWithDuration:0.35f animations:^{
            self.contentView.alpha = 1.f;
        }];
    }
  }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.