Glisser le geste de glissement UIViews
-
26-10-2019 - |
Question
Je veux faire le geste de glisser pour faire glisser le UIView
en continu et obtenir les données. Considérez chaque mot dans chaque UIView
. I Les données stockées dans un tableau et imprimé dans l'étiquette de UIView
pendant la transition. Mais lorsque je tente de glisser après montré tous Tracez votre programme de données a cessé de fonctionner. Mon projet montrant aucune erreur. S'il vous plaît me aider.
Ceci est mon tableau:
addArray = [[NSMutableArray alloc]initWithCapacity:4];
[addArray insertObject:@"10" atIndex:0];
[addArray insertObject:@"20" atIndex:1];
[addArray insertObject:@"30" atIndex:2];
[addArray insertObject:@"40" atIndex:3];
flippedArray = [[NSMutableArray alloc] initWithCapacity:4];
[flippedArray insertObject:@"100" atIndex:0];
[flippedArray insertObject:@"200" atIndex:1];
[flippedArray insertObject:@"300" atIndex:2];
[flippedArray insertObject:@"400" atIndex:3];
Ceci est mon geste de reconnaissance de codage:
-(void)swipegesture:(UISwipeGestureRecognizer *)recognizer{
CGPoint location = [recognizer locationInView:additionalView];
if (recognizer.direction==UISwipeGestureRecognizerDirectionLeft)
{
if (increment<[addArray count])
{
NSLog(@"%d",[addArray count]);
increment++;
if(increment==[addArray count])
{
NSLog(@"Fail");
//[recognizer requireGestureRecognizerToFail:swipeGesture];
[recognizer setEnabled:NO];
}
else
{
additionalLabel.text=[[NSString alloc] initWithFormat:@"%@",
[addArray objectAtIndex:increment]];
flippedLabel.text = [[NSString alloc] initWithFormat:@"%@",
[flippedArray objectAtIndex:increment]];
NSLog(@"increment %d",increment);
[UIView animateWithDuration:0.55 animations:^{
[UIView setAnimationDelay:0.2];
}];
CATransition *animation = [CATransition animation];
[animation setType:kCATransitionPush];
[animation setSubtype:kCATransitionFromRight];
[animation setTimingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionDefault]];
[animation setSpeed:0.4];
[[additionalView layer] addAnimation:animation forKey:nil];
}
}
}
else if(recognizer.direction==UISwipeGestureRecognizerDirectionRight)
{
if (increment>=0 && increment<[addArray count])
{
increment--;
if(increment>[addArray count])
{
additionalLabel.text=[[NSString alloc]initWithFormat:@"%@",
[addArray objectAtIndex:increment]];
flippedLabel.text=[[NSString alloc]initWithFormat:@"%@",
[flippedArray objectAtIndex:increment]];
NSLog(@"Decrement %d",increment);
[UIView animateWithDuration:0.55 animations:^{
[UIView setAnimationDelay:0.2];
}];
CATransition *animation = [CATransition animation];
[animation setType:kCATransitionPush];
[animation setSubtype:kCATransitionFromLeft];
[animation setTimingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionDefault]];
[animation setSpeed:0.4];
[[additionalView layer] addAnimation:animation forKey:nil];
}
}
}
}
Il y a un problème en augmentation seulement. Je suis arrivé impression NSLog
comme FAIL. Mais je ne comment arrêter geste si elle atteint reconnaisseur la valeur [addArray count]
.
La solution
Je recommande incrémenter ou décrémenter votre valeur d'index (qui vous avez appelé incrément) avant la vérification de la validité, et si elle n'est pas valide revenir sur votre choix dans un autre. Comme ceci:
if (recognizer.direction==UISwipeGestureRecognizerDirectionLeft)
{
increment++;
if (increment<[addArray count])
{
// Your code
}
else
{
increment--; // The increment would pass the range of the array, set it back.
}
}
Et de même pour l'autre sens.
EDIT: Pour clarifier les choses, le problème d'origine est que vous vérifiez pour vous assurer que votre index est valide, mais, par incrémenter après la vérification que vous finissez par faire invalide. En utilisant votre exemple, lorsque l'incrément est 3 (indice le plus élevé de votre tableau), il est en fait moins que le nombre de tableau, ce qui est 4. Vous pouvez alors incrémenter votre index 4, qui serait hors des limites, ou, dans votre cas, tomber dans cette instruction if (qui ne sera plus nécessaire en utilisant la suggestion) et connectez votre FAIL.