2016-04-18 19 views
4

Ich mache dynamische UIViews durch Code und versuchen, UITapGestureRecogniser auf ihnen hinzuzufügen. Aber aus irgendeinem Grund reagieren sie nicht. Hier ist der Code:UITapGesture arbeitet nicht an dynamisch erstellten UIViews

-(void)createRandomBlock{ 
    UIView * block = [[UIView alloc] initWithFrame:CGRectMake([self getRandomPosition], 0-_heightOfBlock, _widthOfBlock, _heightOfBlock)]; 
    block.backgroundColor = [self randomColor]; 
    block.userInteractionEnabled=YES; 

    UITapGestureRecognizer * tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(blockTapped:)]; 
    tapGesture.delegate = self; 
    tapGesture.numberOfTouchesRequired = 1; 
    tapGesture.numberOfTapsRequired=1; 
    [block addGestureRecognizer:tapGesture]; 

    [self.view addSubview:block]; 

    [UIView animateWithDuration:_durationOfAnimation delay:0.0 options:options animations:^{ 
     [block setFrame:CGRectMake(block.frame.origin.x, ScreenHeight, block.bounds.size.width, block.bounds.size.height)]; 
    } completion:^(BOOL finished) { 
     [block removeFromSuperview]; 
    }]; 
} 

-(void)blockTapped:(UITapGestureRecognizer*)gesture{ 
    NSLog(@"I am being called?"); 
    UIView * block = (UIView*)[gesture view]; 
    [block removeFromSuperview]; 
} 

Kann jemand bitte helfen?

Dank

+0

wird der createRandomBlock einmal aufgerufen? – George

+0

vermutlich können Sie die Ansicht auf dem Bildschirm sehen? Welche anderen Gesten sind auf der Ansicht und der Superview? – Wain

+0

createRandomBlock wird mit einem Timer mit einer Verzögerung von 3 Sekunden aufgerufen. Auch ich benutze uiviewanimate, um die Ansicht zu animieren. –

Antwort

1

Ich versuchte mit dem gleichen Code, es funktionierte für mich. Ändern nur, ich habe nicht den Delegaten für die tapGesture festgelegt.

-(void)createRandomBlock{ 
    UIView * block = [[UIView alloc] initWithFrame:randomPosition]; 
    block.backgroundColor = [self randomColor]; 
    block.userInteractionEnabled=YES; 

    UITapGestureRecognizer * tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(blockTapped:)]; 
    tapGesture.numberOfTapsRequired=1; 
    [block addGestureRecognizer:tapGesture]; 

    [self.view addSubview:block]; 
} 

-(void)blockTapped:(UITapGestureRecognizer*)gesture{ 
    NSLog(@"I am being called?"); 
    UIView * block = (UIView*)[gesture view]; 
    [block removeFromSuperview]; 
} 

Ich denke, weil Delegierter des Hinzufügens, es überschreibt die Wähler, die Sie festgelegt haben, und fordert die Delegatmethoden statt.

+0

Können Sie bitte den aktualisierten Code versuchen. Ich denke, mein UIViewAnimate verursacht das Problem. –

+0

@WarisAli: Können Sie richtig sagen, was Sie in der Animation zu tun versuchen. Wenn ich mir den Code ansehe, scheint es mir, dass Sie die Ansicht erstellen und die Ansicht danach nach der Fertigstellung animieren und sie entfernen. Wann möchten Sie den Tapgesture Selector aufrufen? Kannst du bitte klarer sein? –

+0

@WarisAli: Dies könnte helfen: http://stackoverflow.com/questions/4311645/uiview-touchesbegan-doesnt-respond-during-animation/4432546#4432546 –

1

Sie können einen kleinen Fehler auf Frame-Set. bitte ändern Sie das Rahmenset & Sie können Ihr Problem lösen.

-(void)createRandomBlock{ 
    int x_coord = arc4random() % 200; //Random number from 0-320 // set random x position 
    int y_coord = arc4random() % 481; //Random number from 0-480 // set random y position 

    UIView * block = [[UIView alloc] initWithFrame:CGRectMake(x_coord, y_coord, 100, 100)]; // for testing set width & height 100 * 100 
    block.backgroundColor = [UIColor redColor]; // for fix color you can use your change color function 
    block.userInteractionEnabled=YES; 

    UITapGestureRecognizer * tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(blockTapped:)]; 
    tapGesture.delegate = self; 
    tapGesture.numberOfTouchesRequired = 1; 
    tapGesture.numberOfTapsRequired=1; 
    [block addGestureRecognizer:tapGesture]; 

    [self.view addSubview:block]; 

[UIView animateKeyframesWithDuration:1.0 delay:0.0 options:UIViewKeyframeAnimationOptionCalculationModeLinear animations:^{ 
     [block setFrame:CGRectMake(block.frame.origin.x, 0, block.bounds.size.width, block.bounds.size.height)]; 
    } completion:^(BOOL finished) { 
//  [block removeFromSuperview]; 
    }]; 
} 

-(void)blockTapped:(UITapGestureRecognizer*)gesture{ 
    NSLog(@"I am being called?"); 
    UIView * block = (UIView*)[gesture view]; 
    [block removeFromSuperview]; 
} 
+0

gibt es kein Problem mit dem Rahmen der uiview. Ich kann die uiview auf meiner Hauptansicht sehen. Die X, Y, Breite und Höhe des Blocks wird in dem anderen Code eingestellt. –

+0

Wie hoch ist die Standardhöhe Ihres Bildschirms? Bitte überprüfen Sie meinen Code –

+0

#define ScreenHeight [[UIScreen mainScreen] Schranken] .size.height –

1

Wenn die Benutzerinteraktionen Ihrer Ansicht von oben deaktiviert sind, erkennen Ihre Gesten auch keine Interaktionen in Ihren Unteransichten. Versuchen Sie, die gerade Linie vor dem Aufruf der createRandomBlock-Nachricht einzufügen.

self.view.userInteractionEnabled = YES;

+0

Ja. Top-View-Interaktion ist aktiviert. Keine Probleme dort. –

+0

Können Sie den gesamten Code Ihres View Controllers anzeigen? –

+0

Sicher. Hier sind die benötigten Dateien. https://www.dropbox.com/sh/puwc6gv09tm0kb4/AAAMEI6mUfXhWplVmOXsBazDa?dl=0 –

1

Ich weiß nicht, was Ihr [self getRandomPosition] und _widthOfBlock etc Wert haben sonst unter Code in meinem Demo gut funktioniert.

-(void)createRandomBlock{ 

UIView * block = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)]; 
block.backgroundColor = [UIColor redColor]; 
block.userInteractionEnabled=YES; 

UITapGestureRecognizer * tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(blockTapped:)]; 
tapGesture.delegate = self; 
tapGesture.numberOfTouchesRequired = 1; 
tapGesture.numberOfTapsRequired=1; 
[block addGestureRecognizer:tapGesture]; 

[self.view addSubview:block]; 
} 

-(void)blockTapped:(UITapGestureRecognizer*)gesture{ 
NSLog(@"I am being called?"); 
UIView * block = (UIView*)[gesture view]; 
[block removeFromSuperview]; 
} 

Update:

Sie sollten touchesBegan verwenden Note zu erkennen, hier ist der Arbeitscode,

-(void)createRandomBlock{ 

UIView * block = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)]; 
block.backgroundColor = [UIColor redColor]; 
block.userInteractionEnabled=YES; 
block.tag = 100; 
self.view.userInteractionEnabled =YES; 

UITapGestureRecognizer * tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(blockTapped:)]; 
// tapGesture.delegate = self; 
// tapGesture.numberOfTouchesRequired = 1; 
tapGesture.numberOfTapsRequired=1; 


[block addGestureRecognizer:tapGesture]; 
[self.view addSubview:block]; 




[UIView animateWithDuration:5.0 delay:0.0 options:UIViewAnimationOptionAllowUserInteraction animations:^{ 
    [block setFrame:CGRectMake(block.frame.origin.x, self.view.frame.size.height-200, block.bounds.size.width, block.bounds.size.height)]; 


} completion:^(BOOL finished) { 
    [block removeFromSuperview]; 
}]; 


} 

-(void)blockTapped:(UITapGestureRecognizer*)gesture{ 

NSLog(@"I am being called?"); 
UIView * block = (UIView*)[gesture view]; 
[block removeFromSuperview]; 
} 


- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
UITouch *touch = [touches anyObject]; 
CGPoint touchLocation = [touch locationInView:self.view]; 
UIView *tempView = [self.view viewWithTag:100]; 

if ([tempView.layer.presentationLayer hitTest:touchLocation]) { 

    NSLog(@"call"); 
    [tempView removeFromSuperview]; 
} 


} 
+0

können Sie bitte versuchen, den Code, den ich gerade aktualisiert –

+0

Bitte ignorieren Sie die zufälligen Funktionen und Variablen, die ich verwende. Sie funktionieren gut. –

+0

Überprüfen Sie meine aktualisierte Antwort, es funktioniert als Ihre Anforderung. :) – Lion

0

Sie sind der Ansicht, bei der Fertigstellung Block entfernt, was bedeutet, nach der Animation ist abgeschlossen Ihre Ansicht wird entfernt. Entfernen Sie die folgende Zeile vom Abschlussblock.

[block removeFromSuperview]; 

Sie sollten das nicht tun. Ihre Ansicht selbst wird entfernt, wie Tap-Geste funktioniert.

+0

Die Ansicht wird entfernt, nachdem sie den Bildschirm verlassen hat. –

+0

Ich tippe während der Animation darauf. –

+0

Ich habe versucht, diese Linie herauszunehmen. Hat nichts gemacht. Immer noch funktioniert die Geste nicht –

Verwandte Themen