Как переместить UIImageView с помощью Touch - PullRequest
5 голосов
/ 03 февраля 2012

Я пытаюсь создать движущуюся функцию для моего imageView (maskPreview в приведенном ниже коде), чтобы пользователи могли перемещать изображение, содержащееся в maskPreview, по экрану.Вот мой код для сенсорного начала и сенсорного перемещения:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
if ([touches count]==1) {
    UITouch *touch= [touches anyObject];
    originalOrigin = [touch locationInView:maskPreview];
}
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
if ([touches count]==1) {
    UITouch *touch = [touches anyObject];
    CGPoint lastTouch = [touch previousLocationInView:self.view];
    CGFloat movedDistanceX = originalOrigin.x-lastTouch.x;
    CGFloat movedDistanceY = originalOrigin.y-lastTouch.y;
    [maskPreview setFrame:CGRectMake(maskPreview.frame.origin.x+movedDistanceX, maskPreview.frame.origin.y + movedDistanceY, maskPreview.frame.size.width, maskPreview.frame.size.height)];
}
}

, но я получаю некоторые странные ответы из приложения.Я не устанавливал ограничений на то, как далеко может перемещаться изображение, то есть, чтобы оно не выходило за пределы экрана, но даже если это небольшое движение, мой просмотр изображения становится диким и исчезает.

Большое спасибо заранее за помощь

Ответы [ 2 ]

9 голосов
/ 03 февраля 2012

Внедрение touchesBegan и т. Д. В современном мире слишком излишне.Вы просто запутываете себя, и ваш код быстро станет невозможным для понимания или поддержки.Используйте UIPanGestureRecognizer;вот для чего это.Создание представления, перетаскиваемого с помощью UIPanGestureRecognizer, тривиально.Вот обработчик действия для UIPanGestureRecognizer, который делает представление перетаскиваемым:

- (void) dragging: (UIPanGestureRecognizer*) p {
    UIView* vv = p.view;
    if (p.state == UIGestureRecognizerStateBegan ||
        p.state == UIGestureRecognizerStateChanged) {
        CGPoint delta = [p translationInView: vv.superview];
        CGPoint c = vv.center;
        c.x += delta.x; c.y += delta.y;
        vv.center = c;
        [p setTranslation: CGPointZero inView: vv.superview];
    }
}
2 голосов
/ 03 февраля 2012

Есть две проблемы с вашим кодом.Во-первых, эта строка неверна:

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.Я оставляю это как упражнение для читателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...