Πώς να ακυρώσετε μια ακολουθία γεγονότων UITouch;

ψήφοι
20

Έχω μια UIImageάποψη που ανταποκρίνεται στην αφή γεγονότα. Θέλω να ακυρώσω την ακολουθία αφής, δηλαδή, περαιτέρω κλήσεις προς touchesMoved:, εάν το άγγιγμα πηγαίνει έξω από ορισμένα όρια. Πως μπορώ να το κάνω αυτό?

Ξέρω ότι touchesMoved:μπορώ να επιθεωρήσει τις συντεταγμένες του αντικειμένου αφής και αγνοούν, αλλά αυτό που δεν ξέρω είναι πώς να ακυρώσετε την ακολουθία συνολικά. Δεν βλέπω καμία μέθοδος τεκμηριώνεται στη Μήλο Developer UIResponderαναφοράς που μπορώ να καλέσω για να ακυρώσει μια σειρά αφής.

Δημοσιεύθηκε 10/02/2009 στις 19:37
πηγή χρήστη
Σε άλλες γλώσσες...                            


12 απαντήσεις

ψήφοι
6

Η λύση αυτή μπορεί να είναι λίγο kludgy, αλλά θα μπορούσε να εφαρμόσει και το χέρι κλήση

- (void) touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

Είμαι βασίζοντας αυτή τη λύση χαλαρά σε κάποιο μικροαλλαγές που έκανα με την εφαρμογή του δείγματος MoveMe για της Apple iPhone δείγμα κώδικα χώρο όπου θα τροποποιηθεί η touchesMovedμέθοδος για να μοιάζει κάπως έτσι:

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
     UITouch *touch = [touches anyObject];
     if ([touch view] == placardView)
         CGPoint location = [touch locationInView:self];
         placardView.center = location;
         // I added the following line:
         [self touchesCancelled:touches withEvent:event];
         return;
}
Απαντήθηκε 10/02/2009 στις 20:51
πηγή χρήστη

ψήφοι
3

Δοκιμάστε την προσωρινή ρύθμιση userInteractionEnabled ιδιοκτησία του UIImageView να ΟΧΙ

Απαντήθηκε 28/11/2011 στις 04:30
πηγή χρήστη

ψήφοι
3

Θα πρέπει να καλέσετε [super touchesMoved:withEvent:]για να αφήσει το σούπερ θέα καθαρίσει από το γεγονός, αλλά το πιο σημαντικό, θα πρέπει να μην καλέσει [super touchesCancelled:withEvent:].

Εδώ είναι αυτό που χρησιμοποιείται σε ένα κελί για να το κρατήσει από το να επιλεγεί όταν ανιχνεύεται ένα ισχυρό κτύπημα:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    if (!showingEdit) {
        if (IS_FAR_ENOUGH_TO_BE_A_SWIPE) {
            RESPOND_TO_SWIPE
            showingEdit = YES;
            [super touchesCancelled:touches withEvent:event];
        } else {
            [super touchesMoved:touches withEvent:event];
        }
    }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    if (!showingEdit) {
        [super touchesEnded:touches withEvent:event];
    }
}
Απαντήθηκε 13/05/2010 στις 01:50
πηγή χρήστη

ψήφοι
2

Δεν νομίζω ότι είναι δυνατόν γιατί δεν βλέπω να τεκμηριώνονται και καμία από αυτές τις λύσεις δεν έχει αποτέλεσμα.

Απαντήθηκε 21/11/2011 στις 05:23
πηγή χρήστη

ψήφοι
2

Έχω αντιμετωπίσει το ίδιο πρόβλημα πρόσφατα και βρήκα ένα τυποποιημένο τρόπο για την επίλυσή του. Μπορείτε να χρησιμοποιήσετε το [[UIApplication sharedApplication] beginIgnoringInteractionEvents] για να σταματήσει την παράδοση γεγονότα touchesMoved σε ολόκληρη την εφαρμογή σας. Σιγουρευτείτε για να μπορέσουν χρησιμοποιώντας [[UIApplication sharedApplication] endIgnoringInteractionEvents], όταν χρειάζεται να λάβουν και πάλι πινελιές.

Απαντήθηκε 05/04/2010 στις 10:30
πηγή χρήστη

ψήφοι
1

Θα επιτευχθεί αυτό με την αφαίρεση τη θέα από superview της και να προστεθεί κατ 'ευθείαν πίσω.

[view retain];
UIView *sv = view.superview;
[view removeFromSuperview];
[sv addSubview:view];
[view release];

Αυτό σπάει την αλυσίδα ανταπόκρισης στην προβολή, ώστε τυχόν υπόλοιπο πινελιές δεν θα πρέπει να λαμβάνονται για την προβολή. Η επόμενη επαφή θα εξακολουθεί να λάβει κανονικά.

Απαντήθηκε 03/08/2016 στις 10:44
πηγή χρήστη

ψήφοι
1

Αυτός ο κωδικός θα σας βοηθήσει. Μπορώ να απενεργοποιήσω εκδήλωση επαφή με touchesMoved:μέθοδο και είμαι επιτρέποντας περίπτωση επαφής με touchesCancelled:μέθοδο

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
     UITouch *touch = [touches anyObject];
     .......
     .......
     Your code
     .......
     .......

     //Condition when you want to disable touch event

     [[UIApplication sharedApplication] beginIgnoringInteractionEvents];

     .......
     .......
     Your code
     .......
     .......
 }


- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    [[UIApplication sharedApplication] endIgnoringInteractionEvents];
}
Απαντήθηκε 21/08/2014 στις 11:31
πηγή χρήστη

ψήφοι
1

«Ωμής βίας» λύση ανάλογα με το αν ταιριάζει στις ανάγκες σας: Κατάργηση και εκ νέου προετοιμασία του δευτερεύουσας προβολής που δέχεται τις πινελιές ή ανταποκρίνεται σε αυτά (φυσικά αναλάβει τη φροντίδα του πλαισίου και του περιεχομένου).

Απαντήθηκε 24/03/2013 στις 21:56
πηγή χρήστη

ψήφοι
0

Ήμουν απλώς προσπαθεί να λύσει κάτι τέτοιο, και διαπίστωσε ότι καμία από τις λύσεις που της εργάστηκε για μένα. Το καλύτερο θα μπορούσα να διαχειριστεί προσωρινά αγνοώντας τις πινελιές, αλλά στη συνέχεια επαναλαμβάνεται όταν το άγγιγμα ξαναμπήκε τη θέα.

Τέλος θα λυθεί.

  1. Δημιουργήστε μια δυαδική σημαία που ονομάζεται «ειδικές ανάγκες»
  2. Σε touchedMoved, ελέγξτε πρώτα ότι η αφή είναι μέσα στην επιθυμητή προβολή. Εάν δεν είναι, ρυθμίστε τη σημαία άτομα με ειδικές ανάγκες σε ΝΑΙ.
  3. Ακόμα στο touchedMoved, ελέγξτε τη σημαία πριν από την εκτέλεση ενέργειά σας. Έτσι, σε αυτό το σημείο, τίποτα δεν θα συμβεί, αν είστε έξω από την προβολή.
  4. Σε touchesEnded, που τη σημαία άτομα με ειδικές ανάγκες σε NO. Έτσι, η ακολουθία επαφή είναι ουσιαστικά διακοπεί μέχρι χρήστης σηκώσει το δάχτυλό τους.

Υποθέτω ότι αυτό θα λειτουργήσει για σας αν δεν έχετε κάποιο συγκεκριμένο λόγο για την κυριολεκτικά χρειάζονται το άγγιγμα ακολουθία ακυρώνεται.

Απαντήθηκε 13/01/2013 στις 15:41
πηγή χρήστη

ψήφοι
0

Σε iOS5 φαίνεται να είναι μια ιδιωτική μέθοδος UITouch εκεί

-(void)setSentTouchesEnded:(BOOL)ended;

Ανάλογα με την εφαρμογή της Apple θα μπορούσε να σταματήσει την αποστολή εκδηλώσεις

Ένας άλλος τρόπος για να γίνει αυτό θα πρέπει να χρησιμοποιούν συνειρμική αντικείμενα

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    if ([(NSNumber *)objc_getAssociatedObject(touch, &outKey) boolValue])
        return;
    if (sometouchisoutsideofview) {
        objc_setAssociatedObject(touch, &outKey, [NSNumber numberWithBool:YES], OBJC_ASSOCIATION_RETAIN);
    }
}
Απαντήθηκε 25/11/2011 στις 19:44
πηγή χρήστη

ψήφοι
-1

Μπορείτε να δημιουργήσετε κατηγορίες για να UITouch. Μπορείτε να δηλώσετε

@property (nonatomic,strong,readwrite) UIView *view;

Και όταν αλλάζετε touch.view στο μηδέν, για παράδειγμα, μπορείτε να προσομοιώσει τέλος της αποστολής εκδηλώσεις αφής

Απαντήθηκε 17/04/2013 στις 20:43
πηγή χρήστη

ψήφοι
-2

Μπορείτε να ελέγξετε ότι οι θέσεις σημείο επαφής είναι CGRect (δηλ. Τα σημεία βρίσκονται σε ορθογώνιο της ImageView σας) ή όχι. Αν δεν είναι αυτό το Ορθ, θα ακυρωθεί η αφή.

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

    if (CGRectContainsPoint(myImageView, touchLocation))
    {
       lastPoint = [touch locationInView: myImageView];
    }

    NSLog(@"Last :%.2f - %.2f",lastPoint.x, lastPoint.y);   
  }

 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
 {
  CGPoint currentPoint;
  UITouch *touch = [touches anyObject];
  CGPoint touchLocation = [touch locationInView:self.view];

     if (CGRectContainsPoint(myImageView.frame, touchLocation))
     {
       currentPoint = [touch locationInView: myImageView];
     }
 }
Απαντήθηκε 24/11/2011 στις 06:44
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more