2010-11-19 3 views
2

그라디언트를 여러 가지 방법으로 배경 뷰 셀 배경에 넣으려고했지만 아무 것도 작동하지 않는 것 같습니다. 나는 Quarz 코어 그래픽으로 그려 보려고 노력했다. 배경 콘센트를 IB에 다른 시각으로 배치하고 코드 뷰로 이미지 뷰를 넣으려고했다. 아무 것도 뒤에서 어떻게 든 나타나지 않는 것 같습니다. 나는 틀린 것을 얻지 못합니다. 필요한 경우 정교 할 수 있습니다. 감사합니다!테이블 뷰 셀 배경에 그라디언트 퍼팅

답변

2

this question에 일부 코드가 있으며 응용 프로그램과 함께 작동하도록 수정되었습니다. 일반 테이블과 그룹화 된 테이블 모두에서 잘 작동합니다.

// 
// UAGradientCellBackgroundLayer.h 
// 

#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 

#import <QuartzCore/QuartzCore.h> 

@class UAGradientCellBackgroundView; 

@interface UAGradientCellBackgroundLayer : CAGradientLayer { 
    CGFloat  *colorComponents; 
    BOOL  _override; 
} 

@property(nonatomic,assign) BOOL override; 

- (void)setColorComponents:(CGFloat *)components; 

@end 

// 
// UAGradientCellBackgroundLayer.m 
// 

#import "UAGradientCellBackgroundLayer.h" 
#import "UAGradientCellBackgroundView.h" 

#define TABLE_CELL_BACKGROUND         {1, 1, 1, 1, 204/255.0, 204/255.0, 204/255.0, 1}  // #FFFFFF and #DDDDDD 

@implementation UAGradientCellBackgroundLayer 

@synthesize override = _override; 

/////////////////////////////////////////////////////////////////////////////////////////////////// 
- (id)init { 
    if ((self = [super init])) { 
     colorComponents = NSZoneMalloc(NSDefaultMallocZone(), 8*sizeof(CGFloat)); 
     CGFloat c[8] = TABLE_CELL_BACKGROUND; 
     for (int i = 0; i < 8; i++) { 
      colorComponents[i] = c[i]; 
     } 
     // self.cornerRadius = 10; 
     // self.backgroundColor = [UIColor clearColor].CGColor; 
    } 
    return self; 
} 

- (void) dealloc { 
    NSZoneFree(NSDefaultMallocZone(), colorComponents); 
    [super dealloc]; 
} 
- (void)display { 
    if (_override) { 
     self.colors = 
     [NSArray arrayWithObjects: 
     (id)[UIColor colorWithRed:colorComponents[0] green:colorComponents[1] blue:colorComponents[2] alpha:colorComponents[3]].CGColor, 
     (id)[UIColor colorWithRed:colorComponents[4] green:colorComponents[5] blue:colorComponents[6] alpha:colorComponents[7]].CGColor, 
     nil]; 
    } else { 
     self.colors = 
     [NSArray arrayWithObjects: 
     (id)[UIColor clearColor].CGColor, 
     (id)[UIColor clearColor].CGColor, 
     nil]; 
    } 
    [super display]; 
} 

- (void)setColorComponents:(CGFloat *)components { 
    for (int i = 0; i < 8; i++) { 
     colorComponents[i] = components[i]; 
    } 
} 

@end 

// 
// UAGradientCellBackgroundView.h 
// 

#import <Foundation/Foundation.h> 

#import <UIKit/UIKit.h> 

typedef enum { 
    UAGradientCellBackgroundViewPositionMiddle = 0, 
    UAGradientCellBackgroundViewPositionTop, 
    UAGradientCellBackgroundViewPositionBottom, 
    UAGradientCellBackgroundViewPositionSingle, 
    UAGradientCellBackgroundViewPositionPlain 
} UAGradientCellBackgroundViewPosition; 

@interface UAGradientCellBackgroundView : UIView { 
    UAGradientCellBackgroundViewPosition position; 
    CGFloat colors[8]; 
} 

@property(nonatomic, assign) UAGradientCellBackgroundViewPosition position; 

- (void)setColors:(CGFloat[8])comps; 

@end 

// 
// UAGradientCellBackgroundView.m 
// 

#import "UAGradientCellBackgroundView.h" 
#import "UAGradientCellBackgroundLayer.h" 
#import <QuartzCore/QuartzCore.h> 

#define kDefaultMargin           10 
#define TABLE_CELL_BACKGROUND         {1, 1, 1, 1, 204/255.0, 204/255.0, 204/255.0, 1}  // #FFFFFF and #DDDDDD 

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

@implementation UAGradientCellBackgroundView 

@synthesize position; 

////////////////////////////////////////////////////////////////////// 
// PLAIN CELL 
// 
// layerClass 
// 
// returns a CAGradientLayer class as the default layer class for this view 
// 
+ (Class)layerClass { 
    return [UAGradientCellBackgroundLayer class]; 
} 

////////////////////////////////////////////////////////////////////// 
- (void)updateLayer { 
    UAGradientCellBackgroundLayer* layer = (UAGradientCellBackgroundLayer*)self.layer; 
     // This is dramatically faster than calling drawRect. 
    [layer setColorComponents:colors]; 
    layer.override = (self.position == UAGradientCellBackgroundViewPositionPlain); 
    [layer setNeedsDisplay]; 
} 

//////////////////////////////////////////////////////////////////// 
// GROUPED CELL 
- (void)setColors:(CGFloat[8])comps { 
    for (int i = 0; i < 8; i++) { 
     colors[i] = comps[i]; 
    } 
} 

- (BOOL)isOpaque { 
    return YES; 
} 

- (id)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self != nil) { 
     CGFloat comps[8] = TABLE_CELL_BACKGROUND; 
     [self setColors:comps]; 
    } 
    return self; 
} 

- (void)debugView:(UIView *)view { 
    NSLog(@"%@ - %@", view.backgroundColor, [[view class] description]); 
    for (UIView* child in view.subviews) { 
     [self debugView:child]; 
    } 
} 

-(void)drawRect:(CGRect)aRect { 
    [super drawRect:aRect]; 
    // Drawing code 
    if (position == UAGradientCellBackgroundViewPositionPlain) { 
     return; 
    } 

    CGContextRef c = UIGraphicsGetCurrentContext(); 

    // TODO - Dirty, Dirty hack to fix the background black corners on pop issue. doesnt handle rotation. 
// CGContextSetFillColorWithColor(c, [UAColor offsetPinstripesColor].CGColor); 
// CGContextFillRect(c, aRect); 

    int lineWidth = 1; 

    CGRect rect = [self bounds]; 
    rect.size.width -= lineWidth; 
    rect.size.height -= lineWidth; 
    rect.origin.x += lineWidth/2.0; 
    rect.origin.y += lineWidth/2.0; 

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

    CGFloat locations[2] = { 0.0, 1.0 };  
    CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB(); 
    CGGradientRef myGradient = nil; 

    CGContextSetStrokeColorWithColor(c, [UIColor darkGrayColor].CGColor); 
    CGContextSetLineWidth(c, lineWidth); 
    CGContextSetAllowsAntialiasing(c, YES); 
    CGContextSetShouldAntialias(c, YES); 

    if (position == UAGradientCellBackgroundViewPositionTop) { 
     miny += 1; 

     CGMutablePathRef path = CGPathCreateMutable(); 
     CGPathMoveToPoint(path, NULL, minx, maxy); 
     CGPathAddArcToPoint(path, NULL, minx, miny, midx, miny, kDefaultMargin); 
     CGPathAddArcToPoint(path, NULL, maxx, miny, maxx, maxy, kDefaultMargin); 
     CGPathAddLineToPoint(path, NULL, maxx, maxy); 
     CGPathAddLineToPoint(path, NULL, minx, maxy); 
     CGPathCloseSubpath(path); 

     // Fill and stroke the path 
     CGContextSaveGState(c); 
     CGContextAddPath(c, path); 
     CGContextClip(c); 

     myGradient = CGGradientCreateWithColorComponents(myColorspace, colors, locations, 2); 
     CGContextDrawLinearGradient(c, myGradient, CGPointMake(minx,miny), CGPointMake(minx,maxy), 0); 

     CGContextAddPath(c, path); 
     CGPathRelease(path); 
     CGContextStrokePath(c); 
     CGContextRestoreGState(c); 

    } else if (position == UAGradientCellBackgroundViewPositionBottom) { 
     //maxy -= 1; // -1 for the shadow 

     CGMutablePathRef path = CGPathCreateMutable(); 
     CGPathMoveToPoint(path, NULL, minx, miny); 
     CGPathAddArcToPoint(path, NULL, minx, maxy, midx, maxy, kDefaultMargin); 
     CGPathAddArcToPoint(path, NULL, maxx, maxy, maxx, miny, kDefaultMargin); 
     CGPathAddLineToPoint(path, NULL, maxx, miny); 
     CGPathAddLineToPoint(path, NULL, minx, miny); 
     CGPathCloseSubpath(path); 

     // Fill and stroke the path 
     CGContextSaveGState(c); 
     CGContextAddPath(c, path); 
     CGContextClip(c); 

     myGradient = CGGradientCreateWithColorComponents(myColorspace, colors, locations, 2); 
     CGContextDrawLinearGradient(c, myGradient, CGPointMake(minx,miny), CGPointMake(minx,maxy), 0); 

     CGContextAddPath(c, path); 
     CGPathRelease(path); 
     CGContextStrokePath(c); 
     CGContextRestoreGState(c); 


    } else if (position == UAGradientCellBackgroundViewPositionMiddle) { 

     CGMutablePathRef path = CGPathCreateMutable(); 
     CGPathMoveToPoint(path, NULL, minx, miny); 
     CGPathAddLineToPoint(path, NULL, maxx, miny); 
     CGPathAddLineToPoint(path, NULL, maxx, maxy); 
     CGPathAddLineToPoint(path, NULL, minx, maxy); 
     CGPathAddLineToPoint(path, NULL, minx, miny); 
     CGPathCloseSubpath(path); 

     // Fill and stroke the path 
     CGContextSaveGState(c); 
     CGContextAddPath(c, path); 
     CGContextClip(c); 

     myGradient = CGGradientCreateWithColorComponents(myColorspace, colors, locations, 2); 
     CGContextDrawLinearGradient(c, myGradient, CGPointMake(minx,miny), CGPointMake(minx,maxy), 0); 

     CGContextAddPath(c, path); 
     CGPathRelease(path); 
     CGContextStrokePath(c); 
     CGContextRestoreGState(c); 

    } else if (position == UAGradientCellBackgroundViewPositionSingle) { 
     miny += 1; 
     //maxy -= 1; // -1 for the shadow 

     CGMutablePathRef path = CGPathCreateMutable(); 
     CGPathMoveToPoint(path, NULL, minx, midy); 
     CGPathAddArcToPoint(path, NULL, minx, miny, midx, miny, kDefaultMargin); 
     CGPathAddArcToPoint(path, NULL, maxx, miny, maxx, midy, kDefaultMargin); 
     CGPathAddArcToPoint(path, NULL, maxx, maxy, midx, maxy, kDefaultMargin); 
     CGPathAddArcToPoint(path, NULL, minx, maxy, minx, midy, kDefaultMargin); 
     CGPathCloseSubpath(path); 

     // Shadow 
//  CGContextAddPath(c, path); 
//  CGContextSaveGState(c); 
//  CGContextSetShadow(c, CGSizeMake(0, -1), 1); 
//  CGContextFillPath(c); 

     // Fill and stroke the path 
     CGContextSaveGState(c); 
     CGContextAddPath(c, path); 
     CGContextClip(c); 


     myGradient = CGGradientCreateWithColorComponents(myColorspace, colors, locations, 2); 
     CGContextDrawLinearGradient(c, myGradient, CGPointMake(minx,miny), CGPointMake(minx,maxy), 0); 

     CGContextAddPath(c, path); 
     CGPathRelease(path); 
     CGContextStrokePath(c); 
     CGContextRestoreGState(c); 

    } 
    CGColorSpaceRelease(myColorspace); 
    CGGradientRelease(myGradient); 
    return; 
} 

- (void)setPosition:(UAGradientCellBackgroundViewPosition)newPosition { 
    if (position != newPosition) { 
     position = newPosition; 
     [self updateLayer]; 
    } 
} 

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

사용 예제 (일반 테이블) :이 배경으로 작동하지 않습니다 이유

#import "UAGradientCellBackgroundView.h" 
CGFloat COLORS[8] = { 0.0/255, 0.0/255, 255.0/255, 1.0, 0.0/255, 0.0/255, 0.0/255, 1.0 } 
... 

- (UITableViewCell *)tableView:(UITableView *)table cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSString *cellID = @"CellID"; 

    // create cell 
    UITableViewCell *cell = (UITableViewCell *)[table dequeueReusableCellWithIdentifier:cellID]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID] autorelease]; 

     UAGradientCellBackgroundView *bgView = [[[UAGradientCellBackgroundView alloc] initWithFrame:CGRectZero] autorelease]; 
     [bgView setBackgroundColor:[UIColor clearColor]]; 
     [bgView setColors:COLORS]; 
     [bgView setPosition:UAGradientCellBackgroundViewPositionPlain]; 
     cell.selectedBackgroundView = bgView; 
     cell.textLabel.backgroundColor = [UIColor clearColor]; 

     cell.imageView.image = [UIImage imageNamed:@"cellimg.png"]; 
    } 

    cell.textLabel.text = @"Text"; 
    return cell; 
} 
+0

나는 배경이 단지 세포 seperators 어두운하게보기로 설정하려고하면, 내가하지 않습니다 보기,하지만 그것은 선택한보기로 작동합니까? –

+0

음 ... 'selectedBackgroundView'를'backgroundView'로 변경하면 코드에 다른 문제가 있거나 붙여 넣은 코드를 변경 한 것입니다. 셀의 배경색과 배경을 모두 설정하고 있습니까? 또는 다양한 그라디언트가있는 여러 유형의 셀을 보유하고 있으며 다른 셀 ID를 사용하지 않고 있습니까? - 이것들은 내가 어느 시점에서 만난 두 가지 문제 일뿐입니다. – cristis