2012-08-14 5 views
5

Ich bin mir sicher, dass dieses Problem wird leicht gelöst werden, aber ich bin relativ neu in iOS-Entwicklung. Ich versuche, Berührungsereignisse an Kinder zu übergeben, die in der Zeichenreihenfolge auf einer UIView niedriger sind. Zum Beispiel -Passenden Touch zu nächsten Responder oder andere Unteransicht iOS

Ich erstelle erweiterte UIImageView, um meine MoveableImage-Klasse zu erstellen. Diese Klasse ist nur UIImageView im Grunde, die die touchesBegan, touchesEnded und touchesMoved- implementiert

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 


[self showFrame]; 

//if multitouch dont move 
if([[event allTouches]count] > 1) 
{ 
    return; 
} 



    UITouch *touch = [[event touchesForView:self] anyObject ]; 

    // Animate the first touch 
    CGPoint colorPoint = [touch locationInView:self]; 

    CGPoint touchPoint = [touch locationInView:self.superview]; 


    //if color is alpha of 0 , they are touching the frame and bubble to next responder 
    UIColor *color = [self colorOfPoint:colorPoint]; 
    [color getRed:NULL green:NULL blue:NULL alpha:&touchBeganAlpha]; 
    NSLog(@"alpha : %f",touchBeganAlpha); 

    if(touchBeganAlpha > 0) 
    { 
      [self animateFirstTouchAtPoint:touchPoint]; 
    } 
    else { 
     [super.nextResponder touchesBegan:touches withEvent:event]; 
    } 



} 

So ist das Endergebnis im Grunde this- Wenn sie den Rahmen des Imageview und nicht das Bild im anderen Bild berühren, die sein wird, Darunter kann möglicherweise reagieren. Sehen Sie sich dieses Bild für ein Beispiel an.

Passing touch to lower view

Bisher habe ich versucht nächste Responder jedoch, dass löst nicht das Problem. Jede Hilfe würde sehr geschätzt werden!

Behoben - Ich habe aufgehört, die Alpha auf die Berührungen zu überprüfenBegan und touchesMoved. Ovveriding PointInside erlaubte der UIView, das für mich zu handhaben.

-(BOOL) pointInside:(CGPoint)point withEvent:(UIEvent *) event 
{ 
    BOOL superResult = [super pointInside:point withEvent:event]; 
    if(!superResult) 
    { 
    return superResult; 
    } 

    if(CGPointEqualToPoint(point, self.previousTouchPoint)) 
    { 
    return self.previousTouchHitTestResponse; 
    }else{ 
    self.previousTouchPoint = point; 
    } 

    BOOL response = NO; 

    //if image is nil then return yes and fall back to super 
    if(self.image == nil) 
    { 
    response = YES; 
    } 

    response = [self isAlphaVisibleAtPoint:point]; 
    self.previousTouchHitTestResponse = response; 
    return response; 





} 

Antwort

7

Sie können stattdessen - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event Methode für Ihre Unterklasse von UIImageView außer Kraft setzen. (Es ist eine Methode von uiview, die jede Unterklasse überschreiben kann)

Die UIView verwendet diese Methode in hitTest:withEvent:, um zu ermitteln, welche Unteransicht ein Berührungsereignis erhalten soll. Wenn pointInside: withEvent: YES zurückgibt, wird die Hierarchie der Untersicht durchlaufen. Andernfalls wird der Zweig der Ansichtshierarchie ignoriert.

Überprüfen Sie den Quellcode auf GitHub von OBShapedButton. Sie behandeln Tap-Ereignis nur für den opaken Teil einer Schaltfläche.

+0

Arbeitete super danke Mann! – thebringking

Verwandte Themen