Есть две проблемы с вашим кодом.Во-первых, эта строка неверна:
CGPoint lastTouch = [touch previousLocationInView:self.view];
Это должно быть так:
CGPoint lastTouch = [touch previousLocationInView:maskPreview];
На самом деле, вы даже не должны использовать previousLocationInView:
.Вы должны просто использовать locationInView:
следующим образом:
CGPoint lastTouch = [touch locationInView:maskPreview];
Во-вторых, вы получаете неправильные знаки movedDistanceX
и movedDistanceY
.Измените их следующим образом:
CGFloat movedDistanceX = lastTouch.x - originalOrigin.x;
CGFloat movedDistanceY = lastTouch.y - originalOrigin.y;
Также в документации для touchesBegan:withEvent:
сказано следующее:
Если вы переопределите этот метод без вызова super
(шаблон общего использования)Вы также должны переопределить другие методы для обработки сенсорных событий, хотя бы как реализации заглушки (empy).
Поэтому убедитесь, что вы также переопределяете touchesEnded:withEvent:
и touchesCancelled:withEvent:
.
В любом случае, вы можете сделать это немного проще.Один из способов - сделать touchesBegan:withEvent:
пустым и выполнить всю работу в touchesMoved:withEvent:
, используя previousLocationInView:
и locationInView:
, и обновив maskPreview.center
вместо maskPreview.frame
.Вам даже не понадобится переменная экземпляра originalOrigin
:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
if ([touches count]==1) {
UITouch *touch = [touches anyObject];
CGPoint p0 = [touch previousLocationInView:maskPreview];
CGPoint p1 = [touch locationInView:maskPreview];
CGPoint center = maskPreview.center;
center.x += p1.x - p0.x;
center.y += p1.y - p0.y;
maskPreview.center = center;
}
}
Другой способ сделать это - использовать UIPanGestureRecognizer
.Я оставляю это как упражнение для читателя.