Làm cách nào để tùy chỉnh màu nền / đường viền của ô xem bảng được nhóm lại?


114

Tôi muốn tùy chỉnh cả màu nền và màu viền của UITableView kiểu nhóm.

Tôi có thể tùy chỉnh màu nền bằng cách sử dụng như sau:

tableView.contentView.backgroundColor = [UIColor greenColor];

Nhưng màu viền vẫn là thứ tôi không biết thay đổi.

Làm cách nào để tuỳ chỉnh hai khía cạnh này của chế độ xem bảng kiểu nhóm?


Điều quan trọng là phải đảm bảo rằng chế độ xem IBOutlet của UITableViewController của bạn đã được thiết lập, nếu không tính trong suốt sẽ không hoạt động!
Casebash

1
Bạn không chắc chắn làm thế nào để dòng mã của bạn hoạt động. tableView dường như không có thuộc tính contentView.
Greg Maletic

5
Chủ đề nói về nền tảng của UITableViewCell chứ không phải về UITableView (như câu hỏi gợi ý). Câu trả lời thực sự sẽ là câu trả lời của @ dizy.
nacho4d

Câu trả lời:


100

CẬP NHẬT: Trong hệ điều hành iPhone 3.0 và mới hơn UITableViewCellbây giờ có một thuộc backgroundColortính giúp điều này thực sự dễ dàng (đặc biệt là khi kết hợp với bộ [UIColor colorWithPatternImage:]khởi tạo). Nhưng tôi sẽ để phiên bản 2.0 của câu trả lời ở đây cho bất kỳ ai cần nó…


Nó khó hơn so với thực tế. Đây là cách tôi đã làm điều này khi tôi phải làm điều đó:

Bạn cần đặt thuộc tính backgroundView của UITableViewCell thành UIView tùy chỉnh để tự vẽ đường viền và nền bằng các màu thích hợp. Dạng xem này cần có khả năng vẽ các đường viền ở 4 chế độ khác nhau, làm tròn ở trên cùng cho ô đầu tiên trong một phần, làm tròn ở dưới cùng cho ô cuối cùng trong một phần, không có góc tròn cho các ô ở giữa phần và được làm tròn ở cả 4 góc đối với các phần chứa một ô.

Rất tiếc, tôi không thể tìm ra cách đặt chế độ này tự động, vì vậy tôi phải đặt nó trong phương thức -cellForRowAtIndexPath của UITableViewDataSource.

Đó là một PITA thực sự nhưng tôi đã xác nhận với các kỹ sư của Apple rằng đây là cách duy nhất.

Cập nhật Đây là mã cho chế độ xem bg tùy chỉnh đó. Có một lỗi vẽ khiến các góc tròn trông hơi buồn cười, nhưng chúng tôi đã chuyển sang một thiết kế khác và loại bỏ các hình nền tùy chỉnh trước khi tôi có cơ hội sửa nó. Tuy nhiên, điều này có thể sẽ rất hữu ích cho bạn:

//
//  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
}

Bạn có thể giúp tôi bằng cách sử dụng mã của bạn? => stackoverflow.com/questions/7309580/…
Nielsou Hacken-Bergen

2
Tại sao không sử dụng seperatorColor? Đối với tôi, nó tô màu cho cả đường phân cách giữa các ô và đường viền.
Fernando Redondo

Thay vì các đường vòng cung của drawRect CG đó, tôi đã sử dụng chế độ xem cắt bớt với tất cả các góc được làm tròn. Tôi cho nó là Y phủ định cho các hàng không phải đầu tiên và tôi đặt nó là over-height-ed cho các hàng không phải cuối cùng.
Hafthor

34

Tôi biết các câu trả lời liên quan đến việc thay đổi các ô trong bảng được nhóm lại, nhưng trong trường hợp ai đó cũng muốn thay đổi màu nền của chế độ xem bảng:

Bạn không chỉ cần thiết lập:

tableview.backgroundColor = color;

Bạn cũng cần thay đổi hoặc loại bỏ chế độ xem nền:

tableview.backgroundView = nil;  

1
Này cảm ơn nhé. Bạn đã đưa ra câu trả lời chính xác cho câu hỏi này một cách cụ thể.
GeneCode

24

Trước hết, cảm ơn vì mã này. Tôi đã thực hiện một số thay đổi bản vẽ trong chức năng này để loại bỏ vấn đề góc của bản vẽ.

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

Chiều rộng dòng với mã của bạn là khoảng 2 px. Khi tôi cố gắng đặt CGContextSetLineWidth thành 1, nó vẫn dày. Tại sao thế này?
Fernando Redondo

Tôi có cùng một câu hỏi? tại sao nó dày hơn hệ thống.
Bagusflyer

16

Cảm ơn bạn vì mã, nó chỉ là những gì tôi đang tìm kiếm. Tôi cũng đã thêm mã sau vào mã của Vimal, để triển khai trường hợp của ô CustomCellBackgroundViewPositionSingle. (Tất cả bốn góc đều được làm tròn.)


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

Một điều tôi gặp phải với mã CustomCellBackgroundView ở trên từ Mike Akers, có thể hữu ích cho những người khác:

cell.backgroundViewkhông được tự động vẽ lại khi các ô được sử dụng lại và các thay đổi đối với vị trí var của backgroundView không ảnh hưởng đến các ô được sử dụng lại. Điều đó có nghĩa là các bảng dài sẽ được vẽ sai cell.backgroundViewsvị trí của chúng.

Để khắc phục điều này mà không cần phải tạo một backgroundView mới mỗi khi một hàng được hiển thị, hãy gọi [cell.backgroundView setNeedsDisplay]vào cuối của bạn -[UITableViewController tableView:cellForRowAtIndexPath:]. Hoặc để có giải pháp tái sử dụng nhiều hơn, hãy ghi đè bộ định vị vị trí của CustomCellBackgroundView để bao gồm một [self setNeedsDisplay].


Ý tưởng tốt về trọng -setPosition
Mike Akers

12

Cảm ơn vì bài viết siêu hữu ích này. Trong trường hợp bất kỳ ai ngoài đó (như tôi!) Chỉ muốn có nền ô hoàn toàn trống thay vì tùy chỉnh nó thông qua hình ảnh / văn bản / nội dung khác trong IB và không thể tìm ra cách quái nào để loại bỏ đường viền ngu ngốc / padding / nền mặc dù bạn đã đặt nó thành xóa trong IB ... đây là mã tôi đã sử dụng để thực hiện thủ thuật!


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

Hy vọng rằng điều đó sẽ giúp ích cho người khác! Có vẻ làm việc như một cái duyên.


Có một lỗ hổng bộ nhớ trong giải pháp của bạn. Bạn cần phải tự động khôi phục chế độ xem bạn đang đặt cell.backgroundView.
Cameron Spickert

7

Rất cảm ơn tất cả những người đã đăng mã của họ. Điều này rất hữu ích.

Tôi đã tìm ra một giải pháp tương tự để thay đổi màu đánh dấu cho các ô xem bảng được nhóm lại. Về cơ bản, UITableViewCell đã chọnBackgroundView (không phải backgroundView). Mà ngay cả trên iPhone OS 3.0 vẫn cần giải pháp PITA này, theo như tôi có thể nói ...

Đoạn mã dưới đây có các thay đổi để hiển thị vùng sáng bằng một gradient thay vì một màu đồng nhất. Ngoài ra, kết xuất đường viền cũng bị loại bỏ. Thưởng thức.

//
//  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
}

Điều này thực sự tuyệt vời và những gì tôi đang tìm kiếm. Tôi cần hai lựa chọn. đặt bg dưới dạng gradient hoặc màu đặc. Tôi đặt màu đồng nhất chỉ bằng cách đặt cả màu gradient thành cùng một màu mà tôi muốn. Tuy nhiên, nó áp đặt tính toán không ngừng. Thật tuyệt nếu có một số tùy chọn như vậy.
karim

4

Bạn có thể tùy chỉnh màu viền bằng cách cài đặt

tableView.separatorColor

2

Để thay đổi màu đường viền của chế độ xem bảng:

Trong.h:

#import <QuartzCore/QuartzCore.h>

Trong .m:

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

0

Tác vụ này có thể dễ dàng thực hiện bằng PrettyKit bằng cách thêm khoảng 5 dòng mã. Nếu bạn sử dụng nibtệp hoặc storyboard, cũng đừng quên áp dụng thủ thuật nhỏ này . Khi bạn sử dụng phương pháp này, bạn nên phân lớp ô của mình từ PrettyTableViewCell:

#import <PrettyKit/PrettyKit.h>

@class RRSearchHistoryItem;

@interface RRSearchHistoryCell : PrettyTableViewCell

Đây là ví dụ về 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

Tôi đã gặp vấn đề với điều này và đã thử kết hợp nhiều thứ khi tôi nhận thấy rằng đối với một số tế bào, nó hoạt động tốt nhưng với những tế bào khác thì không.

Thật kỳ lạ, tôi phát hiện ra rằng có thể đặt cell.backgroundColor thành lightGrayColor và tất cả đều hoạt động hoàn hảo - nhưng blueColor khiến tôi gặp sự cố không cập nhật các cạnh bên ngoài.

Trừ khi nó thực sự quan trọng để sử dụng màu xanh lá cây - có lẽ bạn có thể muốn thử điều này. Có thể đây là một tính năng để khiến mọi người chỉ sử dụng màu xám khi cho biết một ô được chọn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.