이전 질문 게시를 확인 했습니까? 나는 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
를 가져올 수 있는지 확인하십시오. 그게 효과가 있는지 알려주세요. – nash