UIGestureRecognizer для перетаскивания UIView

Я пытаюсь построить GestureRecognizer, чтобы перетащить UIView справа налево. Если пользователь перетащил View на половину экрана, View будет автоматически перетаскиваться в левый угол, чтобы отменить его, но если пользователь не перетащит до половины экрана, он вернется в угол справа от экрана. Здесь немного утеряны, какие-то учебники или что-то еще? Благодаря

РЕДАКТИРОВАТЬ: Вот какой код, его UIImageView, внутри a UIScrollView, мне нужно перетащить весь свиток или просто изображение внутри него:

_myScroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.window.bounds.size.width, self.window.bounds.size.height)]; [_myScroll setContentSize:CGSizeMake(self.window.bounds.size.width , 1300)];

_tutorial = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.window.bounds.size.width, 1300)]; [_tutorial setImage:[UIImage imageNamed:@"Default"]];
_tutorial.contentMode = UIViewContentModeScaleAspectFit; [_myScroll addSubview:_tutorial];

_tutorial.userInteractionEnabled = YES;
    UIPanGestureRecognizer * recognizer = [[UIPanGestureRecognizer alloc]initWithTarget:_tutorial action:@selector(handlePan:)]; 
 [_tutorial addGestureRecognizer:recognizer];

    [self.window addSubview:_myScroll];

И метод, который я пытаюсь перетащить UIImageView

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer {

    CGPoint translation = [recognizer translationInView:_myScroll];
    recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x,
                                         recognizer.view.center.y + translation.y);
    [recognizer setTranslation:CGPointMake(0, 0) inView:_myScroll];

}

Ответ 1

Посмотрите здесь. Это учебник UIGestureRecognizer, который даст вам основы для обработки жестов и настроек. После того как вы научились основам, очень легко выполнить то, что вы хотите. Все, что вам нужно, - проверить положение обзора после завершения панорамирования, чтобы отправить его в правильное положение. Посмотрите этот другой учебник на UIScrollViews, он может помочь вам найти путь через вторую часть.

Оба учебника взяты из raywenderlich.com, возможно, самого полезного сайта iOS, который я знаю.


Ниже приведен код кода вашего метода handlePan:, с которым вы можете работать:

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer {

    CGPoint translation = [recognizer translationInView:_myScroll];

    recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x,
                                         recognizer.view.center.y + translation.y);

    if (recognizer.state == UIGestureRecognizerStateEnded) {

        // Check here for the position of the view when the user stops touching the screen

        // Set "CGFloat finalX" and "CGFloat finalY", depending on the last position of the touch

        // Use this to animate the position of your view to where you want
        [UIView animateWithDuration: aDuration
                              delay: 0 
                            options: UIViewAnimationOptionCurveEaseOut 
                         animations:^{
            CGPoint finalPoint = CGPointMake(finalX, finalY);
            recognizer.view.center = finalPoint; } 
                         completion:nil];
    }


    [recognizer setTranslation:CGPointMake(0, 0) inView:_myScroll];

}

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

Вот последний совет. Вы можете сделать какую-то "плавную" анимацию, используя slideFactor. Это поможет вашей анимации быть более "реалистичной". Работайте над этим кодом, который вы добавляете прямо в начале "if":

CGPoint velocity = [recognizer velocityInView:self.view];
CGFloat magnitude = sqrtf((velocity.x * velocity.x) + (velocity.y * velocity.y));
CGFloat slideMult = magnitude / 200;

float slideFactor = 0.1 * slideMult; // Increase for more slide

Затем в UIView animateWithDuration: используйте slideFactor как продолжительность.