Сделайте UIView перетаскиваемым пальцем

У меня есть mainViewController но у меня есть маленький UIView внутри, который активируется при нажатии на MKAnnotationView в MKMapKitтак что мне нужно UIView быть перетаскиваемым в любой части экрана.

Пример скриншота моего приложения:

Круг является примером точки, я полагаю, я могу перетащить для любой точки "маленького" UIView.

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

Я надеюсь, что вы можете мне помочь.

4 ответа

Решение
  1. использование UIPanGestureRecognizer вместо UITapGestureRecognizer
  2. Задавать userInteractionEnabled = YES на ваш взгляд
  3. Просмотрите этот хороший урок о распознавателях жестов: штрихи. Есть хороший пример перетаскивания видов.

Отредактировано после рецензии @borrrden

UIPanGestureRecognizer подходит. В вашей функции обработчика проверьте это state переменная.

typedef enum {
   UIGestureRecognizerStatePossible,

   UIGestureRecognizerStateBegan,     // this will be the value on touch
   UIGestureRecognizerStateChanged,   // ~ on drag
   UIGestureRecognizerStateEnded,     // ~ on end of touch event
   UIGestureRecognizerStateCancelled,

   UIGestureRecognizerStateFailed,

   UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded
} UIGestureRecognizerState;

Я использую это для масштабирования и перетаскивания UIView в моем приложении.

1) Сначала убедитесь, что добавили следующее в вашу реализацию и подключите выходы к вашим представлениям в раскадровке.

#import <QuartzCore/QuartzCore.h>

@interface yourclass () {
    BOOL isDragging;
}
@property (weak, nonatomic) IBOutlet UIImageView *outletMainView; // View that contains the view we want to drag
@property (weak, nonatomic) IBOutlet UIImageView *outletRedDot; // The view we want to drag in the main view

Когда начинается касание, я немного масштабирую вид, когда пользователь касается конкретного вида, здесь это красная точка

// ANIMATE RED DOT WHEN START DRAGING IT
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint touchLocation = [touch locationInView:self.outletMainView];

    CGRect redDotRect = [self.outletRedDot frame];
    if (CGRectContainsPoint(redDotRect, touchLocation)) {
        isDragging = YES;
        NSLog(@"Red Dot tapped!");
        [UIView animateWithDuration:0.2
                              delay:0.0
                            options:UIViewAnimationOptionCurveEaseOut
                         animations:^{
                             self.outletRedDot.transform = CGAffineTransformMakeScale(1.75, 1.75);
                         }
                         completion:^(BOOL finished) {
                         }];
    } else {
        return;
    }
}

2) Затем я устанавливаю вид так, чтобы он следовал за точкой пальца

// ANIMATE AND MOVE RED DOT WHEN WE DRAG IT
- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint touchLocation = [touch locationInView:self.outletMainView];

    if (isDragging) {
        [UIView animateWithDuration:0.0f
                              delay:0.0f
                            options:(UIViewAnimationOptionBeginFromCurrentState|UIViewAnimationOptionCurveEaseInOut)
                         animations:^{
                             self.outletRedDot.center = touchLocation;
                             NSLog(@"X: %0.2f Y: %0.2f",touchLocation.x-redDotStartCenter.x, redDotStartCenter.y-touchLocation.y);
                         }
                         completion:NULL];
    }
}

3) Наконец, когда перетаскивание заканчивается, вид сбрасывается в исходный масштаб

// RESET RED DOT WHEN WE STOP DRAGGING
- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint touchLocation = [touch locationInView:self.outletMainView];

    CGRect redDotRect = [self.outletRedDot frame];
    if (CGRectContainsPoint(redDotRect, touchLocation)) {
        [UIView animateWithDuration:0.1
                              delay:0.0
                            options:0
                         animations:^{
                             self.outletRedDot.transform = CGAffineTransformMakeScale(1.0, 1.0);
                         }
                         completion:^(BOOL finished) {
                         }];
    }
    isDragging = NO;
}
Другие вопросы по тегам