Bagaimana cara menyesuaikan warna latar belakang / batas dari sel tampilan tabel yang dikelompokkan?

114

Saya ingin menyesuaikan latar belakang dan warna garis tepi dari UITableView gaya-berkelompok.

Saya dapat menyesuaikan warna latar belakang dengan menggunakan yang berikut ini:

tableView.contentView.backgroundColor = [UIColor greenColor];

Tapi warna perbatasan masih merupakan sesuatu yang saya tidak tahu bagaimana mengubahnya.

Bagaimana cara menyesuaikan dua aspek tampilan tabel gaya-dikelompokkan ini?

jpm
sumber
Penting untuk memastikan bahwa tampilan IBOutlet dari UITableViewController Anda disetel atau transparansi tidak akan berfungsi!
Casebash
1
Tidak yakin bagaimana Anda membuat baris kode Anda berfungsi. tableView sepertinya tidak memiliki properti contentView.
Greg Maletic
5
Utas ini tentang latar belakang UITableViewCell dan bukan tentang UITableView (seperti yang disarankan pertanyaan). Jawaban sebenarnya adalah jawaban @ dizy.
nacho4d

Jawaban:

100

UPDATE: Di iPhone OS 3.0 dan yang lebih baru UITableViewCellsekarang memiliki backgroundColorproperti yang membuatnya sangat mudah (terutama dalam kombinasi dengan [UIColor colorWithPatternImage:]penginisialisasi). Tetapi saya akan meninggalkan jawaban versi 2.0 di sini untuk siapa saja yang membutuhkannya…


Ini lebih sulit dari yang seharusnya. Inilah cara saya melakukan ini ketika saya harus melakukannya:

Anda perlu menyetel properti backgroundView UITableViewCell ke UIView kustom yang menggambar batas dan latar belakang itu sendiri dalam warna yang sesuai. Tampilan ini harus dapat menggambar batas dalam 4 mode berbeda, dibulatkan di atas untuk sel pertama dalam suatu bagian, dibulatkan di bawah untuk sel terakhir dalam suatu bagian, tidak ada sudut membulat untuk sel di tengah bagian , dan dibulatkan di keempat sudut untuk bagian yang berisi satu sel.

Sayangnya saya tidak tahu bagaimana menyetel mode ini secara otomatis, jadi saya harus menyetelnya dalam metode -cellForRowAtIndexPath UITableViewDataSource.

Ini adalah PITA yang sebenarnya, tetapi saya telah mengonfirmasi dengan teknisi Apple bahwa saat ini ini adalah satu-satunya cara.

Perbarui Berikut kode untuk tampilan bg khusus itu. Ada bug gambar yang membuat sudut membulat terlihat sedikit lucu, tetapi kami pindah ke desain yang berbeda dan menghapus latar belakang khusus sebelum saya sempat memperbaikinya. Namun ini mungkin akan sangat membantu Anda:

//
//  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
sumber
Bisakah Anda membantu saya menggunakan kode Anda? => stackoverflow.com/questions/7309580/…
Nielsou Hacken-Bergen
2
Mengapa tidak menggunakan seperatorColor? Bagi saya, itu mewarnai garis pemisah antara sel dan perbatasan.
Fernando Redondo
Daripada jalur busur CG drawRect, saya menggunakan tampilan terpotong dengan semua sudut membulat. Saya memberikannya Y negatif untuk baris non-pertama dan saya membuatnya terlalu tinggi untuk baris non-terakhir.
Hafthor
34

Saya tahu jawabannya berkaitan dengan mengubah sel tabel yang dikelompokkan, tetapi jika seseorang ingin juga mengubah warna latar belakang tampilan tabel:

Anda tidak hanya perlu mengatur:

tableview.backgroundColor = color;

Anda juga perlu mengubah atau menghilangkan tampilan latar belakang:

tableview.backgroundView = nil;  
pusing
sumber
1
Hei terima kasih. Anda memberikan jawaban yang benar untuk pertanyaan ini secara khusus.
GeneCode
24

Pertama-tama terima kasih untuk kode ini. Saya telah membuat beberapa perubahan gambar dalam fungsi ini untuk menghilangkan masalah sudut gambar.

-(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
sumber
Lebar garis dengan kode Anda sekitar 2 px. Saat saya mencoba menyetel CGContextSetLineWidth ke 1, masih terlalu tebal. Kenapa ini?
Fernando Redondo
Saya punya pertanyaan yang sama? mengapa lebih tebal dari pada sistem.
Bagusflyer
16

Terima kasih untuk kodenya, hanya itu yang saya cari. Saya juga menambahkan kode berikut ke kode Vimal, untuk mengimplementasikan kasus sel CustomCellBackgroundViewPositionSingle. (Keempat sudut dibulatkan.)


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
sumber
13

Satu hal yang saya temukan dengan kode CustomCellBackgroundView di atas dari Mike Akers yang mungkin berguna bagi orang lain:

cell.backgroundViewtidak otomatis digambar ulang saat sel digunakan kembali, dan perubahan pada var posisi backgroundView tidak memengaruhi sel yang digunakan kembali. Itu berarti tabel panjang akan salah digambar cell.backgroundViewsmengingat posisinya.

Untuk memperbaikinya tanpa harus membuat backgroundView baru setiap kali baris ditampilkan, panggil [cell.backgroundView setNeedsDisplay]di akhir -[UITableViewController tableView:cellForRowAtIndexPath:]. Atau untuk solusi yang lebih dapat digunakan kembali, ganti penyetel posisi CustomCellBackgroundView untuk menyertakan file [self setNeedsDisplay].

Justin Anderson
sumber
Ide bagus tentang menimpa -setPosition
Mike Akers
12

Terima kasih atas posting yang sangat membantu ini. Jika ada orang di luar sana (seperti saya!) Ingin memiliki latar belakang sel yang benar-benar kosong sebagai pengganti menyesuaikannya melalui gambar / teks / konten lain di IB dan tidak tahu bagaimana cara menghilangkan batas bodoh / padding / latar belakang meskipun Anda mengaturnya menjadi jelas di IB ... inilah kode yang saya gunakan yang melakukan trik!


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

Semoga itu bisa membantu orang lain! Sepertinya bekerja seperti pesona.

taber
sumber
Ada kebocoran memori dalam solusi Anda. Anda perlu melepaskan otomatis tampilan yang Anda atur cell.backgroundView.
Cameron Spickert
7

Terima kasih banyak untuk semua yang memposting kode mereka. Ini sangat berguna.

Saya mendapatkan solusi serupa untuk mengubah warna sorotan untuk sel tampilan tabel yang dikelompokkan. Pada dasarnya selectedBackgroundView milik UITableViewCell (bukan backgroundView). Yang bahkan pada iPhone OS 3.0 masih membutuhkan solusi PITA ini, sejauh yang saya tahu ...

Kode di bawah ini memiliki perubahan untuk menampilkan sorotan dengan gradien alih-alih satu warna solid. Juga rendering perbatasan dihapus. Nikmati.

//
//  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
sumber
Ini sangat bagus dan apa yang saya cari. Saya butuh dua pilihan. atur bg sebagai gradien atau warna solid. Saya mengatur warna solid hanya dengan mengatur kedua warna gradien ke warna solid yang sama yang saya inginkan. Itu memaksakan perhitungan yang tidak perlu. Senang rasanya memiliki beberapa opsi seperti itu.
karim
4

Anda dapat menyesuaikan warna perbatasan dengan mengatur

tableView.separatorColor
mikelikespie
sumber
2

Untuk mengubah warna batas tampilan tabel:

In.h:

#import <QuartzCore/QuartzCore.h>

Dalam .m:

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

Tugas ini dapat dengan mudah dilakukan menggunakan PrettyKit dengan menambahkan sekitar 5 baris kode. Jika Anda menggunakan nibfile atau storyboard, jangan lupa juga untuk menerapkan hack kecil ini . Saat Anda menggunakan pendekatan ini, Anda harus membuat subkelas sel Anda dari PrettyTableViewCell:

#import <PrettyKit/PrettyKit.h>

@class RRSearchHistoryItem;

@interface RRSearchHistoryCell : PrettyTableViewCell

Ini adalah contoh saya 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
sumber
-5

Saya mengalami masalah dengan ini dan mencoba banyak kombinasi hal-hal karena saya perhatikan bahwa untuk beberapa sel berfungsi dengan baik tetapi tidak untuk yang lain.

Anehnya saya menemukan bahwa adalah mungkin untuk mengatur cell.backgroundColor menjadi lightGrayColor dan semuanya bekerja dengan sempurna - tetapi blueColor menyebabkan saya masalah karena tidak memperbarui tepi luar.

Kecuali sangat penting untuk menggunakan warna hijau - mungkin Anda mungkin ingin mencobanya. Mungkin ini adalah fitur untuk membuat orang menggunakan hanya warna abu-abu saat menunjukkan bahwa sel dipilih.

Grouchal
sumber