Wie kann ich die Hintergrund- / Rahmenfarben einer gruppierten Tabellenansichtszelle anpassen?

114

Ich möchte sowohl den Hintergrund als auch die Rahmenfarbe einer UITableView im gruppierten Stil anpassen.

Ich konnte die Hintergrundfarbe folgendermaßen anpassen:

tableView.contentView.backgroundColor = [UIColor greenColor];

Aber die Randfarbe kann ich immer noch nicht ändern.

Wie passe ich diese beiden Aspekte der gruppierten Tabellenansicht an?

jpm
quelle
Es ist wichtig sicherzustellen, dass die IBOutlet-Ansicht Ihres UITableViewController festgelegt ist, da sonst die Transparenz nicht funktioniert!
Casebash
1
Ich bin mir nicht sicher, wie Sie Ihre Codezeile zum Laufen gebracht haben. tableView scheint keine contentView-Eigenschaft zu haben.
Greg Maletic
5
Der Thread handelt von UITableViewCells Hintergrund und nicht von UITableView (wie die Frage nahelegt). Die wirkliche Antwort wäre @ dizys Antwort.
Nacho4d

Antworten:

100

UPDATE: In iPhone OS 3.0 und höher gibt es UITableViewCelljetzt eine backgroundColorEigenschaft, die dies wirklich einfach macht (insbesondere in Kombination mit dem [UIColor colorWithPatternImage:]Initialisierer). Aber ich werde die 2.0-Version der Antwort hier jedem überlassen, der sie braucht ...


Es ist schwieriger als es eigentlich sein sollte. So habe ich das gemacht, als ich es machen musste:

Sie müssen die backgroundView-Eigenschaft von UITableViewCell auf eine benutzerdefinierte UIView festlegen, die den Rahmen und den Hintergrund selbst in den entsprechenden Farben zeichnet. Diese Ansicht muss in der Lage sein, die Ränder in 4 verschiedenen Modi zu zeichnen, die oben für die erste Zelle in einem Abschnitt abgerundet sind, unten für die letzte Zelle in einem Abschnitt abgerundet sind und keine abgerundeten Ecken für Zellen in der Mitte eines Abschnitts und an allen 4 Ecken für Abschnitte gerundet, die eine Zelle enthalten.

Leider konnte ich nicht herausfinden, wie dieser Modus automatisch eingestellt werden soll, daher musste ich ihn in der -cellForRowAtIndexPath-Methode der UITableViewDataSource festlegen.

Es ist eine echte PITA, aber ich habe mit Apple-Ingenieuren bestätigt, dass dies derzeit der einzige Weg ist.

Update Hier ist der Code für diese benutzerdefinierte BG-Ansicht. Es gibt einen Zeichnungsfehler, durch den die abgerundeten Ecken etwas lustig aussehen, aber wir sind zu einem anderen Design übergegangen und haben die benutzerdefinierten Hintergründe verschrottet, bevor ich die Möglichkeit hatte, sie zu beheben. Trotzdem wird dies wahrscheinlich sehr hilfreich für Sie sein:

//
//  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
}
Mike Akers
quelle
Können Sie mir bei der Verwendung Ihres Codes helfen? => stackoverflow.com/questions/7309580/…
Nielsou Hacken-Bergen
2
Warum nicht einfach seperatorColor verwenden? Für mich färbt es sowohl die Trennlinie zwischen den Zellen als auch den Rand.
Fernando Redondo
Anstelle dieser drawRect CG-Bogenpfade habe ich eine abgeschnittene Ansicht mit abgerundeten Ecken verwendet. Ich gebe ein negatives Y für nicht erste Zeilen und mache es für nicht letzte Zeilen überhöht.
Hafthor
34

Ich weiß, dass sich die Antworten auf das Ändern gruppierter Tabellenzellen beziehen, aber falls jemand auch die Hintergrundfarbe der Tabellenansicht ändern möchte:

Sie müssen nicht nur Folgendes einstellen:

tableview.backgroundColor = color;

Sie müssen auch die Hintergrundansicht ändern oder entfernen:

tableview.backgroundView = nil;  
schwindlig
quelle
1
Hey danke. Sie haben speziell auf diese Frage die richtige Antwort gegeben.
GeneCode
24

Zunächst einmal vielen Dank für diesen Code. Ich habe einige Zeichnungsänderungen in dieser Funktion vorgenommen, um das Eckproblem beim Zeichnen zu beseitigen.

-(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;
    }
}
Vimal Jain
quelle
Die Linienbreite mit Ihrem Code beträgt ca. 2 px. Wenn ich versuche, CGContextSetLineWidth auf 1 zu setzen, ist es immer noch zu dick. Warum ist das?
Fernando Redondo
Ich habe die gleiche Frage? warum es dicker ist als das System.
Bagusflyer
16

Vielen Dank für den Code, es ist genau das, wonach ich gesucht habe. Ich habe auch den folgenden Code zu Vimals Code hinzugefügt, um den Fall einer CustomCellBackgroundViewPositionSingle-Zelle zu implementieren. (Alle vier Ecken sind abgerundet.)


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;     
}
Aliz Raksi
quelle
13

Eine Sache, auf die ich mit dem obigen CustomCellBackgroundView-Code von Mike Akers gestoßen bin, die für andere nützlich sein könnte:

cell.backgroundViewwird nicht automatisch neu gezeichnet, wenn Zellen wiederverwendet werden, und Änderungen an der Position var der Hintergrundansicht wirken sich nicht auf wiederverwendete Zellen aus. Das bedeutet, dass lange Tabellen falsch gezeichnet wurdencell.backgroundViews aufgrund ihrer Position .

Um dies zu beheben, ohne jedes Mal, wenn eine Zeile angezeigt wird, eine neue Hintergrundansicht erstellen zu müssen, rufen Sie [cell.backgroundView setNeedsDisplay]am Ende von an -[UITableViewController tableView:cellForRowAtIndexPath:]. Für eine wiederverwendbarere Lösung überschreiben Sie den Positionssetzer von CustomCellBackgroundView, um a einzuschließen [self setNeedsDisplay].

Justin Anderson
quelle
Gute Idee zum Überschreiben von -setPosition
Mike Akers
12

Danke für diesen super hilfreichen Beitrag. Für den Fall, dass jemand da draußen (wie ich!) Nur einen völlig leeren Zellenhintergrund haben möchte, anstatt ihn durch Bilder / Text / andere Inhalte in IB anzupassen, und nicht herausfinden kann, wie zum Teufel der dumme Rand / die Polsterung / beseitigt werden soll. Hintergrund, obwohl Sie ihn in IB auf Clear gesetzt haben ... hier ist der Code, den ich verwendet habe, der den Trick gemacht hat!


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

Hoffentlich hilft das jemand anderem! Scheint wie ein Zauber zu wirken.

Taber
quelle
In Ihrer Lösung ist ein Speicherverlust aufgetreten. Sie müssen die Ansicht, auf die Sie einstellen, automatisch freigeben cell.backgroundView.
Cameron Spickert
7

Vielen Dank an alle, die ihren Code gepostet haben. Das ist sehr nützlich.

Ich habe eine ähnliche Lösung abgeleitet, um die Hervorhebungsfarbe für gruppierte Tabellenansichtszellen zu ändern. Grundsätzlich die selectedBackgroundView der UITableViewCell (nicht die backgroundView). Was auch unter iPhone OS 3.0 diese PITA-Lösung noch benötigt, soweit ich das beurteilen kann ...

Der folgende Code enthält die Änderungen zum Rendern der Hervorhebung mit einem Farbverlauf anstelle einer Volltonfarbe. Auch das Rand-Rendering wird entfernt. Genießen.

//
//  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
}
Sergio
quelle
Das ist wirklich toll und was ich gesucht habe. Ich brauche allerdings zwei Möglichkeiten. Stellen Sie bg als Farbverlauf oder Volltonfarbe ein. Ich stelle die Volltonfarbe ein, indem ich beide Verlaufsfarben auf die gleiche Volltonfarbe einstelle, die ich wollte. Es erzwingt jedoch unnötige Berechnungen. Es wäre schön, solche Optionen zu haben.
Karim
4

Sie können die Rahmenfarbe durch Festlegen anpassen

tableView.separatorColor
mikelikespie
quelle
2

So ändern Sie die Rahmenfarbe der Tabellenansicht:

In.h.:

#import <QuartzCore/QuartzCore.h>

In .m:

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

Diese Aufgabe kann einfach mit PrettyKit ausgeführt werden, indem etwa 5 Codezeilen hinzugefügt werden. Wenn Sie nibDateien verwenden oder storyboard, vergessen Sie auch nicht, diesen kleinen Hack anzuwenden . Wenn Sie diesen Ansatz verwenden, sollten Sie Ihre Zelle unterteilen von PrettyTableViewCell:

#import <PrettyKit/PrettyKit.h>

@class RRSearchHistoryItem;

@interface RRSearchHistoryCell : PrettyTableViewCell

Dies ist ein Beispiel für meine 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;
}
Denis Kutlubaev
quelle
-5

Ich hatte Probleme damit und habe viele Kombinationen von Dingen ausprobiert, als ich bemerkte, dass es für einige Zellen gut funktionierte, für andere jedoch nicht.

Seltsamerweise habe ich herausgefunden, dass es möglich ist, cell.backgroundColor auf lightGrayColor zu setzen, und alles funktioniert einwandfrei - aber blueColor hat mir Probleme bereitet, die Außenkanten nicht zu aktualisieren.

Es sei denn, es ist wirklich wichtig, grün zu verwenden - vielleicht möchten Sie dies versuchen. Es kann sein, dass dies eine Funktion ist, mit der Benutzer nur graue Farben verwenden können, wenn sie angeben, dass eine Zelle ausgewählt ist.

Grouchal
quelle