#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;
}