2016-08-22 2 views
0

UIView (InsideView)에서 UIbezierpath를 그릴 수있는 그리기 앱을 개발 중입니다.이 뷰어의 superView (self.view)가 하위 뷰입니다. InsideView에서 종래의 드로잉 코드 인 touchesBegan:, touchesMoved:, touchesEnded:을 사용하고 있는데, insideController의 superView 인 viewController 클래스 안에 pinch 줌 코드 handlePinch:(UIPinchGestureRecognizer *)recognizer:을 처리하고 있습니다.touchesbegan : UIPinchGestureRecognizer가 사용 된 후에 UIView에서 호출되지 않는 이유는 무엇입니까?

먼저 그릴 때 핀치 확대/축소를 할 수 있지만 UIPinchGestureRecognizer가 실행 된 후 드로잉 코드 (touchesBegan 등)가 호출되지 않고 InsideView에 아무것도 그려지지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 미리 감사드립니다. (UIView의 서브 클래스이며, self.view에 대한 하위 뷰) 나는 아무 문제없이 그들을 함께 사용의 UIViewController을 개발했습니다

- (id)initWithFrame:(CGRect)frame{    
       self = [super initWithFrame:frame]; 
       if (self) { 
          path = [UIBezierPath bezierPath]; 
          [path setLineWidth:7.0]; 
          pointsArray = [NSMutableArray array]; 
          finish = NO; 
          } 
        return self; 
} 
-(void)drawRect:(CGRect)rect{ 
         [[UIColor redColor] setStroke]; 
         [path stroke]; 
} 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 

        UITouch *touch = [touches anyObject]; 
        CGPoint p = [touch locationInView:self]; 
        [path moveToPoint:p]; 
        [pointsArray addObject:[NSValue valueWithCGPoint:p]]; 
} 
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ 

        UITouch *touch = [touches anyObject]; 
        CGPoint p = [touch locationInView:self]; 
        [path addLineToPoint:p]; 
        [self setNeedsDisplay]; 
        [pointsArray addObject:[NSValue valueWithCGPoint:p]]; 
} 
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 

        [path closePath]; 

        //Smoothing the path. 
        path.miterLimit=-10; 
        [self setNeedsDisplay]; 
        finish = YES; 
} 

//Code in the viewController (InsideView's superView) 
- (void)viewDidLoad { 
     [super viewDidLoad]; 
     InsideView* sV = [InsideView new]; 
     [sV setFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; 
     [self.view addSubview:sV]; 

     //Pinch 
     UIPinchGestureRecognizer*pinch = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(handlePinch:)]; 
     pinch.delegate =self; 
     [sV addGestureRecognizer:pinch]; 
} 
- (void)handlePinch:(UIPinchGestureRecognizer *)recognizer{ 

     if ([recognizer numberOfTouches] < 2) 
      return; 
     if (recognizer.state == UIGestureRecognizerStateBegan) { 
      lastScale = 1.0; 
      lastPoint = [recognizer locationInView:self.view]; 
     } 
     // Scale 
     CGFloat scale = 1.0 - (lastScale - recognizer.scale); 
     [sV.layer setAffineTransform: 
     CGAffineTransformScale([sV.layer affineTransform], 
           scale, 
           scale)]; 
     lastScale = recognizer.scale; 
     // Translate 
     CGPoint point = [recognizer locationInView:self.view]; 

     [sV.layer setAffineTransform: 
     CGAffineTransformTranslate([sV.layer affineTransform], 
            point.x - lastPoint.x, 
            point.y - lastPoint.y)]; 
     lastPoint = [recognizer locationInView:self.view]; 
} 
-(void)handlePinchWithGestureRecognizer:(UIPinchGestureRecognizer *)pinchGestureRecognizer{ 
     sV.transform = CGAffineTransformScale(sV.transform, pinchGestureRecognizer.scale, pinchGestureRecognizer.scale); 
     pinchGestureRecognizer.scale = 1.0; 
} 
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{ 
     return YES; 
} 
+2

접촉 방식에서 수퍼를 호출하십시오. 또한 제스처 인식기가 작동 할 때 마무리를 true로 설정하십시오. (단지 추측 ... – deadbeef

+1

이 코드 줄을 제거해야합니다. 필요하지 않기 때문에이 코드 줄을 제거하십시오. – ddb

+2

시도해 볼 수 있습니까? drawRect에서 pinch 제스처 설정을 제거하고 initWithFrame으로 이동하여 한 번만 발생하도록 하시겠습니까 ?? drawRect에 매번 대타를 설치하는 것은 어리 석다. – satheeshwaran

답변

2

InsideView에서

// 코드, 어쩌면이야 솔루션은이 로직을 UIView에서 UIViewController로 옮길 수 있습니다. 당신은 touchesBegan:withEvent:과 함께, touchesMoved:withEvent:, touchesEnded:withEvent: 방법

당신이이 변화해야하는지

을 또한 방법 handlePinch:UIViewController로 이동해야 물론이

UIPinchGestureRecognizer* pinch = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(handlePinch:)]; 
[self.view addGestureRecognizer:pinch]; 

같은 핀치 인식기를 정의 할 수 있습니다 viewDidLoad에서 그래서 방법은

,536에

self 

을 변경해야한다는 것입니다

self.yourSpecificCurrentUIView 
+0

제안 해 주셔서 감사합니다. 내 도면 뷰의 수퍼 뷰인 ViewController 내부에 핀치 처리 코드를 제공하고 도면 뷰 (uiview 서브 클래스)에 드로잉 코드를 제공했습니다. 그것은 문제를 해결했습니다. –