2011-01-27 19 views
5

के लिए एंकर पॉइंट सेट करना मेरे पास एक UIView सबक्लास है जिसे मैं इसके पर्यवेक्षण में घूमने में सक्षम होना चाहता हूं। जब उपयोगकर्ता self.center के बाहर कहीं भी UIView को छूता है लेकिन self.bounds के भीतर यह "कूदता है" क्योंकि मैं वास्तविक स्थान प्राप्त करने के लिए self.center पर नया स्थान जोड़ता हूं। इस व्यवहार से बचने के लिए मैं एक एंकर पॉइंट सेट करने की कोशिश कर रहा हूं जो उपयोगकर्ता को इसकी सीमाओं के भीतर कहीं भी पकड़ ले और खींचने देता है।UIView परत

मेरी समस्या यह है कि जब मैं नए एंकर पॉइंट की गणना करता हूं (जैसा कि नीचे दिए गए कोड में दिखाया गया है) कुछ भी नहीं होता है, दृश्य स्थिति को बिल्कुल नहीं बदलता है। दूसरी ओर, अगर मैं एंकर पॉइंट को एक सटीक बिंदु पर सेट करता हूं तो मैं दृश्य को स्थानांतरित कर सकता हूं (लेकिन फिर निश्चित रूप से यह "सटीक बिंदु पर" कूदता है)। यह उम्मीद के रूप में कैसे काम नहीं करता है?

धन्यवाद।

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    // Only support single touches, anyObject retrieves only one touch 
    UITouch *touch = [touches anyObject]; 
    CGPoint locationInView = [touch locationInView:self]; 

    // New location is somewhere within the superview 
    CGPoint locationInSuperview = [touch locationInView:self.superview]; 

    // Set an anchorpoint that acts as starting point for the move 
    // Doesn't work! 
    self.layer.anchorPoint = CGPointMake(locationInView.x/self.bounds.size.width, locationInView.y/self.bounds.size.height); 
    // Does work! 
    self.layer.anchorPoint = CGPointMake(0.01, 0.0181818); 

    // Move to new location 
    self.center = locationInSuperview; 
} 
+1

सुनिश्चित करें कि आपको एंकरपॉइंट की पूरी समझ है: http://stackoverflow.com/a/22188420/550393 – 2cupsOfTech

उत्तर

12

जैसा कि क्रिस वान बायल ने इंगित किया है, आपको touchsBegan:withEvent: विधि में एंकर पॉइंट गणना करने की आवश्यकता होगी ताकि आंदोलन को अस्वीकार न किया जा सके। इसके अतिरिक्त, परत के anchorPoint को बदलने से दृश्य की प्रारंभिक स्थिति बढ़ जाएगी, आपको पहले स्पर्श के बाद 'कूद' से बचने के लिए दृश्य के center बिंदु पर ऑफसेट जोड़ना होगा।

आप की गणना (और अपने दृश्य के center बिंदु को जोड़ने) ऑफसेट प्रारंभिक और अंतिम anchorPoints के बीच अंतर के आधार पर ऐसा कर सकते हैं (अपने दृश्य के चौड़ाई/ऊंचाई से गुणा) या आप दृश्य के center प्रारंभिक करने के लिए सेट कर सकते हैं स्पर्श बिंदु।

कुछ इस तरह शायद: सेब के डॉक्स here से anchorPoint के पर

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

    UITouch *touch = [touches anyObject]; 
    CGPoint locationInView = [touch locationInView:self]; 
    CGPoint locationInSuperview = [touch locationInView:self.superview]; 

    self.layer.anchorPoint = CGPointMake(locationInView.x/self.frame.size.width, locationInView.y/self.frame.size.height); 
    self.center = locationInSuperview; 
} 

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

    UITouch *touch = [touches anyObject]; 
    CGPoint locationInSuperview = [touch locationInView:self.superview]; 

    self.center = locationInSuperview; 
} 

अधिक जानकारी और एक समान तो सवाल मैं here संदर्भित किया है।

0

आपको केवल टचबीजिन पर एंकरपॉइंट अपडेट करना चाहिए। यदि आप इसे हर समय पुन: गणना करते हैं (TouchMoved), यह तार्किक है कि सबव्यूव नहीं चलता है।

+0

धन्यवाद, बेशक आप सही हैं! इसके अलावा, एंकर पॉइंट को पुन: गणना करने में स्पष्ट रूप से कोई बात नहीं है क्योंकि वास्तविक चाल शुरू होने पर उपयोगकर्ता अंगूठी के भीतर उंगली को नहीं ले जायेगा। टच करने के लिए एंकरपॉइंट के अपडेट को बदलना बेगन ने ऑफसेट समस्या उत्पन्न की क्योंकि सैम ने अपने जवाब में हाइलाइट किया था। – Oskar