2009-02-21 17 views
21

मैं आईफोन एसडीके में नया हूं। अभी मैं कैलियर के साथ प्रोग्रामिंग कर रहा हूं, जिसे मैं वास्तव में बहुत पसंद करता हूं - यूआईवीव्स के रूप में महंगा नहीं, और ओपनजीएल ईएस स्प्राइट्स से बहुत कम कोड।कैलियर पर टच इवेंट कैसे प्राप्त करें?

मेरे पास यह प्रश्न है: क्या कैलियर पर टच इवेंट प्राप्त करना संभव है? मैं समझता हूँ कि कैसे

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

साथ एक UIView पर एक स्पर्श घटना प्राप्त करने के लिए, लेकिन मैं कहीं भी कैसे उदाहरण के लिए, एक CALayer वस्तु पर एक स्पर्श घटना प्राप्त करने के लिए के बारे में, एक नारंगी वर्ग 3 डी अंतरिक्ष में तैरते नहीं मिल रहा। मैं विश्वास करने से इनकार करता हूं कि मैं अकेला हूं जो इस बारे में उत्सुक है।

मैं किसी भी मदद की सराहना करता हूं!

उत्तर

29

ठीक है- मेरे अपने प्रश्न का उत्तर दिया! आइए मान लें कि आपके पास अपने व्यू कंट्रोलर की मुख्य परत में कैलियर का गुच्छा है, और आप उन्हें स्पर्श करते समय अस्पष्टता 0.5 पर जाना चाहते हैं। आपके विचार नियंत्रक वर्ग के मीटर फ़ाइल में इस कोड को लागू:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    if ([touches count] == 1) { 
     for (UITouch *touch in touches) { 
      CGPoint point = [touch locationInView:[touch view]]; 
      point = [[touch view] convertPoint:point toView:nil]; 

      CALayer *layer = [(CALayer *)self.view.layer.presentationLayer hitTest:point]; 

      layer = layer.modelLayer; 
      layer.opacity = 0.5; 
     } 
    } 
} 
+1

स्पष्टता के लिए नोट्स: जब से तुम सत्यापित केवल एक स्पर्श है पाश के लिए 1., थोड़ा अजीब है। ऐसा करने का सामान्य तरीका है [किसी भी ऑब्जेक्ट को छूता है] या [ऑब्जेक्ट एट इंडेक्स: 0] स्पर्श करके स्पर्श करने के लिए पॉइंटर बनाना। 2. कन्वर्टपॉइंट का उपयोग करने के बजाय: बस स्थान पर "शून्य" पास करें इनव्यू: पहले स्थान पर। यह खिड़की के समन्वय प्रणाली में स्पर्श स्थान देता है, इसलिए अगली पंक्ति अनावश्यक है। – Rab

+1

मुझे पता है कि यह काफी पुराने प्रश्न हैं। लेकिन सिर्फ उन लोगों के लिए जो उत्सुक हैं। @ रैब को छोड़कर अधिकतर [स्पर्श ऑब्जेक्टएट इंडेक्स: 0] एनएससेट जो स्पर्शों के सेट का प्रतिनिधित्व करता है, में ऑब्जेक्ट एट इंडेक्स चयनकर्ता नहीं होता है। –

+0

+1 अच्छा बिंदु @EugeneProkoshev। यह संभव है कि कोई व्यक्ति एनएसएआरएआरई में टच इवेंट्स डाल सकता है, लेकिन इस मामले में हमारे पास एनएसएससेट है जो अनदेखा है। स्पष्टीकरण के स्पष्टीकरण के लिए धन्यवाद। :) – Rab

1

मैंने पाया कि मैं

point = [[touch view] convertPoint:point toView:nil]; 

के साथ गलत निर्देशांक हो रही थी मैं

point = [[touch view] convertPoint:point toView:self.view]; 
को बदलना पड़ा

सही परत

+0

बहुत बहुत धन्यवाद ..... !! – Sarah

7

पहले उत्तर के समान होने के लिए।

- (CALayer *)layerForTouch:(UITouch *)touch { 
    UIView *view = self.view; 

    CGPoint location = [touch locationInView:view]; 
    location = [view convertPoint:location toView:nil]; 

    CALayer *hitPresentationLayer = [view.layer.presentationLayer hitTest:location]; 
    if (hitPresentationLayer) { 
     return hitPresentationLayer.modelLayer; 
    } 

    return nil; 
} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    CALayer *hitLayer = [self layerForTouch:touch]; 

    // do layer processing... 
} 
संबंधित मुद्दे