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

в вызове 'UIGraphicsBeginImageContextWithOptions' вы установите' opaque' параметр YES. Вам нужно установить это значение «НЕТ», хотя я не уверен, что это полностью решит вашу проблему. –

ответ

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

Это было действительно полезно! благодаря –