Jak zrušit sled událostí UITouch?

hlasů
20

Mám UIImagenázor, že reaguje na dotek události. Chci zrušit dotykové sekvenci, tedy další volání touchesMoved:, je-li dotek jde ven z jistých mezích. Jak to mohu udělat?

Vím, že v touchesMoved:mohu prohlédnout souřadnic objektu dotykové a ignorovat, ale to, co nevědí, je to, jak zrušit pořadí dohromady. Nevidím žádnou metodu popsanou v Apple Developer UIResponderreference , které mohu zavolat zrušit dotykový sekvence.

Položena 10/02/2009 v 19:37
zdroj uživatelem
V jiných jazycích...                            


12 odpovědí

hlasů
6

Toto řešení může být trochu kludgy, ale můžete implementovat a ručně volání

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

Jsem založila toto řešení volně na nějaké ladění jsem udělal na vzorku cca POHYB na Apple ukázkový kód iPhone místě, kde jsem upravoval touchesMovedzpůsob vypadat takto:

- (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;
}
Odpovězeno 10/02/2009 v 20:51
zdroj uživatelem

hlasů
3

Zkuste dočasné nastavení userInteractionEnabled vlastnost UIImageView k NO

Odpovězeno 28/11/2011 v 04:30
zdroj uživatelem

hlasů
3

Musíte zavolat [super touchesMoved:withEvent:], aby se nechal super pohled vyčistit od události, ale co je důležitější, je třeba to říkat [super touchesCancelled:withEvent:].

Tady je to, co jsem použil na buňku, aby jej od dobývání zvolen, když jsem zjistil výpad:

- (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];
    }
}
Odpovězeno 13/05/2010 v 01:50
zdroj uživatelem

hlasů
2

Nemyslím si, že je to možné, protože nevidím to zdokumentováno a žádné z těchto řešení fungovat.

Odpovězeno 21/11/2011 v 05:23
zdroj uživatelem

hlasů
2

Já jsem stál před stejným problémem v poslední době a našel standardní způsob, jak ho vyřešit. Můžete používat [[UIApplication sharedApplication] beginIgnoringInteractionEvents] přestat dodávat události touchesMoved na celé aplikace. Ujistěte se, že se jim umožní používat [[UIApplication sharedApplication] endIgnoringInteractionEvents], kdy je třeba znovu přijímat doteky.

Odpovězeno 05/04/2010 v 10:30
zdroj uživatelem

hlasů
1

I dosáhnout odstraněním pohled z jeho SuperView a dodává ji směrem dozadu.

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

To přeruší odpovídač řetěz k názoru, takže nebude možné přijímat zbývající doteky na pohled. Příští touch bude i nadále přijímat jako obvykle.

Odpovězeno 03/08/2016 v 10:44
zdroj uživatelem

hlasů
1

Tento kód vám pomůže. I vypnout dotekovou událost v touchesMoved:metodě a já umožňuje dotykové události v touchesCancelled:metodě

-(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];
}
Odpovězeno 21/08/2014 v 11:31
zdroj uživatelem

hlasů
1

„Hrubou silou“ řešení podle toho, jestli to vyhovuje vašim potřebám: Vyjměte a znovu inicializovat subview která přijímá doteky nebo na ně reaguje (samozřejmě postarat se o rám a obsahu).

Odpovězeno 24/03/2013 v 21:56
zdroj uživatelem

hlasů
0

Jen jsem se snažil řešit něco takového, a zjistil, že žádný z řešení uvedených ji pracoval pro mě. To nejlepší, co dokázal bylo dočasně ignorování doteků, ale pak pokračoval, když se dotek znovu vstoupil do pohledu.

Nakonec to vyřešil.

  1. Nastavit boolean vlajku s názvem „vypnout“
  2. V touchedMoved, nejprve zkontrolujte, zda je dotek je uvnitř požadované zobrazení. Pokud tomu tak není, nastavte vypnutý příznak na hodnotu Ano.
  3. Ještě v oblasti touchedMoved, zkontrolujte příznak před provedením akci. Takže v tomto okamžiku, nic se nestane, pokud jsou mimo zobrazení.
  4. V touchesEnded nastavit zakázané vlajku NO. Takže touch sekvence je efektivně zastaven, dokud uživatel zvedne prst.

Myslím, že to bude pracovat pro vás, pokud nemáte zvláštní důvod pro doslova museli dotykové sekvence zrušena.

Odpovězeno 13/01/2013 v 15:41
zdroj uživatelem

hlasů
0

Na iOS5 se zdá, že soukromá metoda UITouch

-(void)setSentTouchesEnded:(BOOL)ended;

V závislosti na implementaci jablka by mohla zastavit odesílání události

Dalším způsobem, jak toho dosáhnout, by bylo použití asociativních předměty

- (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);
    }
}
Odpovězeno 25/11/2011 v 19:44
zdroj uživatelem

hlasů
-1

Můžete vytvořit kategorii UITouch. Můžete deklarovat

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

A když změníte touch.view na nulu, například, můžete simulovat konec dispečink dotekové události

Odpovězeno 17/04/2013 v 20:43
zdroj uživatelem

hlasů
-2

Můžete zkontrolovat, zda jsou místa kontaktní bod jsou v CGRect (tj. Body jsou ve obdélník svého imageview), či nikoli. Pokud nejsou v tomto rect, bude zrušen touch.

-(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];
     }
 }
Odpovězeno 24/11/2011 v 06:44
zdroj uživatelem

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