Nasıl UITouch olaylar dizisini iptal etmek?

oy
20

Bir var UIImageolayları dokunmaya tepki görünümü. Ben dokunmatik dizisi, yani, başka arama iptal etmek istediğiniz touchesMoved:dokunmatik belli sınırların dışına çıkması halinde,. Bunu nasıl yapabilirim?

Ben de biliyorum touchesMoved:I it dokunmatik nesnenin koordinatlarını incelemek ve gözardı edebilirsiniz ama ne bilmiyorum tamamen diziyi iptal etmek nasıl. Ben belgelenen herhangi bir yöntem görmüyorum Elma Geliştirici UIResponderBaşvurusu Bir dokunma dizisi iptal etmek çağırabilir.

Oluştur 10/02/2009 saat 19:37
kaynak kullanıcı
Diğer dillerde...                            


12 cevaplar

oy
6

Bu çözüm biraz kludgy olabilir, ama uygulamak ve elle diyebiliriz

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

Ben Apple'ın üzerinde MOVEME örnek uygulamasına yaptığımız bazı verdiği üzerinde gevşek bu çözümü dayandırarak iPhone örnek kod Değiştirilmiş sitede touchesMovedşöyle görünecek şekilde yöntemini:

- (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;
}
Cevap 10/02/2009 saat 20:51
kaynak kullanıcı

oy
3

NO UIImageView'ın userInteractionEnabled özelliğini ayarlayarak geçici deneyin

Cevap 28/11/2011 saat 04:30
kaynak kullanıcı

oy
3

Sen buna gerek [super touchesMoved:withEvent:]süper görünümü olaydan temizlemek ama daha da önemlisi, gerek izin için değil diyoruz [super touchesCancelled:withEvent:].

İşte ben bir tokatlamak tespit zaman seçilmiş alıyorum onu ​​tutmak için bir hücreyi derdi:

- (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];
    }
}
Cevap 13/05/2010 saat 01:50
kaynak kullanıcı

oy
2

Ben o belgelenmiş ve bu çözümlerin hiçbiri işe görmüyorum çünkü mümkün olduğunu sanmıyorum.

Cevap 21/11/2011 saat 05:23
kaynak kullanıcı

oy
2

Geçenlerde aynı sorunla karşı karşıya ve bunu çözmek için standart bir yol buldum. Eğer bütün uygulamasına touchesMoved olayları teslim edilmesini durdurmak için [[UIApplication sharedApplication] beginIgnoringInteractionEvents] kullanabilirsiniz. Tekrar rötuşları almak için gereken zaman [[UIApplication sharedApplication] endIgnoringInteractionEvents] kullanarak bunları etkinleştirmek için emin olun.

Cevap 05/04/2010 saat 10:30
kaynak kullanıcı

oy
1

Ben onun Superview manzarayı çıkarıp düz geri ekleyerek bunu başarmak.

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

Bu nedenle kalan dokunuşları görünümde alınmayacaktır görünümüne cevap zincirini kırar. Bir sonraki dokunmatik normal şekilde alınacak.

Cevap 03/08/2016 saat 10:44
kaynak kullanıcı

oy
1

Bu kod size yardımcı olacaktır. Ben de dokunmatik olayını devre dışı touchesMoved:yöntem ve ben de dokunmatik olayını sağlayan am touchesCancelled:yöntemle

-(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];
}
Cevap 21/08/2014 saat 11:31
kaynak kullanıcı

oy
1

o sizin ihtiyaçlarınıza uygun olursa "kaba kuvvet" çözüm olarak: çıkarın ve (elbette çerçevesi ve içeriği özen) dokunuşlar alır veya bunlara yanıt subview yeniden başlatın.

Cevap 24/03/2013 saat 21:56
kaynak kullanıcı

oy
0

Sadece böyle bir şey çözmeye çalışan ve çözümlerin hiçbiri ona benim için çalıştı listelenmiş bulunmuştur. ı yönetmek olabileceği en iyi geçici dokunuşları göz ardı edilmiş, ancak dokunmatik görünümüne yeniden girildiğinde o zaman devam etti.

Sonunda bunu çözdü.

  1. denilen bir boolean bayrak ayarlama "özürlü"
  2. touchedMoved, ilk temas istenilen görünümü içinde olduğunu kontrol edin. Değilse, YES engelli bayrağını ayarlayın.
  3. Yine touchedMoved in, senin eylem gerçekleştirmeden önce bayrağını kontrol edin. Bu görünümden dışında iseniz Yani, bu noktada, hiçbir şey olmaz.
  4. touchesEnded yılında NO engelli bayrağını ayarlayın. kullanıcı parmağını kaldırdı kadar Yani dokunmatik dizisi etkin bir durdurulur.

Ben tam anlamıyla iptal dokunmatik diziyi ihtiyacı için özel bir nedeniniz olmadıkça bu sizin için çalışacaktır sanırım.

Cevap 13/01/2013 saat 15:41
kaynak kullanıcı

oy
0

iOS5 On UITouch özel bir yöntem gibi görünüyor

-(void)setSentTouchesEnded:(BOOL)ended;

elma uygulamasına bağlı olayları göndermeyi durdurmak olabilir

Bunu yaparken bir başka yolu ilişkisel nesneleri kullanarak olacağını

- (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);
    }
}
Cevap 25/11/2011 saat 19:44
kaynak kullanıcı

oy
-1

Sen UITouch kategoriyi oluşturabilir. Sen ilan etmek can

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

Eğer nil touch.view değiştirmek zaman, örneğin, dokunma olayları göndermesiyle sona simüle edebilirsiniz

Cevap 17/04/2013 saat 20:43
kaynak kullanıcı

oy
-2

Bunu kontrol edebilirsiniz, temas noktası yerleri bulunmaktadır CGRect veya olmasın (yani. Noktalarının ImageView Dikdörtgen içindedir). Onlar bu Rect değilse, dokunmatik iptal edilecektir.

-(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];
     }
 }
Cevap 24/11/2011 saat 06:44
kaynak kullanıcı

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