2011-05-15 5 views
10

पिन करते समय केंद्र समन्वय बनाए रखें यदि आप डिवाइस के स्थान को ट्रैक करते समय ऐप्पल के मैप्स एप्लिकेशन में ज़ूम इन/आउट करने के लिए चुटकी करते हैं, तो चुटकी इशारा के "पैन" घटक को अनदेखा किया जाता है और नीली स्थान सूचक केंद्र के केंद्र में स्थिर रहता है स्क्रीन। सादा MKMapView का उपयोग करते समय यह मामला नहीं है।MKMapView

मान लीजिए कि मेरे पास पहले से ही उपयोगकर्ता का स्थान है, मैं इस प्रभाव को कैसे प्राप्त कर सकता हूं? मैंने प्रतिनिधि के regionDid/WillChangeAnimated: विधियों में केंद्र समन्वय को रीसेट करने का प्रयास किया है, लेकिन उन्हें केवल इशारा की शुरुआत और अंत में बुलाया जाता है। मैंने UIPinchGestureRecognizer सबक्लास को जोड़ने का भी प्रयास किया जो छूने के दौरान केंद्र समन्वय को रीसेट करता है, लेकिन इसके परिणामस्वरूप ग्लिच प्रस्तुत होते हैं।


संपादित करें: जो लोग रुचि रखते हैं, मेरे लिए निम्न कार्य के लिए।

// CenterGestureRecognizer.h 
@interface CenterGestureRecognizer : UIPinchGestureRecognizer 

- (id)initWithMapView:(MKMapView *)mapView; 

@end 

// CenterGestureRecognizer.m 
@interface CenterGestureRecognizer() 

- (void)handlePinchGesture; 

@property (nonatomic, assign) MKMapView *mapView; 

@end 

@implementation CenterGestureRecognizer 

- (id)initWithMapView:(MKMapView *)mapView { 
    if (mapView == nil) { 
    [NSException raise:NSInvalidArgumentException format:@"mapView cannot be nil."]; 
    } 

    if ((self = [super initWithTarget:self action:@selector(handlePinchGesture)])) { 
    self.mapView = mapView; 
    } 

    return self; 
} 

- (BOOL)canBePreventedByGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer { 
    return NO; 
} 

- (BOOL)canPreventGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer { 
    return NO; 
} 

- (void)handlePinchGesture { 
    CLLocation *location = self.mapView.userLocation.location; 
    if (location != nil) { 
    [self.mapView setCenterCoordinate:location.coordinate]; 
    } 
} 

@synthesize mapView; 

@end 

तो बस इसे अपने MKMapView में जोड़ें:

[self.mapView addGestureRecognizer:[[[CenterGestureRecognizer alloc] initWithMapView:self.mapView] autorelease]]; 

उत्तर

5

उपयोगकर्ता (के रूप में सिम्युलेटर के खिलाफ) है, यह दोनों एक पैन और पिंच जेस्चर का कारण बनता है वास्तविक डिवाइस की स्क्रीन pinches जब - चुटकी गति के तत्व "ज़ूम" शामिल है, और पैन शामिल लंबवत और क्षैतिज परिवर्तन। आपको पैन को अवरुद्ध करने और अवरुद्ध करने की आवश्यकता है, और इसका मतलब है UIPanGestureRecognizer का उपयोग करना।

scrollEnabledNO पर सेट करें, फिर केंद्र समन्वय को रीसेट करने के लिए UIPanGestureRecognizer जोड़ें। संयोजन एकल-उंगली पैनिंग और चुटकी के पैन घटक दोनों को अवरुद्ध करेगा।


संपादित अधिक विवरण जोड़ने के लिए, और अपने कोड को देखने के बाद: touchesMoved:withEvent पैन के बाद कहा जाता है पहले से ही शुरू हो गया है, इसलिए यदि आप MKMapView के केंद्र वहाँ बदलने के लिए, आप herky झटकेदार प्रतिपादन समस्याओं मिल जाएगा आपने वर्णन किया है क्या तुम सच में की जरूरत है ताकि तरह एक लक्ष्य-एक्शन वाली एक UIPanGestureRecognizer बनाने के लिए, यह है:

UIPanGestureRecognizer *pan = [[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(didRecognizePan)] autorelease]; 
    pan.delegate = self; 
    [self.mapView addGestureRecognizer:pan]; 

... और फिर अपने नियंत्रक करने के लिए एक didRecognizePan विधि जोड़ने के लिए, और अपने केंद्र को रीसेट वहाँ है।

+0

इसके परिणामस्वरूप ऊपर वर्णित वही प्रतिपादन समस्याएं हुईं: मानचित्र दृश्य का केंद्र अक्सर उपयोगकर्ता के स्थान के बीच वैकल्पिक होता है और जहां इशारा पहचानकर्ता अपना कोर्स चलाते हैं। शायद मैंने आपके उत्तर को गलत समझा है? मैंने यहां अपने 'यूआईपीएनजेस्टर रिकॉग्नाइज़र' सबक्लास के कार्यान्वयन को पोस्ट किया है: http://pastie.org/1934011 –

+0

यह चाल है! मुझे खुशी है कि समाधान इतना आसान था। धन्यवाद, स्कॉट। –

0

बस एक अनुमान है, लेकिन आप regionWillChangeAnimated: के शुरू में NO को scrollEnabled स्थापित करने की कोशिश की है?

+0

दुर्भाग्य से यह काम नहीं किया। अगर मैं इसे शुरुआत में (प्रतिनिधि विधियों के बाहर) पर 'NO'' पर सेट करता हूं, तो एकल उंगली पैनिंग अक्षम कर दी जाती है लेकिन चुटकी इशारे के "पैन" घटक अभी भी उपयोग किए जाते हैं। –

0

बस एक अनुमान भी है। क्षेत्र की शुरुआत में WillChangeAnimated: वर्तमान मानचित्र क्षेत्र को सहेजें, फिर self.myMapView.region = theSavedRegion या इसी तरह का उपयोग करके एनएसटीमर के माध्यम से क्षेत्र को लगातार अपडेट करें। फिर टाइमर को अमान्य करें जब क्षेत्रडिड चेंजएनिमेटेड: कहा जाता है।

हालांकि, आपको एक समस्या हो सकती है जहां एनएसटीमर द्वारा क्षेत्रीय क्षेत्र क्षेत्रफल का कारण बनता है, जिसे फिर से बुलाया जाता है।

इसे आज़माएं और देखें कि क्या होता है।

+0

मुझे संदेह है कि इस परिणाम में उल्लिखित वही प्रतिपादन ग्लिच का परिणाम होगा; यह प्रभावी रूप से एक ही चीज़ कर रहा है, बस 'UIGestureRecognizer' की बजाय टाइमर के साथ। अगर मेरी कोई सफलता हो तो मैं जांच करूँगा और रिपोर्ट करूंगा। –

+0

मैंने पैन जेस्चर को रोकने की कोशिश के साथ थोड़ा सा खेला लेकिन यह काम नहीं कर रहा था। शुभकामनाएं, यह जानने के लिए इंतजार नहीं कर सकता कि समाधान क्या है! – timthetoolman