2013-04-22 3 views
3

Как рисовать или рисовать прямую линию с двумя пальцами с видимой линией, когда перетаскивание или касание все еще выполняется пользователем? Я уже пробовал простую живопись с использованием coregraphics, но для меня это немного сложно.Нарисуйте прямую линию двумя пальцами

+1

След коснется в касанииБеган и прикосновенияМуд. Нарисуйте их в виде DrawRect с использованием CoreGraphics. –

+0

Я могу отслеживать штрихи сейчас, на мой взгляд, вопросы с двумя пальцами, как определить текущую позицию (x и y) другого пальца? Поскольку мне нужно получить как х, так и 1-й и 2-й пальцы, чтобы определить, где рисовать линию. –

+1

@jeraldov: каждое касание соответствует пальцу. –

ответ

3

Точка Justin, только ручка touchesBegan и touchesMoved.

Таким образом, если вы подкласс UIView, реализация CoreGraphics может выглядеть следующим образом:

@interface CustomView() 

@property (nonatomic, strong) NSMutableArray *paths; 
@property (nonatomic, strong) UIBezierPath *currentPath; 

@end 

@implementation CustomView 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 
     [self setMultipleTouchEnabled:YES]; 
    } 
    return self; 
} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    if (!self.currentPath) 
    { 
     if (!self.paths) 
      self.paths = [NSMutableArray array]; 

     self.currentPath = [UIBezierPath bezierPath]; 
     self.currentPath.lineWidth = 3.0; 

     [self.paths addObject:self.currentPath]; 

     [self touchesMoved:touches withEvent:event]; 
    } 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    if ([touches count] != 2) 
     return; 

    [self.currentPath removeAllPoints]; 

    __block NSInteger i = 0; 
    [touches enumerateObjectsUsingBlock:^(UITouch *touch, BOOL *stop) { 
     CGPoint location = [touch locationInView:self]; 

     if (i++ == 0) 
      [self.currentPath moveToPoint:location]; 
     else 
      [self.currentPath addLineToPoint:location]; 
    }]; 

    [self setNeedsDisplay]; 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    self.currentPath = nil; 
} 

- (void)drawRect:(CGRect)rect 
{ 
    [[UIColor redColor] setStroke]; 
    [[UIColor clearColor] setFill]; 

    for (UIBezierPath *path in self.paths) 
    { 
     [path stroke]; 
    } 
} 

- (void)reset 
{ 
    self.paths = nil; 
    [self setNeedsDisplay]; 
} 

@end 

В качестве альтернативы, вы можете также использовать Quartz 2D и определить собственные CAShapeLayer объектов, а затем либо ваш вид подкласса или ваш контроллер представления могли бы сделать что-то вроде (само собой разумеется, это реализация вид контроллера, реализация зрения должно быть очевидно):

#import "ViewController.h" 
#import <QuartzCore/QuartzCore.h> 

@interface ViewController() 

@property (nonatomic, weak) CAShapeLayer *currentLayer; 
@property (nonatomic, strong) UIBezierPath *currentPath; 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    [self.view setMultipleTouchEnabled:YES]; 
} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    if (!self.currentLayer) 
    { 
     CAShapeLayer *layer = [CAShapeLayer layer]; 
     layer.lineWidth = 3.0; 
     layer.strokeColor = [[UIColor redColor] CGColor]; 
     layer.fillColor = [[UIColor clearColor] CGColor]; 
     [self.view.layer addSublayer:layer]; 
     self.currentLayer = layer; 

     self.currentPath = [UIBezierPath bezierPath]; 

     [self touchesMoved:touches withEvent:event]; 
    } 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    if ([touches count] != 2) 
     return; 

    [self.currentPath removeAllPoints]; 

    __block NSInteger i = 0; 
    [touches enumerateObjectsUsingBlock:^(UITouch *touch, BOOL *stop) { 
     CGPoint location = [touch locationInView:self.view]; 

     if (i++ == 0) 
      [self.currentPath moveToPoint:location]; 
     else 
      [self.currentPath addLineToPoint:location]; 
    }]; 

    self.currentLayer.path = [self.currentPath CGPath]; 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    self.currentPath = nil; 
    self.currentLayer = nil; 
} 

- (IBAction)didTouchUpInsideClearButton:(id)sender 
{ 
    for (NSInteger i = [self.view.layer.sublayers count] - 1; i >= 0; i--) 
    { 
     if ([self.view.layer.sublayers[i] isKindOfClass:[CAShapeLayer class]]) 
      [self.view.layer.sublayers[i] removeFromSuperlayer]; 
    } 
} 

@end 

для этого последнего подхода, необходимо add the QuartzCore.framework to your project.