2013-02-17 5 views
3

새로운 프로그래머가 단계별로 조치를 취하려고 여기에 있습니다. 현재 기기에서 터치 된 위치를 중심으로 원을 그리는 방법을 찾으려고합니다. 화면에 두 손가락, 각 손가락 아래 한 원.장치의 각 터치 위치 주변에 원을 그리려면 어떻게합니까?

현재 원터치 위치에 원을 그리는 작업 코드가 있지만 화면에 다른 손가락을 놓으면 원이 두 번째 터치 위치로 이동하여 첫 번째 터치 위치는 비워 둡니다. 3 등분을 추가하면 거기로 이동합니다.

이상적으로는 각 손가락마다 하나씩 최대 5 개의 활성 원을 가질 수 있기를 바랍니다.

다음은 현재 코드입니다.

@interface TapView() 
@property (nonatomic) BOOL touched; 
@property (nonatomic) CGPoint firstTouch; 
@property (nonatomic) CGPoint secondTouch; 
@property (nonatomic) int tapCount; 
@end 

@implementation TapView 

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
[super touchesBegan:touches withEvent:event]; 

NSArray *twoTouch = [touches allObjects]; 
    if(touches.count == 1) 
    { 
     self.tapCount = 1; 
     UITouch *tOne = [twoTouch objectAtIndex:0]; 
     self.firstTouch = [tOne locationInView:[tOne view]]; 
     self.touched = YES; 
     [self setNeedsDisplay]; 
    } 
    if(touches.count > 1 && touches.count < 3) 
    { 
     self.tapCount = 2; 
     UITouch *tTwo = [twoTouch objectAtIndex:1]; 
     self.secondTouch = [tTwo locationInView:[tTwo view]]; 
     [self setNeedsDisplay]; 
    } 
} 
-(void)drawRect:(CGRect)rect 
{ 
     if(self.touched && self.tapCount == 1) 
     { 
      [self drawTouchCircle:self.firstTouch :self.secondTouch]; 
     } 
} 
-(void)drawTouchCircle:(CGPoint)firstTouch :(CGPoint)secondTouch 
{ 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextSetRGBStrokeColor(ctx,0.1,0.1,0.1,1.0); 
    CGContextSetLineWidth(ctx,10); 
    CGContextAddArc(ctx,self.firstTouch.x,self.firstTouch.y,30,0.0,M_PI*2,YES); 
    CGContextStrokePath(ctx); 
} 

나는 setMultipleTouchEnabled:YES이 appDelegate.m 내 didFinishLaunchingWithOptions 방법에 선언해야합니까.

나는 self.tapCount에 따라 self.secondTouch.xself.firstTouch.x을 변경하지만 그 어떤 터치 위치에서 어떤 원으로 나를 떠나 전체를 깰 것 같다 drawTouchCircle 방법에 if 문을 사용하려고했습니다.

내 문제를 찾기 위해 엄청난 어려움을 겪고 있습니다. 아주 간단 할 수도 있습니다.

답변

3

방금 ​​작동하는 일부 코드를 작성했습니다. 이라는 NSMutableArray 속성을보기에 추가했으며 각 서클에 UIBezierPath이 포함되어 있습니다. -awakeFromNib에서 배열을 설정하고 self.multipleTouchEnabled = YES을 설정하십시오. (appDelegate.m의 뷰에 대한 참조를 사용하여이 작업을 수행 한 것 같습니다).

이 메서드는 -touchesBegan-touchesMoved 메서드에서 호출합니다. 종료

-(void)setCircles:(NSSet*)touches 
{ 
    [_circles removeAllObjects]; //clear circles from previous touch 

    for(UITouch *t in touches) 
    { 
     CGPoint pt= [t locationInView:self]; 
     CGFloat circSize = 200; //or whatever you need 
     pt = CGPointMake(pt.x - circSize/2.0, pt.y - circSize/2.0); 
     CGRect circOutline = CGRectMake(pt.x, pt.y, circSize, circSize); 
     UIBezierPath *circle = [UIBezierPath bezierPathWithOvalInRect:circOutline]; 
     [_circles addObject:circle]; 
    } 
    [self setNeedsDisplay]; 
} 

접촉은 다음과 같습니다

-(void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event 
{ 
    [_circles removeAllObjects]; 
    [self setNeedsDisplay]; 

} 

그럼 루프 -drawRect에서 circles 내가 정말 여전히 아주 새로운 해요 나를 용서하지만 내 생각은 각각

+0

[circle stroke] 전화를 통해 나는'-drawRect'에서'circle '을 반복 할 때까지 여러분이 말한 것을 잘 처리 할 수있었습니다. 배열의 각 객체를 단계별로 실행 하시겠습니까? 그 일에 대해 어떻게 생각해? – BendE

+0

내'-drawRect'는 루프를 가지고 있습니다 : for (UIBezierPath * circle in _circles) {[circle stroke]; }'. 경계를 그리는 대신 원을 채우고 싶다면'[circle fill];을 할 수 있습니다. 위와 마찬가지로 Circle 데이터를 CGRect에 저장하고 Core Graphics 함수를 사용하여 그릴 수 있지만이 방법이 더 쉽다고 생각합니다. CGRect를 NSMutableArray에 넣을 수 없기 때문입니다. 이것은 Objective-C 객체가 아니라'typedef '이다. –