Voici mon fichier GameViewController.m:Pourquoi mon balayage UIGestureRecognizer ne fonctionne-t-il pas? Xcode
- (void)viewDidLoad {
[super viewLoad];
.
.
.
_board = [[TwinstonesBoardModel alloc] init];
[_board setToInitialStateMain];
TwinstonesStoneView* twinstonesBoard = [[TwinstonesStoneView alloc]
initWithMainFrame:CGRectMake(12, 160, 301.5, 302.5)
andBoard:_board];
[self.view addSubview:twinstonesBoard];
TwinstonesStonesView *stoneOne = [[TwinstonesStoneView alloc] init];
TwinstonesStonesView *one = (TwinstonesStoneView*)stoneOne.stoneUnoView;
TwinstonesStonesView *stoneTwo = [[TwinstonesStoneView alloc] init];
TwinstonesStonesView *two = (TwinstonesStoneView*)stoneTwo.stoneDueView;
UISwipeGestureRecognizer* swipeLeft = [[UISwipeGestureRecognizer alloc]
initWithTarget:self
action:@selector(swipeLeft:)];
swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
swipeLeft.numberOfTouchesRequired = 1;
[one addGestureRecognizer:swipeLeft];
[two addGestureRecognizer:swipeLeft];
Voici le code correspondant dans mon fichier TwinstonesStoneView.m:
@implementation TwinstonesStoneView
{
NSMutableArray* _array;
NSMutableArray* _emptyArray;
CGRect _frame;
NSUInteger _column;
NSUInteger _row;
TwinstonesBoardModel* _board;
int _i;
}
- (id)initWithMainFrame:(CGRect)frame andBoard:
(TwinstonesBoardModel*)board
{
if (Self = [super initWithFrame:frame])
{
float rowHeight = 49.0;
float columnWidth = 49.0;
float barrierHorizontalRowHeight = 12.5;
float barrierVerticalColumnWidth = 12.5;
for (int row = 0; row < 5; row++)
{
for (int col = 0; col < 5; col++)
{
TwinstonesStonesView* square = [[TwinstonesStoneView alloc]
initWithEmptyFrame:CGRectFrame(//spacial equations, not important)
column:col
row:row
board:board];
BoardCellState state = [board cellStateAtColumn:col andRow:row];
if (state == BoardCellStateStoneOne) {
// _stoneUnoView is a public property
// 'stoneOneCreation' creates a UIImageView of the stone
_stoneUnoView = [UIImageView stoneOneCreation];
[self addSubview:square];
[square addSubview:_stoneUnoView];
[_array insertObject:_stoneUnoView atIndex:0];
} else if (state == BoardCellStateStoneTwo) {
// same idea as above
_stoneDueView = [UIImageView stoneTwoCreation];
[self addSubview:square];
[square addSubview:_stoneDueView];
[_array insertObject:_stoneDueView atIndex:1];
} else {
// based on the 'init' method I write below, I assumed this
// would return an empty square cell
[self addSubview:square];
[_emptyArray insertObject:square atIndex:_i];
_i++;
}
}
}
self.backgroundColor = [UIColor clearColor];
}
return self;
}
- (UIView*)stoneUnoView {
return _stoneUnoView;
}
- (UIView*)stoneDueView {
return _stoneDueView;
}
- (id)initWithEmptyFrame:(CGRect)frame
column:(NSUInteger)column
row:(NSUInteger)row
board:(TwinstonesBoardModel*)board
{
self = [super initWithFrame:frame];
return self;
}
- (void)swipeLeft:(UIGestureRecognizer*)recognizer
{
NSLog(@"Swipe Left");
UIView* view = recognizer.view;
[self move:CGPointMake(-1, 0) withView:view];
}
- (void)move:(CGPoint)direction withView:view {
// whatever code I decide to put for stone movement
}
@end
Je présente mes excuses pour la durée nécessaire (probablement), je viens d'essayer pour comprendre cela pendant quelques jours et n'ont pas eu de chance. Voici les points de ce que j'essaie de faire: 1. setInititalStateMain définit les emplacements de deux pierres dans une grille 5x5 2. Dans GameViewController.m, j'essaye de capturer le 'stoneUnoView' et 'stoneDueView' propriétés (définies dans le fichier TwinstonesStoneView.m), leur donner des gestes de balayage, et interagir avec eux en utilisant les méthodes fournies dans TwinstonesStoneView.m. 3. Est-ce que je génère trop de vues? Le hic, c'est que tout fonctionne en fonction de ce que je peux voir sur mon iPhone quand je lance le programme. Les pierres apparaissent sur mon écran, mais lorsque j'essaie d'interagir avec elles, même le message 'NSLog' n'apparaît pas dans la console. 4. La méthode 'stoneOneCreation' (et ... deux) sont UIImageView, mais, comme vous pouvez le voir, je les stocke dans un pointeur UIView.
5. J'ai également utilisé '[un setUserInteractionEnabled: YES]' (et ... deux) mais cela n'a pas aidé non plus. 6. Si j'ajoute l'outil de reconnaissance de gestes à self.view, tout fonctionne (les affichages des pierres, du plateau de jeu et d'autres graphiques apparaissent, et lorsque j'interagis avec N'IMPORTE QUELLE partie de l'écran, je donne les instructions à la console. .... juste pas interaction pierre-spécifique).
Merci beaucoup d'avoir supporté tout cela, cela aidera vraiment si quelqu'un sait ce qui ne va pas. PS: tous les fichiers # import sont corrects, donc ce n'est pas un problème.
J'utilise XCode 7, Objective-C, et le développement pour iOS
- Anthony
j'ai commenté l'un des points de vue de l'essayer et il ne fonctionne toujours pas. J'ai toujours pensé que vous pouviez donner le même geste à plusieurs vues, vu que les vues elles-mêmes sont des entités séparées. Merci –
Je suis toujours sûr que vous ne pouvez pas réutiliser les gestes, mais vous semblez avoir éliminé cela comme un problème possible. Avez-vous activé l'interaction de l'utilisateur sur ces vues? Si c'est éteint, alors je crois que les gestes ne se déclencheront pas. – ghostatron
Oui, j'ai cette ligne [un setUserInteractionEnabled: YES]; allumé et éteint. 'one' étant un TwinstonesStoneView (sous-classe de UIView), je ne sais pas pourquoi cette ligne aurait même de l'importance. –