UITableViewCell की पृष्ठभूमि का रंग कैसे अनुकूलित करें?


188

मैं अपने UITableView के भीतर सभी UITableViewCells की पृष्ठभूमि (और शायद सीमा भी) को अनुकूलित करना चाहूंगा। अब तक मैं इस सामान को अनुकूलित नहीं कर पाया हूं, इसलिए मेरे पास सफेद पृष्ठभूमि कोशिकाओं का एक गुच्छा है जो डिफ़ॉल्ट है।

क्या iPhone SDK के साथ ऐसा करने का कोई तरीका है?

जवाबों:


193

आपको सेल के contentView के बैकग्राउंड को अपने रंग में सेट करना होगा। यदि आप सहायक उपकरण (जैसे प्रकटीकरण तीर, आदि) का उपयोग करते हैं, तो वे सफेद दिखेंगे, इसलिए आपको उन कस्टम संस्करणों को रोल करने की आवश्यकता हो सकती है।


108
जैसे myCell.contentView.backgroundColor = [UIColor greenColor];
JoBu1324

1
vlado.grigorov का उत्तर अधिक लचीला है - विलियम डेनिस का जवाब देखें
JoBu1324

3
UITableViewCellAccessoryCheckmarkउदाहरण के लिए किसी के खुद के रोल करने के लिए कोई भी लिंक ? धन्यवाद।
डैन रोसेनस्टार्क

6
इसे देखने के लिए कभी-कभी आपको सेट करने की आवश्यकता होती है:cell.textLabel.backgroundColor = [UIColor clearColor];
इवान मोरान

205

इस समस्या को हल करने के लिए मैं सबसे कुशल तरीका प्रस्तुत कर रहा हूं, willDisplayCell प्रतिनिधि विधि का उपयोग करें (यह पाठ लेबल पृष्ठभूमि के लिए सफेद रंग का ध्यान रखता है और साथ ही सेल.टेक्स्टलैब.टेक्स्ट और / या सेल .etailTextLextLabel.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]];

इस समाधान ने मेरी परिस्थिति में अच्छा काम किया ...


यह एक तरह से क्लीनर सॉल्यूशन है। अन्य समाधानों में से अधिकांश को UITableViewCell को या तो उपवर्ग की आवश्यकता होती है। vlado.grigorov का समाधान मेरे लिए काम नहीं करता है।
रॉनी एलवाईई

वास्तव में, और यह वह विधि है जिसे Apple स्वयं विभिन्न WWDC प्रस्तुतियों के अनुसार सुझाता है।
माइक वेलर

जब आप सूची के शीर्ष पर नई पंक्तियाँ जोड़ना चाहते हैं, तो अच्छा है। यह विधि सभी परिवर्धन को एक ही रंग बनाती है। रिफ्रेश इसे ठीक करता है, लेकिन अनावश्यक समय लेता है। कल पता चला ...
JOM

कोर डेटा का उपयोग करने के अलावा, यह अच्छी तरह से काम करता है। एक NSFetchedResultsController के माध्यम से जोड़े गए नए कोशिकाओं को ठीक से कॉल विल नहीं लगता है। मैं इसे काम करने के नुकसान में हूँ ...
7:11

Swift 2.0 में बैकग्राउंड कलर सेट करने के लिए बराबर लाइन:cell.backgroundColor = UIColor.clearColor
kbpontius

104

यह वास्तव में सरल है, क्योंकि OS 3.0 सिर्फ सेल के बैकग्राउंड कलर को willDisplayCell विधि में सेट करता है। आपको सेलफ़ोररौटइंडेक्सपैथ में रंग सेट नहीं करना चाहिए।

यह दोनों सादे और समूहीकृत शैली के लिए काम करता है:

कोड:

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

पुनश्च: यहाँ विडिज़प्ले के लिए दस्तावेज़ीकरण निकालने के लिए:

"तालिका दृश्य पंक्ति को खींचने के लिए सेल का उपयोग करने से ठीक पहले अपने प्रतिनिधि को यह संदेश भेजता है, जिससे प्रतिनिधि को प्रदर्शित होने से पहले सेल ऑब्जेक्ट को अनुकूलित करने की अनुमति मिलती है। यह विधि प्रतिनिधि को पहले से निर्धारित राज्य-आधारित गुणों को ओवरराइड करने का मौका देती है। तालिका दृश्य, जैसे चयन और पृष्ठभूमि का रंग। प्रतिनिधि के लौटने के बाद, तालिका दृश्य केवल अल्फा और फ्रेम गुणों को सेट करता है, और तब केवल पंक्तियों को एनिमेट करते समय जब वे अंदर या बाहर स्लाइड करते हैं। "

मुझे यह जानकारी इस पोस्ट में colionel से मिली है । उसे धन्यवाद दो!


3
इसे सही उत्तर के रूप में चिह्नित किया जाना चाहिए क्योंकि आपके पास कुछ भी नहीं है यदि आपके पास एक प्रकटीकरण है। भारत
आशीष अवागढ़

1
यदि आप मेरे लिए टेबल व्यू बैकग्राउंड के लिए अलग सेल बैकग्राउंड कलर चाहते हैं तो यह काम नहीं करता है।
क्रिस

समूह सेल के लिए, आप इसे
सेलफ्रोर

58

मैंने अब तक जो सबसे अच्छा तरीका पाया है, वह सेल का बैकग्राउंड व्यू और सेल सबव्यू का स्पष्ट बैकग्राउंड सेट करना है। बेशक, यह केवल अनुक्रमित शैली के साथ तालिकाओं पर अच्छा लग रहा है, कोई बात नहीं या सामान के बिना।

यहाँ एक नमूना है जहाँ सेल की पृष्ठभूमि पीले रंग की है:

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
यदि आप ऐसा करते हैं, तो अपारदर्शी संपत्ति को NO पर सेट करना सुनिश्चित करें।
लिली बलार्ड

11
पारदर्शी सेल नियंत्रण का उपयोग करना वास्तव में अनुशंसित नहीं है। स्क्रॉलिंग प्रदर्शन बहुत प्रभावित होगा जिसके कारण Apple हमेशा अपारदर्शी नियंत्रणों का उपयोग करने के लिए कहता है।
माइक वेलर

3
IOS 4.2 और बाद में ऐसा लगता है कि लूप अब जरूरी नहीं है।
फ्रैंक शमिट

बहुत अच्छा। गौण विचारों का उपयोग करते समय सही काम करता है !!
रयानगैन

19

बस इसे आप यूआईटेबल व्यू डेलिगेट क्लास फाइल (.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

मैं सेबा के साथ सहमत हूं, मैंने अपने वैकल्पिक पंक्ति रंग को पंक्ति में स्थापित करने की कोशिश की है IndFexexPath प्रतिनिधि विधि, लेकिन 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
फिर भी समझ में नहीं आ रहा है कि इसे विलडिस्केल में सेट करने से कोई फर्क क्यों पड़ता है। यह वैसे भी कहा जाता है कि क्या हम इसे लागू करते हैं या नहीं?
शेरेन इयर्स

6

सभी विभिन्न समाधानों को आज़माने के बाद, निम्नलिखित विधि सबसे सुरुचिपूर्ण है। निम्न प्रतिनिधि विधि में रंग बदलें:

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

4

vlado.grigorov के पास कुछ अच्छी सलाह है - सबसे अच्छा तरीका एक पृष्ठभूमि दृश्य बनाना है, और यह कि एक रंग दें, और सब कुछ स्पष्ट करें। इसके अलावा, मुझे लगता है कि रंग को सही ढंग से साफ़ करने का एकमात्र तरीका है (उसके नमूने का प्रयास करें - लेकिन 'येलोकोलर' के बजाय 'क्लियरकोलर' सेट करें), जो कि मैं करने की कोशिश कर रहा था।


इस दृष्टिकोण का एक फायदा यह है कि आप इंटरफ़ेस बिल्डर में रंग को डिज़ाइन समय संपत्ति रख सकते हैं। एक कम डिज़ाइन मुद्दा जिसे डेवलपर इंटरैक्शन की आवश्यकता होती है।
वाइटनीलैंड

1
cell.backgroundView = [[[UIView आवंटित] initWithFrame: cell.bounds] ऑटोरेलिज]; cell.backgroundView.backgroundColor = [UIColor redColor];
ब्रायन

3

एक टेबल व्यू सेल की पृष्ठभूमि को अनुकूलित करना अंततः बन जाता है और "सभी या कुछ भी नहीं" दृष्टिकोण। सामग्री सेल की पृष्ठभूमि के लिए उपयोग किए जाने वाले रंग या छवि को इस तरह बदलना बहुत मुश्किल है जो अजीब न लगे।

कारण यह है कि सेल वास्तव में दृश्य की चौड़ाई का विस्तार करता है। गोल कोनों इसकी ड्राइंग शैली का सिर्फ एक हिस्सा है और इस क्षेत्र में सामग्री दृश्य बैठता है।

यदि आप सामग्री सेल का रंग बदलते हैं, तो आप कोनों पर दिखाई देने वाले सफेद बिट्स के साथ समाप्त हो जाएंगे। यदि आप पूरे सेल का रंग बदलते हैं, तो आपके पास दृश्य की चौड़ाई को बढ़ाते हुए रंग का एक ब्लॉक होगा।

आप निश्चित रूप से एक सेल को अनुकूलित कर सकते हैं, लेकिन यह उतना आसान नहीं है जितना आप पहले सोच सकते हैं।


1
यह समूहीकृत तालिकाओं में कोशिकाओं के लिए निश्चित रूप से सच है, लेकिन सादे तालिकाओं के बारे में चिंता करने के लिए उतना नहीं है। बिना एक्सेसरी वाले अनडॉर्नड सेल को ठीक दिखना चाहिए।
बेन गोटलिब

बेन - अच्छी बात है। मैं मुख्य रूप से समूहीकृत तालिकाओं का उपयोग करता हूं, लेकिन जैसा कि आप उल्लेख करते हैं कि सादे तालिकाओं में से कोई भी समस्या नहीं है।
एंड्रयू ग्रांट

3

एक दृश्य बनाएं और इसे सेल के पृष्ठभूमि दृश्य के रूप में सेट करें

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

3

N.Berendt के उत्तर पर विस्तार करने के लिए - यदि आप वास्तविक सेल डेटा ऑब्जेक्ट में कुछ स्थिति के आधार पर सेल का रंग सेट करना चाहते हैं, तो उस समय आप टेबल सेल के लिए शेष जानकारी को कॉन्फ़िगर कर रहे हैं, जो आमतौर पर जब आप में होते हैं CellForRowAtIndexPath विधि, आप सामग्री दृश्य पृष्ठभूमि रंग से सेल पृष्ठभूमि रंग सेट करने के लिए willDisplayCell विधि को ओवरराइड करके ऐसा कर सकते हैं - यह प्रकटीकरण बटन पृष्ठभूमि के मुद्दे के आसपास हो जाता है आदि सही नहीं हैं, लेकिन फिर भी आप सेलफ़ोररॉवेंटआईथैक्सपैथ विधि में रंग को नियंत्रित करने की सुविधा देते हैं। जहाँ आप अपने अन्य सेल अनुकूलन कर रहे हैं।

तो: यदि आप इस पद्धति को अपनी तालिका दृश्य प्रतिनिधि में जोड़ते हैं:

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

फिर अपने सेलफ़ोर रॉटएंडएक्सपेथ विधि में आप कर सकते हैं:

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

यह आपके डेटा ऑब्जेक्ट्स को फिर से इच्छा-सूची विधि में पुनः प्राप्त करने से बचाता है और दो स्थानों को बचाता है जहाँ आप अपने टेबल सेल के टेलरिंग / अनुकूलन करते हैं - सभी अनुकूलन सेलफ़ोरराउटइंडेक्सपैथ विधि में जा सकते हैं।


3

फ़ोटोशॉप या जिम्प के साथ पृष्ठभूमि के रूप में उपयोग करने के लिए एक छवि बनाएं और इसे नाम दें। उसके बाद, अपनी तालिका में इस पद्धति को जोड़ें

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

मेरा समाधान निम्नलिखित कोड को सेलफ़ोरराउटअंडेक्सपैथ घटना में जोड़ना है:

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

किसी भी परिस्थिति में काम करता है, यहां तक ​​कि प्रकटीकरण बटन के साथ भी, और सेल लॉरॉश शो में ईवेंट सेलफोररॉइटएंडएक्सपैथ की तुलना में सेल तर्क पर रंग तर्क पर कार्य करने के लिए बेहतर है।


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"]];
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.