Hier ist meine GameViewController.m Datei:Warum funktioniert mein UIGestureRecognizer Swipe nicht? 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];
Hier ist der relevante Code in meiner TwinstonesStoneView.m Datei:
@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
ich für die (wahrscheinlich) unnötige Länge zu entschuldigen, ich habe nur versucht, Das herauszufinden für ein paar Tage und hatte kein Glück. Hier sind die Aufzählungspunkte von dem, was ich versuche zu tun: 1. setInitialStateMain setzt die Platzierungen von zwei Steinen in einem 5x5 Raster 2. In GameViewController.m versuche ich die 'stoneUnoView' und 'stoneDueView' zu erfassen Eigenschaften (in der Datei TwinStonesStoneView.m festgelegt), geben Sie Swipe-Gesten und interagieren Sie mit ihnen mit den Methoden in TwinstonesStoneView.m bereitgestellt. 3. Generiere ich zu viele Ansichten? Der Haken dabei ist, dass alles so funktioniert, wie ich es auf meinem IPhone sehen kann, wenn ich das Programm starte. Die Steine erscheinen auf meinem Bildschirm, aber wenn ich versuche, mit ihnen zu interagieren, wird nicht einmal die Meldung "NSLog" in der Konsole angezeigt. 4. Die 'stoneOneCreation'-Methode (und ... zwei) sind UIImageView's, aber wie Sie sehen können, speichere ich sie in einem UIView-Zeiger.
5. Ich habe auch '[setUserInteractionEnabled: YES]' (und ... zwei) verwendet, aber das hat auch nicht geholfen. 6. Wenn ich den Gestenerkenner zu self.view hinzufüge, funktioniert alles (die Anzeigen der Steine, des Spielbretts und anderer Grafiken erscheinen, und wenn ich mit JEDEM Teil des Bildschirms interagiere, gebe ich die Anweisungen an die Konsole aus .. .... einfach nicht steinspezifische Interaktion).
Vielen Dank, dass Sie sich mit all dem abfinden, das wird wirklich helfen, wenn jemand weiß, was los ist. PS: alle Datei # Importe sind korrekt, das ist also kein Problem.
Ich bin mit XCode 7, Objective-C-Sprache und die Entwicklung für iOS
- Anthony
ich aus einer der Ansichten kommentiert, es auszuprobieren und es immer noch nicht funktioniert. Ich dachte immer, du könntest die gleiche Geste mehreren Ansichten geben, da die Ansichten selbst separate Einheiten sind. Danke –
Ich bin immer noch ziemlich sicher, dass Sie Gesten nicht wiederverwenden können, aber Sie scheinen das als ein mögliches Problem entfernt zu haben. Haben Sie eine Benutzerinteraktion für diese Ansichten aktiviert? Wenn es ausgeschaltet ist, glaube ich, dass die Gesten nicht ausgelöst werden. – ghostatron
Ja, ich habe diese Zeile [one setUserInteractionEnabled: YES]; an und aus. "Eins" ist eine TwinStonesStoneView (Unterklasse von UIView), also weiß ich nicht, warum diese Zeile überhaupt eine Rolle spielt. –