Xcode Как удалить изображение после нескольких касаний?

#ios #ipad

#iOS #iPad

Вопрос:

У меня есть анимация событий касания «облаков» с использованием этого кода. Все работает нормально, но я хочу исчезать / удалять облака после того, как пользователь нажмет на облако 3 раза. Поэтому я хочу, чтобы они исчезли после третьего касания. Как мне это сделать?

 - (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

UITouch *touch = [touches anyObject];
CGPoint touchLocation = [touch locationInView:self.view];

CGRect cloudBLRect = [[[self.cloudBL layer] presentationLayer] frame];


if (CGRectContainsPoint(cloudBLRect, touchLocation)) {
    NSLog(@"cloudBL tapped!");

    cloudBLPressed = true;

    [UIView animateWithDuration:1.0
                          delay:0.0
                        options:UIViewAnimationOptionCurveEaseInOut
                     animations:^{
                         self.cloudBL.center = CGPointMake(200, 600);
                         self.cloudBL.alpha = 0.5;


                     }
                     completion:^(BOOL finished) {
                         [UIView animateWithDuration:2.0
                                               delay:2.0
                                             options: UIViewAnimationOptionCurveEaseInOut
                                          animations:^{

                                               self.cloudBL.center = CGPointMake(100, 700);
                                              self.cloudBL.alpha = 0.5;


                                          } completion:^(BOOL finished) {
                                              self.cloudBL.alpha = 1.0;


                                          }];


   } else {
            NSLog(@"cloud not tapped.");
            return;
                      }



 if (cloudBLPressed) return;

 }
  

Ответ №1:

Возьмите переменную count и инициализируйте ее равным 0. При каждом касании увеличивайте его на 1. Также проверьте в методе touchGesture, что если count переменная равна 2, то установите alpha для облака значение 0.0 .

Что-то вроде этого: в файле .m возьмите приватный вход, доступный: int count;
in viewDidLoad: count = 0; cloudView.alpha = 1.0;

     - (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
count  ;
if(count<2)
{
     cloudView.alpha-=0.33;
} 

else {
    cloudView.alpha = 0.0;
}
              }
  

Добавьте его в свою логику анимации. Надеюсь, это поможет.

Вы можете установить его в своем коде следующим образом:

     - (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [touches anyObject];
    CGPoint touchLocation = [touch locationInView:self.view];

    CGRect cloudBLRect = [[[self.cloudBL layer] presentationLayer] frame];

    if(count < 2)
    {
        count  ;
    if (CGRectContainsPoint(cloudBLRect, touchLocation)) {
        NSLog(@"cloudBL tapped!");

        cloudBLPressed = true;


        [UIView animateWithDuration:1.0
                              delay:0.0
                            options:UIViewAnimationOptionCurveEaseInOut
                         animations:^{
                             self.cloudBL.center = CGPointMake(200, 200);
//                             self.cloudBL.alpha -=0.33;


                         }
                         completion:^(BOOL finished) {
                             [UIView animateWithDuration:2.0
                                                   delay:2.0
                                                 options: UIViewAnimationOptionCurveEaseInOut
                                              animations:^{

                                                  self.cloudBL.center = CGPointMake(100, 300);
                                                  self.cloudBL.alpha -=0.33;


                                              } completion:^(BOOL finished) {
//                                                  self.cloudBL.alpha = 1.0;


                                              }];


                         }];
    }

         else {
                             NSLog(@"cloud not tapped.");
                             return;
                         }



         if (cloudBLPressed) return;

    } else {
        [UIView animateWithDuration:2.0
                              delay:2.0
                            options: UIViewAnimationOptionCurveEaseInOut
                         animations:^{

                             self.cloudBL.center = CGPointMake(100, 300);
                             self.cloudBL.alpha =0.0;


                         } completion:^(BOOL finished) {
                         }];
    }
}
  

Ответ №2:

Вы можете это сделать:

 UITapGestureRecognizer * tripleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(yourAction:)];

tripleTap.numberOfTapsRequired = 3;

[yourView addGestureRecognizer:tripleTap];
  

Комментарии:

1. Для этого пользователю потребуется трижды нажать на изображение (быстро)

2. Решением может быть установка одного жеста касания и итератора для подкласса UITapGestureRecognier .

3. в игре нажатия могут выполняться не в регулярной последовательности. возможно, игрок касается 3 облаков в порядке 1-2-1-3-2-3-3-2-1. ваше решение будет работать только в случае 1-1-1-2-2-2-3-3-3, что является крайне маловероятным сценарием, события всегда происходят нерегулярно.

4. Нет, если вы добавите простой жест к представлению (здесь облако) с итератором внутри, который увеличивается при каждом нажатии на него. Когда вы нажмете на него, и это в 3-й раз, вы можете удалить представление.

Ответ №3:

 UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapOnImage:)];
[cloud addGestureRecognizer:tapRecognizer];
  

}

 - (void)tapOnImage:(UITapGestureRecognizer *)gesture
{
    tapsCounter  ;

    if (tapsCounter == 3)
    {
        // do your stuff

        tapsCounter = 0;
    }
}
  

Я бы посоветовал вам перенести эту логику в UIImageView подкласс, представляющий объект cloud.

Ответ №4:

Добавьте соответствующий делегат UIGestureRecognizerDelegate в свой интерфейс.

Затем в вашем viewDidLoad :

 UITapGestureRecognizer *tapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapMethod)];
tapped.delegate=self;
tapped.numberOfTapsRequired = 3;
[self.view addGestureRecognizer:tapped];
  

а затем в вашем контроллере просмотра:

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{
    if (touch.view != cloudViewamp;amp; cloudView) 
    {
        return YES;
    }
    return NO;
}

-(void)tapMethod 
{
    [cloudView removeFromSuperview];
    cloudView = nil;
}