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;
}
접촉 방식에서 수퍼를 호출하십시오. 또한 제스처 인식기가 작동 할 때 마무리를 true로 설정하십시오. (단지 추측 ... – deadbeef
이 코드 줄을 제거해야합니다. 필요하지 않기 때문에이 코드 줄을 제거하십시오. – ddb
시도해 볼 수 있습니까? drawRect에서 pinch 제스처 설정을 제거하고 initWithFrame으로 이동하여 한 번만 발생하도록 하시겠습니까 ?? drawRect에 매번 대타를 설치하는 것은 어리 석다. – satheeshwaran