2016-10-17 2 views
4

Ich habe eine benutzerdefinierte Ansicht, die nicht freigegeben wird. Ich verlasse Controller bei gedrückter Taste. Jetzt, wenn ich nur den Knopf drücke, wird die Ansicht in Ordnung freigegeben. Aber wenn der Knopf mit einem Finger gedrückt wird, während der andere Finger die Ansicht berührt, wird seine Freigabe nicht aufgehoben, sondern beim nächsten Berührungsereignis.UITouch Freigabe nicht freigeben

Seine UITouch, die die Referenz meiner Ansicht hält und nicht freigibt. Wie kann ich das beheben?

Hier ist mein Code für meine Nähe Aktion:

- (IBAction)closePressed:(UIButton *)sender { 
    NSLog(@"Close pressed"); 
    if (self.loader) 
    [self.loader cancelJsonLoading]; 
    [self.plView quit]; 
    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

Antwort

1

Haben Sie versucht zu rufen:

[self.view resignFirstResponder]; 

, dass alle anstehenden UITouches abbrechen sollte.

Wenn dies nicht funktioniert, können Sie Spuren Ihrer Berührungen halten:

  • definieren einen NSMutableSet, wo Sie aktuelle berührt speichern:

    NSMutableSet *_currentTouches;

  • in Ihrer init() :

    _currentTouches = [[NSMutableSet alloc] init];

und implementieren:

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { 
    [super.touchesBegan:touches withEvent:event]; 
    [_currentTouches unionSet:touches]; // record new touches 
} 

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { 
    [super.touchesEnded:touches withEvent:event]; 
    [_currentTouches minusSet:touches]; // remove ended touches 
} 

- (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { 
    [super.touchesEnded:touches withEvent:event]; 
    [_currentTouches minusSet:touches]; // remove cancelled touches 
} 

Dann, wenn Sie Ihre Berührungen müssen sauber (wenn Sie die Ansicht zum Beispiel freigeben):

- (void)cleanCurrentTouches { 
    self touchesCancelled:_currentTouches withEvent:nil]; 
    _currentTouchesremoveAllObjects]; 
} 

Es ist, glaube ich, ein bisschen hacky , aber der doc sagt: withevent: Nachricht es jeden Zustand aufzuräumen sollte

Wenn ein Objekt eine touchesCancelled erhält Informationen, die in seiner touchesBegan: withEvent: Implementierung eingerichtet wurde.

+0

Ja, ich habe versucht, dass in meiner benutzerdefinierten Ansicht Klasse, hat es nicht funktioniert. –

+0

Und haben Sie versucht, 'self.userInteractionEnabled = NO;'? –

+0

Ja, das habe ich auch versucht, aber ich denke, das wird keinen Sinn ergeben, da es bereits in der UIResponder-Kette ist. nicht wahr? –