2012-08-14 8 views
5

पर संपर्क पास करना मुझे यकीन है कि इस समस्या को आसानी से हल किया जाएगा हालांकि मैं आईओएस विकास के लिए अपेक्षाकृत नया हूं। मैं UIView पर ड्रॉ ऑर्डर में कम बच्चों के लिए गुजरने वाली स्पर्श घटनाओं को संभालने की कोशिश कर रहा हूं। उदाहरण के लिए -अगले उत्तरदाता या अन्य उप-दृश्य आईओएस

मैं अपने मूवबल इमेज क्लास को बनाने के लिए विस्तारित UIImageView बनाता हूं। इस वर्ग के सिर्फ मूल रूप से UIImageView कि touchesBegan, touchesEnded और touchesMoved-

-(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]; 
    } 



} 

लागू करता है तो अंतिम परिणाम मूल रूप से इस-है वे अन्य छवि है कि हो जाएगा अंदर imageView के फ्रेम और नहीं छवि को छू रहे हैं, तो नीचे संभवतः जवाब दे सकते हैं। उदाहरण के लिए इस छवि को देखें।

Passing touch to lower view

अब तक मैं कोशिश की है अगले प्रत्युत्तर लेकिन इस समस्या का समाधान नहीं है। किसी भी तरह की सहायता का स्वागत किया जाएगा!

हल हुआ- मैंने स्पर्शों पर अल्फा की जांच करना बंद कर दिया और स्पर्श किया। Ovveriding बिंदु इनसाइड ने UIView को मेरे लिए इसे संभालने की अनुमति दी।

-(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; 





} 

उत्तर

7

आप UIImageView के अपने उपवर्ग के लिए बजाय - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event विधि ओवरराइड कर सकते हैं। (यह यूवीव का एक तरीका है कि प्रत्येक सबक्लास ओवरराइड कर सकता है)

UIView इस विधि का उपयोग hitTest:withEvent: में करता है यह निर्धारित करने के लिए कि कौन सा सबव्यूव स्पर्श ईवेंट प्राप्त करना चाहिए। यदि प्वाइंट इनसाइड: के साथ: YES लौटाता है, तो सबव्यू के पदानुक्रम को उलट दिया जाता है; अन्यथा, दृश्य पदानुक्रम की इसकी शाखा को नजरअंदाज कर दिया जाता है।

OBShapedButton के जिथब पर स्रोत कोड देखें। वे केवल बटन के अपारदर्शी भाग के लिए टैप ईवेंट को संभालते हैं।

+0

महान धन्यवाद आदमी काम किया! – thebringking

संबंधित मुद्दे