एक समूहीकृत टेबल व्यू सेल की पृष्ठभूमि / सीमा रंग कैसे अनुकूलित करें?


114

मैं एक समूह-शैली UITableView की पृष्ठभूमि और सीमा रंग दोनों को अनुकूलित करना चाहूंगा।

मैं निम्नलिखित का उपयोग करके पृष्ठभूमि के रंग को अनुकूलित करने में सक्षम था:

tableView.contentView.backgroundColor = [UIColor greenColor];

लेकिन सीमा का रंग अभी भी कुछ है जो मुझे नहीं पता कि कैसे बदलना है।

मैं समूह-शैली तालिका दृश्य के इन दो पहलुओं को कैसे अनुकूलित करूं?


यह सुनिश्चित करना महत्वपूर्ण है कि आपके UITableViewController का IBOutlet दृश्य सेट है या पारदर्शिता काम नहीं करेगी!
केसबश

1
निश्चित नहीं है कि आपको अपनी लाइन ऑफ़ कोड कैसे काम करनी है। tableView के पास contentView गुण नहीं है।
ग्रेग मैलिक

5
यह धागा UITableViewCell की पृष्ठभूमि के बारे में है और UITableView के बारे में नहीं है (जैसे प्रश्न बताता है)। असली जवाब @ dizy का जवाब होगा।
nacho4d

जवाबों:


100

अद्यतन: iPhone ओएस 3.0 में और बाद में UITableViewCellअब एक backgroundColorसंपत्ति है जो इसे वास्तव में आसान बनाती है (विशेषकर शुरुआती के साथ संयोजन में [UIColor colorWithPatternImage:])। लेकिन मैं जवाब के 2.0 संस्करण को किसी के लिए यहां छोड़ दूंगा जो इसकी आवश्यकता है ...


यह वास्तव में होना चाहिए की तुलना में कठिन है। यहां बताया गया है कि मैंने ऐसा कब किया था:

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

दुर्भाग्य से मैं यह पता नहीं लगा सका कि यह मोड अपने आप कैसे सेट होता है, इसलिए मुझे इसे UITableViewDataSource की -cellForRowAtIndexPath विधि में सेट करना पड़ा।

यह एक वास्तविक PITA है लेकिन मैंने Apple इंजीनियरों के साथ पुष्टि की है कि यह वर्तमान में एकमात्र तरीका है।

अद्यतन यहाँ उस कस्टम बीजी दृश्य के लिए कोड है। एक ड्राइंग बग है जो गोल कोनों को थोड़ा मज़ेदार बनाता है, लेकिन हम एक अलग डिज़ाइन में चले गए और कस्टम बैकग्राउंड को स्क्रैप कर दिया, इससे पहले कि मुझे इसे ठीक करने का मौका मिले। फिर भी यह शायद आपके लिए बहुत उपयोगी होगा:

//
//  CustomCellBackgroundView.h
//
//  Created by Mike Akers on 11/21/08.
//  Copyright 2008 __MyCompanyName__. All rights reserved.
//

#import <UIKit/UIKit.h>

typedef enum  {
    CustomCellBackgroundViewPositionTop, 
    CustomCellBackgroundViewPositionMiddle, 
    CustomCellBackgroundViewPositionBottom,
    CustomCellBackgroundViewPositionSingle
} CustomCellBackgroundViewPosition;

@interface CustomCellBackgroundView : UIView {
    UIColor *borderColor;
    UIColor *fillColor;
    CustomCellBackgroundViewPosition position;
}

    @property(nonatomic, retain) UIColor *borderColor, *fillColor;
    @property(nonatomic) CustomCellBackgroundViewPosition position;
@end

//
//  CustomCellBackgroundView.m
//
//  Created by Mike Akers on 11/21/08.
//  Copyright 2008 __MyCompanyName__. All rights reserved.
//

#import "CustomCellBackgroundView.h"

static void addRoundedRectToPath(CGContextRef context, CGRect rect,
                                 float ovalWidth,float ovalHeight);

@implementation CustomCellBackgroundView
@synthesize borderColor, fillColor, position;

- (BOOL) isOpaque {
    return NO;
}

- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        // Initialization code
    }
    return self;
}

- (void)drawRect:(CGRect)rect {
    // Drawing code
    CGContextRef c = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(c, [fillColor CGColor]);
    CGContextSetStrokeColorWithColor(c, [borderColor CGColor]);

    if (position == CustomCellBackgroundViewPositionTop) {
        CGContextFillRect(c, CGRectMake(0.0f, rect.size.height - 10.0f, rect.size.width, 10.0f));
        CGContextBeginPath(c);
        CGContextMoveToPoint(c, 0.0f, rect.size.height - 10.0f);
        CGContextAddLineToPoint(c, 0.0f, rect.size.height);
        CGContextAddLineToPoint(c, rect.size.width, rect.size.height);
        CGContextAddLineToPoint(c, rect.size.width, rect.size.height - 10.0f);
        CGContextStrokePath(c);
        CGContextClipToRect(c, CGRectMake(0.0f, 0.0f, rect.size.width, rect.size.height - 10.0f));
    } else if (position == CustomCellBackgroundViewPositionBottom) {
        CGContextFillRect(c, CGRectMake(0.0f, 0.0f, rect.size.width, 10.0f));
        CGContextBeginPath(c);
        CGContextMoveToPoint(c, 0.0f, 10.0f);
        CGContextAddLineToPoint(c, 0.0f, 0.0f);
        CGContextStrokePath(c);
        CGContextBeginPath(c);
        CGContextMoveToPoint(c, rect.size.width, 0.0f);
        CGContextAddLineToPoint(c, rect.size.width, 10.0f);
        CGContextStrokePath(c);
        CGContextClipToRect(c, CGRectMake(0.0f, 10.0f, rect.size.width, rect.size.height));
    } else if (position == CustomCellBackgroundViewPositionMiddle) {
        CGContextFillRect(c, rect);
        CGContextBeginPath(c);
        CGContextMoveToPoint(c, 0.0f, 0.0f);
        CGContextAddLineToPoint(c, 0.0f, rect.size.height);
        CGContextAddLineToPoint(c, rect.size.width, rect.size.height);
        CGContextAddLineToPoint(c, rect.size.width, 0.0f);
        CGContextStrokePath(c);
        return; // no need to bother drawing rounded corners, so we return
    }

    // At this point the clip rect is set to only draw the appropriate
    // corners, so we fill and stroke a rounded rect taking the entire rect

    CGContextBeginPath(c);
    addRoundedRectToPath(c, rect, 10.0f, 10.0f);
    CGContextFillPath(c);  

    CGContextSetLineWidth(c, 1);  
    CGContextBeginPath(c);
    addRoundedRectToPath(c, rect, 10.0f, 10.0f);  
    CGContextStrokePath(c); 
}


- (void)dealloc {
    [borderColor release];
    [fillColor release];
    [super dealloc];
}


@end

static void addRoundedRectToPath(CGContextRef context, CGRect rect,
                                float ovalWidth,float ovalHeight)

{
    float fw, fh;

    if (ovalWidth == 0 || ovalHeight == 0) {// 1
        CGContextAddRect(context, rect);
        return;
    }

    CGContextSaveGState(context);// 2

    CGContextTranslateCTM (context, CGRectGetMinX(rect),// 3
                           CGRectGetMinY(rect));
    CGContextScaleCTM (context, ovalWidth, ovalHeight);// 4
    fw = CGRectGetWidth (rect) / ovalWidth;// 5
    fh = CGRectGetHeight (rect) / ovalHeight;// 6

    CGContextMoveToPoint(context, fw, fh/2); // 7
    CGContextAddArcToPoint(context, fw, fh, fw/2, fh, 1);// 8
    CGContextAddArcToPoint(context, 0, fh, 0, fh/2, 1);// 9
    CGContextAddArcToPoint(context, 0, 0, fw/2, 0, 1);// 10
    CGContextAddArcToPoint(context, fw, 0, fw, fh/2, 1); // 11
    CGContextClosePath(context);// 12

    CGContextRestoreGState(context);// 13
}

क्या आप अपने कोड का उपयोग करके मेरी मदद कर सकते हैं? => stackoverflow.com/questions/7309580/…
नील्सु हैकेन-बर्गेन

2
क्यों नहीं बस seperatorColor का उपयोग करें? मेरे लिए, यह कोशिकाओं और सीमा के बीच सेपरेटर लाइन दोनों को रंग देता है।
फर्नांडो रेडोंडो

उस ड्राअर सीजी आर्क रास्तों के बजाय, मैंने सभी कोनों के साथ एक क्लिप्ड दृश्य का उपयोग किया। मैं इसे गैर-पहली पंक्तियों के लिए एक नकारात्मक वाई देता हूं और मैं इसे गैर-अंतिम पंक्तियों के लिए ऊंचाई-एड बनाता हूं।
हफथोर

34

मुझे पता है कि उत्तर समूहबद्ध टेबल कोशिकाओं को बदलने से संबंधित हैं, लेकिन यदि कोई व्यक्ति टेबलव्यू की पृष्ठभूमि का रंग बदलना चाहता है, तो:

न केवल आपको सेट करने की आवश्यकता है:

tableview.backgroundColor = color;

आपको पृष्ठभूमि दृश्य को बदलने या उससे छुटकारा पाने की आवश्यकता है:

tableview.backgroundView = nil;  

1
धन्यवाद। आपने विशेष रूप से इस प्रश्न का सही उत्तर दिया।
जिनेकोड

24

सबसे पहले इस कोड के लिए धन्यवाद। मैंने ड्राइंग के कोने की समस्या को दूर करने के लिए इस फ़ंक्शन में कुछ ड्राइंग परिवर्तन किए हैं।

-(void)drawRect:(CGRect)rect 
{
    // Drawing code

    CGContextRef c = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(c, [fillColor CGColor]);
    CGContextSetStrokeColorWithColor(c, [borderColor CGColor]);
    CGContextSetLineWidth(c, 2);

    if (position == CustomCellBackgroundViewPositionTop) {

        CGFloat minx = CGRectGetMinX(rect) , midx = CGRectGetMidX(rect), maxx = CGRectGetMaxX(rect) ;
        CGFloat miny = CGRectGetMinY(rect) , maxy = CGRectGetMaxY(rect) ;
        minx = minx + 1;
        miny = miny + 1;

        maxx = maxx - 1;
        maxy = maxy ;

        CGContextMoveToPoint(c, minx, maxy);
        CGContextAddArcToPoint(c, minx, miny, midx, miny, ROUND_SIZE);
        CGContextAddArcToPoint(c, maxx, miny, maxx, maxy, ROUND_SIZE);
        CGContextAddLineToPoint(c, maxx, maxy);

        // Close the path
        CGContextClosePath(c);
        // Fill & stroke the path
        CGContextDrawPath(c, kCGPathFillStroke);        
        return;
    } else if (position == CustomCellBackgroundViewPositionBottom) {

        CGFloat minx = CGRectGetMinX(rect) , midx = CGRectGetMidX(rect), maxx = CGRectGetMaxX(rect) ;
        CGFloat miny = CGRectGetMinY(rect) , maxy = CGRectGetMaxY(rect) ;
        minx = minx + 1;
        miny = miny ;

        maxx = maxx - 1;
        maxy = maxy - 1;

        CGContextMoveToPoint(c, minx, miny);
        CGContextAddArcToPoint(c, minx, maxy, midx, maxy, ROUND_SIZE);
        CGContextAddArcToPoint(c, maxx, maxy, maxx, miny, ROUND_SIZE);
        CGContextAddLineToPoint(c, maxx, miny);
        // Close the path
        CGContextClosePath(c);
        // Fill & stroke the path
        CGContextDrawPath(c, kCGPathFillStroke);    
        return;
    } else if (position == CustomCellBackgroundViewPositionMiddle) {
        CGFloat minx = CGRectGetMinX(rect) , maxx = CGRectGetMaxX(rect) ;
        CGFloat miny = CGRectGetMinY(rect) , maxy = CGRectGetMaxY(rect) ;
        minx = minx + 1;
        miny = miny ;

        maxx = maxx - 1;
        maxy = maxy ;

        CGContextMoveToPoint(c, minx, miny);
        CGContextAddLineToPoint(c, maxx, miny);
        CGContextAddLineToPoint(c, maxx, maxy);
        CGContextAddLineToPoint(c, minx, maxy);

        CGContextClosePath(c);
        // Fill & stroke the path
        CGContextDrawPath(c, kCGPathFillStroke);    
        return;
    }
}

आपके कोड के साथ लाइन की चौड़ाई लगभग 2 px है। जब मैं CGContextSetLineWidth को 1 पर सेट करने की कोशिश करता हूं, तो यह अभी भी मोटी है। ऐसा क्यों है?
फर्नांडो रेडोंडो

मुझे एक ही सवाल मिला? यह सिस्टम एक से अधिक मोटा क्यों है।
Bagusflyer

16

कोड के लिए धन्यवाद, यह वही है जो मैं देख रहा था। मैंने CustomCellBackgroundViewPositionSingle सेल के मामले को लागू करने के लिए विमल के कोड में निम्नलिखित कोड भी जोड़ा है। (सभी चारों कोने गोल हैं।)


else if (position == CustomCellBackgroundViewPositionSingle)
{
        CGFloat minx = CGRectGetMinX(rect) , midx = CGRectGetMidX(rect), maxx = CGRectGetMaxX(rect) ;
        CGFloat miny = CGRectGetMinY(rect) , midy = CGRectGetMidY(rect) , maxy = CGRectGetMaxY(rect) ;
        minx = minx + 1;
        miny = miny + 1;

        maxx = maxx - 1;
        maxy = maxy - 1;

        CGContextMoveToPoint(c, minx, midy);
        CGContextAddArcToPoint(c, minx, miny, midx, miny, ROUND_SIZE);
        CGContextAddArcToPoint(c, maxx, miny, maxx, midy, ROUND_SIZE);
        CGContextAddArcToPoint(c, maxx, maxy, midx, maxy, ROUND_SIZE);
        CGContextAddArcToPoint(c, minx, maxy, minx, midy, ROUND_SIZE);

        // Close the path
        CGContextClosePath(c);
        // Fill & stroke the path
        CGContextDrawPath(c, kCGPathFillStroke);                
        return;     
}

13

एक बात मैं माइक अकर्स से ऊपर CustomCellBackgroundView कोड के साथ भाग गया जो दूसरों के लिए उपयोगी हो सकता है:

cell.backgroundViewजब कोशिकाओं का पुन: उपयोग नहीं किया जाता है, तो स्वचालित रूप से पुनः प्राप्त नहीं होता है और पृष्ठभूमि के स्थिति संस्करण में परिवर्तन पुन: उपयोग की गई कोशिकाओं को प्रभावित नहीं करता है। इसका मतलब है कि लंबी तालिकाओं को गलत तरीके से खींचा जाएगाcell.backgroundViews अपनी स्थिति दी ।

हर बार एक पंक्ति प्रदर्शित होने पर एक नई पृष्ठभूमि बनाए बिना इसे ठीक करने के लिए, [cell.backgroundView setNeedsDisplay]अपने अंत में कॉल करें -[UITableViewController tableView:cellForRowAtIndexPath:]। या अधिक पुन: प्रयोज्य समाधान के लिए, शामिल करने के लिए CustomCellBackgroundView की स्थिति सेटर को ओवरराइड करें [self setNeedsDisplay]


ओवरराइडिंग -पोजिशन के बारे में अच्छा विचार
माइक एकर्स

12

इस सुपर उपयोगी पोस्ट के लिए धन्यवाद। यदि कोई हो तो वहाँ (मेरे जैसा!) आईबी में छवियों / पाठ / अन्य सामग्री के माध्यम से इसे अनुकूलित करने के एवज में एक पूरी तरह से खाली सेल पृष्ठभूमि चाहता है और यह पता नहीं लगा सकता है कि नरक को गूंगा सीमा / पैडिंग / से छुटकारा कैसे मिलेगा पृष्ठभूमि भले ही आप इसे आईबी में स्पष्ट करने के लिए सेट करें ... यहां मैंने जो कोड उपयोग किया है वह चाल है!


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

    static NSString *cellId = @"cellId";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: cellId];
    if (cell == nil) {
        [[NSBundle mainBundle] loadNibNamed:@"EditTableViewCell" owner:self options:nil];
        cell = cellIBOutlet;
        self.cellIBOutlet = nil;
    }

    cell.backgroundView = [[[UIView alloc] initWithFrame: CGRectZero] autorelease];
    [cell.backgroundView setNeedsDisplay];

    ... any other cell customizations ...

    return cell;
}

उम्मीद है कि किसी और की मदद करेंगे! एक आकर्षण की तरह काम करने लगता है।


आपके समाधान में एक स्मृति रिसाव है। आपको वह दृश्य देखने की आवश्यकता है जिसे आप सेट कर रहे हैं cell.backgroundView
कैमरन स्पिकर्ट

7

उन सभी के लिए बहुत धन्यवाद जिन्होंने अपना कोड पोस्ट किया। यह बहुत उपयोगी है।

मैंने समूहीकृत तालिका दृश्य कोशिकाओं के लिए हाइलाइट रंग बदलने के लिए एक समान समाधान निकाला। मूल रूप से UITableViewCell के चयनितबैकग्राउंड दृश्य (पृष्ठभूमि दृश्य नहीं)। जो कि iPhone OS 3.0 पर अभी भी इस PITA समाधान की आवश्यकता है, जहाँ तक मैं बता सकता हूँ ...

नीचे दिए गए कोड में एक ठोस रंग के बजाय एक ढाल के साथ हाइलाइट प्रदान करने के लिए परिवर्तन हैं। साथ ही बॉर्डर रेंडरिंग को हटा दिया जाता है। का आनंद लें।

//
//  CSCustomCellBackgroundView.h
//

#import <UIKit/UIKit.h>

typedef enum  
{
    CustomCellBackgroundViewPositionTop, 
    CustomCellBackgroundViewPositionMiddle, 
    CustomCellBackgroundViewPositionBottom,
    CustomCellBackgroundViewPositionSingle,
    CustomCellBackgroundViewPositionPlain
} CustomCellBackgroundViewPosition;

@interface CSCustomCellBackgroundView : UIView 
{
    CustomCellBackgroundViewPosition position;
 CGGradientRef gradient;
}

@property(nonatomic) CustomCellBackgroundViewPosition position;

@end



//
//  CSCustomCellBackgroundView.m
//

#import "CSCustomCellBackgroundView.h"



#define ROUND_SIZE 10


static void addRoundedRectToPath(CGContextRef context, CGRect rect,
         float ovalWidth,float ovalHeight);


@implementation CSCustomCellBackgroundView


@synthesize position;

- (BOOL) isOpaque 
{
    return NO;
}

- (id)initWithFrame:(CGRect)frame 
{
    if (self = [super initWithFrame:frame]) 
 {
        // Initialization code
  const float* topCol = CGColorGetComponents([[UIColor redColor] CGColor]);
  const float* bottomCol = CGColorGetComponents([[UIColor blueColor] CGColor]);

  CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
  /*
  CGFloat colors[] =
  {
   5.0 / 255.0, 140.0 / 255.0, 245.0 / 255.0, 1.00,
   1.0 / 255.0,  93.0 / 255.0, 230.0 / 255.0, 1.00,
  };*/
  CGFloat colors[]=
  {
   topCol[0], topCol[1], topCol[2], topCol[3],
   bottomCol[0], bottomCol[1], bottomCol[2], bottomCol[3]
  };
  gradient = CGGradientCreateWithColorComponents(rgb, colors, NULL, sizeof(colors)/(sizeof(colors[0])*4));
  CGColorSpaceRelease(rgb);
    }
    return self;
}


-(void)drawRect:(CGRect)rect 
{
    // Drawing code

    CGContextRef c = UIGraphicsGetCurrentContext();

    if (position == CustomCellBackgroundViewPositionTop) 
 {

        CGFloat minx = CGRectGetMinX(rect) , midx = CGRectGetMidX(rect), maxx = CGRectGetMaxX(rect) ;
        CGFloat miny = CGRectGetMinY(rect) , maxy = CGRectGetMaxY(rect) ;
        minx = minx + 1;
        miny = miny + 1;

        maxx = maxx - 1;
        maxy = maxy ;

        CGContextMoveToPoint(c, minx, maxy);
        CGContextAddArcToPoint(c, minx, miny, midx, miny, ROUND_SIZE);
        CGContextAddArcToPoint(c, maxx, miny, maxx, maxy, ROUND_SIZE);
        CGContextAddLineToPoint(c, maxx, maxy);

        // Close the path
        CGContextClosePath(c);

  CGContextSaveGState(c);
  CGContextClip(c);
  CGContextDrawLinearGradient(c, gradient, CGPointMake(minx,miny), CGPointMake(minx,maxy), kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation);
  CGContextRestoreGState(c);

        return;
    } 
 else if (position == CustomCellBackgroundViewPositionBottom) 
 {

        CGFloat minx = CGRectGetMinX(rect) , midx = CGRectGetMidX(rect), maxx = CGRectGetMaxX(rect) ;
        CGFloat miny = CGRectGetMinY(rect) , maxy = CGRectGetMaxY(rect) ;
        minx = minx + 1;
        miny = miny + 1;

        maxx = maxx - 1;
        maxy = maxy - 1;

        CGContextMoveToPoint(c, minx, miny);
        CGContextAddArcToPoint(c, minx, maxy, midx, maxy, ROUND_SIZE);
        CGContextAddArcToPoint(c, maxx, maxy, maxx, miny, ROUND_SIZE);
        CGContextAddLineToPoint(c, maxx, miny);
        // Close the path
        CGContextClosePath(c);

  CGContextSaveGState(c);
  CGContextClip(c);
  CGContextDrawLinearGradient(c, gradient, CGPointMake(minx,miny), CGPointMake(minx,maxy), kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation);
  CGContextRestoreGState(c);

        return;
    } 
 else if (position == CustomCellBackgroundViewPositionMiddle) 
 {
        CGFloat minx = CGRectGetMinX(rect) , maxx = CGRectGetMaxX(rect) ;
        CGFloat miny = CGRectGetMinY(rect) , maxy = CGRectGetMaxY(rect) ;
        minx = minx + 1;
        miny = miny + 1;

        maxx = maxx - 1;
        maxy = maxy ;

        CGContextMoveToPoint(c, minx, miny);
        CGContextAddLineToPoint(c, maxx, miny);
        CGContextAddLineToPoint(c, maxx, maxy);
        CGContextAddLineToPoint(c, minx, maxy);
  // Close the path
        CGContextClosePath(c);

  CGContextSaveGState(c);
  CGContextClip(c);
  CGContextDrawLinearGradient(c, gradient, CGPointMake(minx,miny), CGPointMake(minx,maxy), kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation);
  CGContextRestoreGState(c);

        return;
    }
 else if (position == CustomCellBackgroundViewPositionSingle)
 {
        CGFloat minx = CGRectGetMinX(rect) , midx = CGRectGetMidX(rect), maxx = CGRectGetMaxX(rect) ;
        CGFloat miny = CGRectGetMinY(rect) , midy = CGRectGetMidY(rect) , maxy = CGRectGetMaxY(rect) ;
        minx = minx + 1;
        miny = miny + 1;

        maxx = maxx - 1;
        maxy = maxy - 1;

        CGContextMoveToPoint(c, minx, midy);
        CGContextAddArcToPoint(c, minx, miny, midx, miny, ROUND_SIZE);
        CGContextAddArcToPoint(c, maxx, miny, maxx, midy, ROUND_SIZE);
        CGContextAddArcToPoint(c, maxx, maxy, midx, maxy, ROUND_SIZE);
        CGContextAddArcToPoint(c, minx, maxy, minx, midy, ROUND_SIZE);
        // Close the path
        CGContextClosePath(c);              

  CGContextSaveGState(c);
  CGContextClip(c);
  CGContextDrawLinearGradient(c, gradient, CGPointMake(minx,miny), CGPointMake(minx,maxy), kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation);
  CGContextRestoreGState(c);

        return;         
 } 
 else if (position == CustomCellBackgroundViewPositionPlain) {
    CGFloat minx = CGRectGetMinX(rect);
    CGFloat miny = CGRectGetMinY(rect), maxy = CGRectGetMaxY(rect) ;
    CGContextDrawLinearGradient(c, gradient, CGPointMake(minx,miny), CGPointMake(minx,maxy), kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation);
    return;
}

}

- (void)dealloc 
{
    CGGradientRelease(gradient);
    [super dealloc];
}


- (void) setPosition:(CustomCellBackgroundViewPosition)inPosition
{
 if(position != inPosition)
 {
  position = inPosition;
  [self setNeedsDisplay];
 }
}

@end


static void addRoundedRectToPath(CGContextRef context, CGRect rect,
         float ovalWidth,float ovalHeight)

{
    float fw, fh;

    if (ovalWidth == 0 || ovalHeight == 0) {// 1
        CGContextAddRect(context, rect);
        return;
    }

    CGContextSaveGState(context);// 2

    CGContextTranslateCTM (context, CGRectGetMinX(rect),// 3
         CGRectGetMinY(rect));
    CGContextScaleCTM (context, ovalWidth, ovalHeight);// 4
    fw = CGRectGetWidth (rect) / ovalWidth;// 5
    fh = CGRectGetHeight (rect) / ovalHeight;// 6

    CGContextMoveToPoint(context, fw, fh/2); // 7
    CGContextAddArcToPoint(context, fw, fh, fw/2, fh, 1);// 8
    CGContextAddArcToPoint(context, 0, fh, 0, fh/2, 1);// 9
    CGContextAddArcToPoint(context, 0, 0, fw/2, 0, 1);// 10
    CGContextAddArcToPoint(context, fw, 0, fw, fh/2, 1); // 11
    CGContextClosePath(context);// 12

    CGContextRestoreGState(context);// 13
}

यह वास्तव में बहुत अच्छा है और मैं जो देख रहा था। मुझे हालांकि दो विकल्प चाहिए। ग्रेडिएंट को ढाल या ठोस रंग के रूप में सेट करें। मैंने केवल एक ही ठोस रंग के लिए ढाल रंग दोनों को सेट करके ठोस रंग सेट किया था जो मैं चाहता था। हालांकि यह अनावश्यक गणना करता है। ऐसे में कुछ विकल्प रखना अच्छा होगा।
करीम

4

आप सेटिंग करके बॉर्डर कलर को कस्टमाइज़ कर सकते हैं

tableView.separatorColor

2

तालिका दृश्य सीमा रंग बदलने के लिए:

एच में:

#import <QuartzCore/QuartzCore.h>

.M में:

tableView.layer.masksToBounds=YES;
tableView.layer.borderWidth = 1.0f;
tableView.layer.borderColor = [UIColor whiteColor].CGColor;

0

यह कार्य आसानी से उपयोग किया जा सकता PrettyKit कोड के 5 लाइनों के बारे में जोड़कर। यदि आप nibफ़ाइलों का उपयोग करते हैं या storyboard, इस छोटे हैक को लागू करने के लिए भी मत भूलना । जब आप इस दृष्टिकोण का उपयोग करते हैं, तो आपको अपने सेल को उपवर्ग में रखना चाहिए PrettyTableViewCell:

#import <PrettyKit/PrettyKit.h>

@class RRSearchHistoryItem;

@interface RRSearchHistoryCell : PrettyTableViewCell

यह मेरा उदाहरण है cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  static NSString *cellIdentifier = @"RRSearchHistoryCell";

  RRSearchHistoryCell *cell = (RRSearchHistoryCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];

  if ( cell == nil ) {

    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"RRSearchHistoryCell" owner:self options:nil];
    cell = topLevelObjects[0];
    cell.gradientStartColor = RGB(0xffffff);
    cell.gradientEndColor = RGB(0xf3f3f3);

  }

  RRSearchHistoryItem *item = _historyTableData[indexPath.row];
  [cell setHistoryItem:item];


  [cell prepareForTableView:tableView indexPath:indexPath];

  return cell;
}

-5

मुझे इससे परेशानी हो रही है और बहुत सी चीजों के संयोजन की कोशिश की है जैसा कि मैंने देखा कि कुछ कोशिकाओं के लिए यह ठीक काम करता है लेकिन दूसरों के लिए नहीं।

अजीब तरह से मुझे पता चला कि यह सेल.बैकग्राउंडकोल को लाइटग्रेकलर पर सेट करना संभव है और सभी पूरी तरह से काम करता है - लेकिन ब्लूकोलर ने मुझे बाहरी किनारों को अपडेट नहीं करने की समस्या पैदा की।

जब तक हरे रंग का उपयोग करना वास्तव में महत्वपूर्ण नहीं है - शायद आप यह कोशिश करना चाहते हैं। यह हो सकता है कि यह एक विशेषता है कि लोगों को केवल एक सेल का चयन करते समय ग्रे रंगों का उपयोग करने के लिए प्राप्त किया जाए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.