2014-11-14 1 views
1

다음 코드를 사용하여 UIView에 선을 그립니다. 그러나 그림 그리기를 시작하면보기가 진회색이됩니다. 배경을 투명하게 만들려면 어떻게해야합니까? backgroundColor을 이미 clearColor으로 설정했지만 배경은 여전히 ​​어두운 회색입니다. 내가 놓친 게 무엇입니까?투명 배경이있는 UIView에 선 그리기

@interface CanvasView() { 
    UIColor *colorLine; 
    UIBezierPath *pathBezier; 
} 

@end 

@implementation CanvasView 
@synthesize imgCached; 

- (id)initWithCoder:(NSCoder *)aDecoder { 
    self = [super initWithCoder:aDecoder]; 
    if(self) { 
     self.backgroundColor = [UIColor clearColor]; 
     [self setMultipleTouchEnabled:NO]; 
     pathBezier = [[UIBezierPath alloc] init]; 
     pathBezier.lineWidth = 5; 

     colorLine = [UIColor redColor]; 
    } 
    return self; 
} 

- (void)drawRect:(CGRect)rect { 
    [self.imgCached drawInRect:rect]; 
    [pathBezier stroke]; 
} 

- (void)drawCache { 
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, YES, 0.0); 
    [colorLine setStroke]; 
    if(!self.imgCached) { 
     UIBezierPath *rectpath = [UIBezierPath bezierPathWithRect:self.bounds]; 
     [rectpath fill]; 
    } 
    [self.imgCached drawAtPoint:CGPointZero]; 
    [pathBezier stroke]; 
    self.imgCached = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
} 

- (void)clearGraphics { 
    self.imgCached = nil; 
    [pathBezier removeAllPoints]; 
    [self setNeedsDisplay]; 
} 

#pragma mark - Touch methods 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [[touches allObjects] objectAtIndex:0]; 
    [pathBezier moveToPoint:[touch locationInView:self]]; 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [[touches allObjects] objectAtIndex:0]; 
    [pathBezier addLineToPoint:[touch locationInView:self]]; 

    [self setNeedsDisplay]; 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    CGPoint p = [touch locationInView:self]; 
    [pathBezier addLineToPoint:p]; 
    [self drawCache]; 
    [self setNeedsDisplay]; 
    [pathBezier removeAllPoints]; 
} 

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { 
    [self touchesEnded:touches withEvent:event]; 
} 

p.s. imgCached은 다음과 같습니다

@property (nonatomic, strong) UIImage *imgCached; 
+1

를'당신이 YES로'opaque' 매개 변수를 설정 UIGraphicsBeginImageContextWithOptions'. 이 문제를 완전히 해결할 지 확신 할 수는 없지만 이것을 '아니오'로 설정해야합니다. –

답변

2

은 다음으로 drawRect:drawCache 방법을 바꾸기 : 통화에서

- (void)drawRect:(CGRect)rect { 
    [self.imgCached drawInRect:rect]; 
    [colorLine setStroke]; 
    [pathBezier stroke]; 
} 

- (void)drawCache { 
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 0.0); 
    [colorLine setStroke]; 
    [self.imgCached drawAtPoint:CGPointZero]; 
    [pathBezier stroke]; 
    self.imgCached = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
} 
+0

잘 작동하지만 코드를 조금 설명 할 수 있습니까? 고맙습니다 ! – Raptor

+1

실제로 그다지 중요하지 않습니다. 코드는 기본적으로 정확했지만 몇 가지 사소한 변화가있었습니다. 'drawRect :'에서 획 색상을 설정하는 것을 잊었습니다. 'drawCache'에서 전체 화면을 사용하여 베 지어 경로를 만든 다음 배경을 검정색으로 설정했습니다 (기본 채우기 색이 분명히 검은 색이기 때문에 검정색으로 채움). –

+0

이것은 정말로 도움이되었습니다! 감사 –