2009-12-14 5 views
6

코어 그래픽을 사용하여 프로그래밍을 많이 해본 적은 없습니다. 그리고 이제는 레이어 속성을 통해 필요한 많은 작업을 수행하므로 QuartzCore를 사용하는 경향이 있습니다.그라디언트 색상의 둥근 사각형

그러나 현재 UIView가 있는데, 현재 그라디언트입니다. 나는 그라데이션을 그릴 때이 작업을 수행하지 않는이있는 UIView와 레이어 속성에 둥근 모서리를 추가하고 싶습니다 : 나는의 drawRect 방법에서 반올림 할 위치

- (void)drawRect:(CGRect)rect { 
    CGContextRef currentContext = UIGraphicsGetCurrentContext(); 

    CGGradientRef glossGradient; 
    CGColorSpaceRef rgbColorspace; 
    size_t num_locations = 2; 
    CGFloat locations[2] = { 0.0, 1.0 }; 
    CGFloat components[8] = { 1.0, 1.0, 1.0, 0.95, // Start color 
          1.0, 1.0, 1.0, 0.60 }; // End color 

    rgbColorspace = CGColorSpaceCreateDeviceRGB(); 
    glossGradient = CGGradientCreateWithColorComponents(rgbColorspace, components, locations, num_locations); 

    CGRect currentBounds = self.bounds; 
    CGPoint topCenter = CGPointMake(CGRectGetMidX(currentBounds), 0.0f); 
    CGPoint midCenter = CGPointMake(CGRectGetMidX(currentBounds), CGRectGetMaxY(currentBounds)); 
    CGContextDrawLinearGradient(currentContext, glossGradient, topCenter, midCenter, 0); 

    CGGradientRelease(glossGradient); 
    CGColorSpaceRelease(rgbColorspace); 
} 

정말 모르겠습니다. 감사.

+0

를 가져올 수 있는지 확인하십시오. 그게 효과가 있는지 알려주세요. – nash

답변

7

이전 질문 게시를 확인 했습니까? 나는 UIView를 마스킹하는 것에 대해 잠시 후에 읽었다. 저도 같은이 여기에 내가 무슨 짓을했는지


의 drawRect

How to mask a square image into an image with round corners in the iPhone SDK?

사용하는 모든 객체에 거의 적용 생각, 그리고 지금까지 내가 말할 수있는 잘 작동합니다.

먼저, 위의 게시물에서 Mr NilObject의 코드 스 니펫을 빌 렸습니다. 내가 UIView의 내 자신의 사용자 정의보기를 생성하는 서브 클래스

(그가 C의 기능을 대신하는 방법으로 쓴)

나는 물체에 맞도록 수정했습니다. 내 배경을 투명하게 만들기 위해 initWithRect을 오버로드시킨다.

그래서 기본적

:

  • 설정 투명한 배경 (INIT)에서, 또는 클립핑은,의 drawRect 먼저 클립 uggly
  • 수 클리핑 영역
내부 그리는 것

다음은 작업 예제입니다.

// 
// TeleView.m 
// 

#import "TeleView.h" 


@implementation TeleView 
/**** in init methods, set background to transparent, 
     otherwise, clipping shows a black background ****/ 

- (id) initWithFrame:(CGRect)frame { 
    if((self = [super initWithFrame:frame])) { 
     [self setBackgroundColor:[UIColor colorWithWhite:0.0f alpha:0.0f]]; 
    } 
    return self; 
} 
- (void) clipCornersToOvalWidth:(float)ovalWidth height:(float)ovalHeight 
{ 
    float fw, fh; 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGRect rect = CGRectMake(0.0f, 0.0f, self.frame.size.width, self.frame.size.height); 

    if (ovalWidth == 0 || ovalHeight == 0) { 
     CGContextAddRect(context, rect); 
     return; 
    } 
    CGContextSaveGState(context); 
    CGContextTranslateCTM (context, CGRectGetMinX(rect), CGRectGetMinY(rect)); 
    CGContextScaleCTM (context, ovalWidth, ovalHeight); 
    fw = CGRectGetWidth (rect)/ovalWidth; 
    fh = CGRectGetHeight (rect)/ovalHeight; 
    CGContextMoveToPoint(context, fw, fh/2); 
    CGContextAddArcToPoint(context, fw, fh, fw/2, fh, 1); 
    CGContextAddArcToPoint(context, 0, fh, 0, fh/2, 1); 
    CGContextAddArcToPoint(context, 0, 0, fw/2, 0, 1); 
    CGContextAddArcToPoint(context, fw, 0, fw, fh/2, 1); 
    CGContextClosePath(context); 
    CGContextRestoreGState(context); 
} 

-(void)drawRect:(CGRect)rect { 
    CGContextRef currentContext = UIGraphicsGetCurrentContext(); 
    /**** here is what I modified. ****/ 
    [self clipCornersToOvalWidth:20.0f height:20.0f]; 
    CGContextClip(currentContext); 

    /**** below this is your own code ****/ 
    CGGradientRef glossGradient; 
    CGColorSpaceRef rgbColorspace; 
    size_t num_locations = 2; 
    CGFloat locations[2] = { 0.0, 1.0 }; 
    CGFloat components[8] = { 1.0, 0.0, 0.0, 0.60, // Start color 
    0.0, 1.0, 0.0, 0.40 }; // End color 

    rgbColorspace = CGColorSpaceCreateDeviceRGB(); 
    glossGradient = CGGradientCreateWithColorComponents(rgbColorspace, components, locations, num_locations); 

    CGRect currentBounds = self.bounds; 
    CGPoint topCenter = CGPointMake(CGRectGetMidX(currentBounds), 0.0f); 
    CGPoint midCenter = CGPointMake(CGRectGetMidX(currentBounds), CGRectGetMaxY(currentBounds)); 
    CGContextDrawLinearGradient(currentContext, glossGradient, topCenter, midCenter, 0); 

    CGGradientRelease(glossGradient); 
    CGColorSpaceRelease(rgbColorspace); 

} 

@end 
+0

그래, 전에 이걸 봤어. 난 그냥 내 자신의 코드와 병합 할 수 없다 : ( – runmad

+0

당신이 그때 시도하면 어떻게됩니까? 당신은 무엇을 볼 수 있습니까? 오류가 있습니까? 당신은 어떻게 통합하려고합니까? – nash

+0

그것은 중 하나 또는 .. 내가 모서리를 돌면 내가 할 수 없어 그래디언트 코드를 사용하고 그 반대도 마찬가지입니다. 두 가지를 잘못 병합하고 있다고 확신하지만 CG는 실제로 많은 경험이있는 것은 아닙니다 – runmad

7
NSArray *colors = [NSArray arrayWithObjects:fromColor.CGColor,toColor.CGColor, nil]; 

NSNumber *stopOne = [NSNumber numberWithFloat:0.0]; 
NSNumber *stopTwo = [NSNumber numberWithFloat:1.0]; 

NSArray *locations = [NSArray arrayWithObjects:stopOne, stopTwo, nil]; 

CAGradientLayer *headerLayer = [CAGradientLayer layer]; 
headerLayer.colors = colors; 
headerLayer.locations = locations; 

headerLayer.borderColor = borderColor.CGColor; // border line color**strong text** 
headerLayer.borderWidth = width;// For Thickness of border line 
headerLayer.cornerRadius = radius;//For Rounded Corner if You want to make rounded Corner 

headerLayer.frame = frame; 

[view.layer insertSublayer:headerLayer atIndex:0]; 

또한 "QuartzCore"프레임 워크 내가 작업 예제와 아래 내 대답을 업데이 트했습니다

관련 문제