2012-04-01 28 views
9

Mam podklasę UIView, która ma wykryć dotknięcia. Widok wykrywa dotknięcia tylko wtedy, gdy dotknięcia rozpoczęły się w bieżącym widoku. Gdy dotknięcia zaczynają się poza widokiem i poruszają się wewnątrz moich niestandardowych widoków, dotknięcia nie zostaną wywołane. Jakieś rozwiĘ ... zanie do wykrywania ruchomych akcentów, które nie rozpoczę ły się w aktualnym widoku?iOS - Wykrywanie dotyku w UIView?

@implementation MycustomView 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    // This only gets called if touches have started in the current View 
} 

@end 
+1

To jest udokumentowane i zamierzone zachowanie. Być może, jeśli dasz wgląd w to, * co * chcesz osiągnąć, ktoś może ci pomóc * jak *. – NJones

+0

Mam wiele niestandardowych widoków na ekranie Chcę wykryć UIViews, jak dotyka nad nimi – aryaxt

Odpowiedz

20

Poniżej rozwiązanie działało. Mam wiele instancji MyCustomView; jak dotyka poruszać Chcę wykryć poglądy, które są dotykane

skończyło się porusza wykrywanie dotykowy z MyCustomView jego Superview, więc następujący kod nie jest już w klasie MyCustomView:

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

    for (UIView *view in self.contentView.subviews) 
    { 
     if ([view isKindOfClass:[MyCustomView class]] && 
      CGRectContainsPoint(view.frame, touchLocation)) 
     { 

     } 
    } 
} 
1

powinno to naprawić:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [[event allTouches] anyObject]; 
    for (UIView* subView in self.subviews) 
    { 
     if([subView pointInside:[self convertPoint:touch toView:subView] withEvent:event]) 
     { 
      //do your code here 
     } 
    } 
} 
+0

Zachowuje się tak samo jak to, co już mam. Moje dotknięcia przechodzą 5 różnych UIViews i zawsze zwraca pierwszy widok, że dotknięcia rozpoczęły się od – aryaxt

+0

skopiuj metodę touchesMoved .. aby zobaczyć, co tam robisz .. – skytz

+0

Kod jest dokładnie tym, co napisałeś, z wyjątkiem tego, że mam NSlog w tym: NSLog (@ "% @", [dotykowy widok]); – aryaxt

0

jedną stronę aby to zrobić (choć mogą istnieć inne osoby), należy wyłączyć interakcję użytkownika z subskrybcjami i sprawić, aby ich widok macierzysty śledził ruch (użyj metody hitTest, aby dowiedzieć się, który widok jest aktualnie dotknięty).

0

Spróbuj to ....

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    for(UITouch *touch in touches) 
    { 
     CGPoint touchPointFirstBtn = [touch locationInView:self.ChordView]; 
     if(CGRectContainsPoint(_btnC.frame, touchPointFirstBtn)) 
     { 
      if (!_btnC.isHighlighted) 
      { 
       if(!Boolean) 
       { 
        title = @"C"; 
        [_tlbView reloadData]; 
        NSLog(@"%@",@"touches C"); 

       } 
       [_btnC setHighlighted:YES]; 
       Boolean = YES; 

      } 
     } 
     else 
     { 
      [_btnC setHighlighted:NO]; 
      Boolean = NO; 
     } 
} 
Powiązane problemy