Hvordan du avbryter en sekvens av UITouch hendelser?

stemmer
20

Jeg har en UIImageoppfatning av at reagerer på berøring hendelser. Jeg ønsker å avbryte kontakten sekvens, dvs. ytterligere samtaler til touchesMoved:, hvis kontakten går utenfor visse grenser. Hvordan kan jeg gjøre det?

Jeg vet at i touchesMoved:jeg kan inspisere koordinatene berørings objektet og ignorere det, men det jeg ikke vet er hvordan å avbryte sekvensen helt. Jeg ser ikke noen metode dokumentert i Apple Developer UIResponderReference at jeg kan ringe for å avbryte en touch sekvens.

Publisert på 10/02/2009 klokken 18:37
kilden bruker
På andre språk...                            


12 svar

stemmer
6

Denne løsningen kan være litt kludgy, men du kan implementere og manuelt ringe

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

Jeg basere denne løsningen løst på noen tilpasning jeg gjorde til moveme prøve app på Apples iPhone eksempelkode området der jeg endret touchesMovedmetode for å se slik ut:

- (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;
}
Svarte 10/02/2009 kl. 19:51
kilden bruker

stemmer
3

Prøv midlertidig innstilling av UIImageView er userInteractionEnabled eiendom til NO

Svarte 28/11/2011 kl. 03:30
kilden bruker

stemmer
3

Du må ringe [super touchesMoved:withEvent:]for å la super utsikt rydde opp fra hendelsen, men enda viktigere, må du ikke ringe [super touchesCancelled:withEvent:].

Her er hva jeg brukte på en celle for å holde den fra å bli valgt når jeg oppdaget en sveip:

- (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];
    }
}
Svarte 13/05/2010 kl. 00:50
kilden bruker

stemmer
2

Jeg tror ikke det er mulig fordi jeg ikke ser det dokumentert, og ingen av disse løsningene fungerer.

Svarte 21/11/2011 kl. 04:23
kilden bruker

stemmer
2

Jeg har møtt det samme problemet nylig, og fant en standard måte å løse det. Du kan bruke [[UIApplication sharedApplication] beginIgnoringInteractionEvents] for å slutte å levere touchesMoved hendelser til hele programmet. Sørg for å gjøre dem i stand ved hjelp av [[UIApplication sharedApplication] endIgnoringInteractionEvents] når du trenger å få berøringer på nytt.

Svarte 05/04/2010 kl. 09:30
kilden bruker

stemmer
1

Jeg oppnå dette ved å fjerne utsikten fra sin Super og legge det rett tilbake.

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

Dette bryter responder kjeden til visningen slik at eventuelle gjenværende berører ikke vil bli mottatt på utsikten. Den neste touch vil fortsatt bli mottatt som normalt.

Svarte 03/08/2016 kl. 10:44
kilden bruker

stemmer
1

Denne koden vil hjelpe deg. Jeg deaktivere berørings hendelse i touchesMoved:metoden, og jeg er slik at berøring hendelse i touchesCancelled:metode

-(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];
}
Svarte 21/08/2014 kl. 10:31
kilden bruker

stemmer
1

"Brute force" løsning avhengig om det passer dine behov: Ta ut og re-initialisere subview som mottar berører eller svarer på dem (selvfølgelig ta vare på ramme og innhold).

Svarte 24/03/2013 kl. 20:56
kilden bruker

stemmer
0

Jeg prøvde bare å løse noe som dette, og fant ut at ingen av løsningene oppført hennes fungerte for meg. Det beste jeg kunne klare ble midlertidig ignorerer berører, men da de opptas når kontakten inn på nytt utsikten.

Til slutt løste det.

  1. Sett opp en boolsk flagg som heter "deaktivert"
  2. I touchedMoved, først kontrollere at berørings er inne ønsket visning. Hvis det ikke er det, satt funksjonshemmede flagget til YES.
  3. Fortsatt i i touchedMoved, sjekk flagget før du utfører handlingen. Så på dette punktet, vil ingenting skje hvis de er utenfor visningen.
  4. I touchesEnded, satt funksjonshemmede flagget til NO. Så ta på sekvensen er effektivt stanses inntil brukeren løfter fingeren.

Jeg tror dette vil fungere for deg med mindre du har en spesiell grunn for bokstavelig talt trenger å trykke sekvens kansellert.

Svarte 13/01/2013 kl. 14:41
kilden bruker

stemmer
0

På iOS5 det synes å være en privat metode i UITouch

-(void)setSentTouchesEnded:(BOOL)ended;

Avhengig av Apples implementering det kunne slutte å sende hendelser

En annen måte å gjøre det ville være å bruke assosiative gjenstander

- (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);
    }
}
Svarte 25/11/2011 kl. 18:44
kilden bruker

stemmer
-1

Du kan opprette kategori til UITouch. Du kan for å erklære

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

Og når du endrer touch.view til null, for eksempel, kan du simulere slutten av utsending berørings hendelser

Svarte 17/04/2013 kl. 19:43
kilden bruker

stemmer
-2

Du kan sjekke at berøringspunkt stedene er i CGRect (ie. Punktene er i rektangel av bildeVis) eller ikke. Hvis de ikke er i den Rekt, vil kontakten bli kansellert.

-(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];
     }
 }
Svarte 24/11/2011 kl. 05:44
kilden bruker

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