Hoe maak je een opeenvolging van UITouch gebeurtenissen annuleren?

stemmen
20

Ik heb een UIImagestandpunt dat reageert op gebeurtenissen te raken. Ik wil de aanraking volgorde, dat wil zeggen, verdere gesprekken te annuleren touchesMoved:, indien de aanraking is buiten bepaalde grenzen. Hoe kan ik dat doen?

Ik weet dat touchesMoved:ik de coördinaten van het touch object kan inspecteren en het te negeren, maar wat ik niet weten is hoe de volgorde helemaal te annuleren. Ik heb geen methode beschreven in het zie Apple Developer UIResponderReference die ik kan bellen om een vleugje herhalen te stoppen.

De vraag is gesteld op 10/02/2009 om 19:37
bron van user
In andere talen...                            


12 antwoorden

stemmen
6

Deze oplossing kan een beetje klungelige, maar je zou kunnen implementeren en handmatig bellen

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

Ik ben deze oplossing losjes baseren op wat tweaken ik deed om de MoveMe monster app op Apple's iPhone voorbeeldcode site waar ik wijzigde de touchesMovedmethode om er als volgt uitzien:

- (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;
}
antwoordde op 10/02/2009 om 20:51
bron van user

stemmen
3

Probeer tijdelijke instelling userInteractionEnabled eigendom van de UIImageView naar NO

antwoordde op 28/11/2011 om 04:30
bron van user

stemmen
3

Je moet om te bellen [super touchesMoved:withEvent:]om te laten de super uitzicht opruimen van het evenement, maar wat nog belangrijker is, moet je niet te bellen [super touchesCancelled:withEvent:].

Hier is wat ik gebruikt op een cel om het te houden van het krijgen geselecteerd wanneer ik een uithaal gedetecteerd:

- (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];
    }
}
antwoordde op 13/05/2010 om 01:50
bron van user

stemmen
2

Ik denk niet dat het mogelijk is, want ik zie het niet gedocumenteerd en geen van deze oplossingen werken.

antwoordde op 21/11/2011 om 05:23
bron van user

stemmen
2

Ik heb hetzelfde probleem onlangs geconfronteerd en vond een standaard manier om het op te lossen. U kunt [[UIApplication sharedApplication] beginIgnoringInteractionEvents] gebruiken om te stoppen met het leveren van touchesMoved evenementen om je hele app. Zorg ervoor om hen in staat met behulp van [[UIApplication sharedApplication] endIgnoringInteractionEvents] wanneer u raakt opnieuw te ontvangen.

antwoordde op 05/04/2010 om 10:30
bron van user

stemmen
1

Ik bereiken door verwijdering van het uitzicht vanaf het superview en toevoegen rechte rug.

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

Dit breekt de responder chain om de weergave, zodat eventuele resterende accenten worden niet ontvangen op het uitzicht. De volgende keer zal nog steeds worden ontvangen als normaal.

antwoordde op 03/08/2016 om 10:44
bron van user

stemmen
1

Deze code zal je helpen. Schakel ik aanraking evenement in touchesMoved:methode en ik ben waardoor aanraking evenement in touchesCancelled:methode

-(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];
}
antwoordde op 21/08/2014 om 11:31
bron van user

stemmen
1

"Brute force" oplossing, afhankelijk van of het past bij uw behoeften: verwijderen en opnieuw initialiseren de subweergave dat de accenten ontvangt of daarop reageert (uiteraard zorg van het frame en de inhoud).

antwoordde op 24/03/2013 om 21:56
bron van user

stemmen
0

Ik was gewoon proberen om iets als dit op te lossen, en vond dat geen van de oplossingen vermeld haar werkte voor mij. De beste die ik zou kunnen beheren werd tijdelijk negeren van de details, maar dan hervat ze toen het touch opnieuw worden ingevoerd het uitzicht.

Eindelijk opgelost.

  1. Het opzetten van een boolean vlag genaamd "uitgeschakeld"
  2. In touchedMoved, eerst of de aanraking is binnen de gewenste weergave. Als het niet, stelt u de gehandicapte vlag op YES.
  3. Nog steeds in in touchedMoved, controleer dan de vlag voor het uitvoeren van uw actie. Dus, op dit punt, zal er niets gebeuren als ze buiten de weergave.
  4. In touchesEnded Stel de deactiveervlag NO. Dus het touch-sequentie wordt effectief stopgezet totdat gebruiker zijn vinger liften.

Ik denk dat dit zal werken voor u, tenzij u een specifieke reden voor letterlijk hoeven aan te raken reeks geannuleerd.

antwoordde op 13/01/2013 om 15:41
bron van user

stemmen
0

Op iOS5 lijkt er een prive-methode in UITouch zijn

-(void)setSentTouchesEnded:(BOOL)ended;

Afhankelijk van de implementatie van Apple het zou kunnen stoppen met het verzenden evenementen

Een andere manier om dit te doen zou worden met behulp associatieve objecten

- (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);
    }
}
antwoordde op 25/11/2011 om 19:44
bron van user

stemmen
-1

U kunt categorie creëren UITouch. U kunt te verklaren

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

En als je touch.view veranderen naar nul, bijvoorbeeld, kunt u simuleren einde van de dispatching aanraakgebeurtenissen

antwoordde op 17/04/2013 om 20:43
bron van user

stemmen
-2

U kunt controleren dat de aanraking punt locaties zijn in CGRect (bijv. Punten in de rechthoek van uw Figuurweergave) of niet. Als ze niet in dat Rect, zal de aanraking worden geannuleerd.

-(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];
     }
 }
antwoordde op 24/11/2011 om 06:44
bron van user

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