2012-06-11 17 views
16

मुझे वास्तव में चारोंक्वेयर डिजाइन स्थल विवरण देखने के तरीके से प्यार है। विशेष रूप से "हेडर" दृश्य में स्थान स्थान के साथ मानचित्र ... यह कैसे किया गया था? विवरण स्पष्ट रूप से कुछ uiscrollview (शायद uitableview?) हैं और इसके पीछे (शीर्षलेख में) एक नक्शा है, इसलिए जब आप मानचित्र को स्क्रॉल करते हैं तो स्क्रॉल व्यू बाउंस के रूप में अनदेखा हो रहा है ... क्या किसी को यह पता है कि यह कैसे करना है?नया चौकोर स्थान विस्तार मानचित्र

enter image description here

+0

मैंने अपना जवाब संपादित कर लिया है, अब कार्यान्वयन सही है;) – yonel

उत्तर

32

यहाँ जिस तरह से मैं इसे पुन: पेश करने का प्रबंधन है: -

आप अपने दृश्य के रूप में एक UIScrollView के साथ एक UIViewController की जरूरत है। उसके बाद, आप जोड़ने UIView की सामग्री आपके scrollview करने के लिए इस तरह दिखना चाहिए: -

enter image description here - MKMapView के फ्रेम एक नकारात्मक y स्थिति है। इस मामले में, हम केवल डिफ़ॉल्ट स्थिति (ड्रैग करने से पहले) में नक्शे के 100pts देख सकते हैं।
- आपको अपने MKMapView इंस्टेंस पर ज़ूमिंग और स्क्रॉलिंग अक्षम करने की आवश्यकता है।

फिर, जब आप खींचें, और उसकी केंद्र स्थिति समायोजित करें, तो MKMapView के centerCoordinate को स्थानांतरित करने की चाल है।

कि के लिए, हम गणना ताकि हम जानते हैं कि कितना केंद्र नक्शे के समन्वय ले जाया जाना चाहिए जब स्क्रीन पर एक्स अंकों की घसीटा जा रहा है कितना 1point एक डेल्टा अक्षांश के रूप में प्रतिनिधित्व करते हैं: -

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    UIScrollView* scrollView = (UIScrollView*)self.view; 
    [scrollView addSubview:contentView]; 
    scrollView.contentSize = contentView.frame.size; 
    scrollView.delegate = self; 
    center = CLLocationCoordinate2DMake(43.6010, 7.0774); 
    mapView.region = MKCoordinateRegionMakeWithDistance(center, 1000, 1000); 
    mapView.centerCoordinate = center; 
    //We compute how much latitude represent 1point. 
    //so that we know how much the center coordinate of the map should be moved 
    //when being dragged. 
    CLLocationCoordinate2D referencePosition = [mapView convertPoint:CGPointMake(0, 0) toCoordinateFromView:mapView]; 
    CLLocationCoordinate2D referencePosition2 = [mapView convertPoint:CGPointMake(0, 100) toCoordinateFromView:mapView]; 
    deltaLatFor1px = (referencePosition2.latitude - referencePosition.latitude)/100; 
} 

एक बार उन गुणों को प्रारंभ करने के बाद, हमें UIScrollViewDelegate के व्यवहार को लागू करने की आवश्यकता है। जब हम खींचते हैं, तो हम बिंदुओं में अक्षांश में व्यक्त किए गए कदम को परिवर्तित करते हैं। और फिर, हम इस मूल्य के आधे हिस्से का उपयोग करके मानचित्र के केंद्र को स्थानांतरित करते हैं।

- (void)scrollViewDidScroll:(UIScrollView *)theScrollView { 
    CGFloat y = theScrollView.contentOffset.y; 
    // did we drag ? 
    if (y<0) { 
     //we moved y pixels down, how much latitude is that ? 
     double deltaLat = y*deltaLatFor1px; 
     //Move the center coordinate accordingly 
     CLLocationCoordinate2D newCenter = CLLocationCoordinate2DMake(center.latitude-deltaLat/2, center.longitude); 
     mapView.centerCoordinate = newCenter; 
    } 
} 

आप Foursquare एप्लिकेशन के रूप में समान व्यवहार प्राप्त (लेकिन बेहतर: Foursquare एप्लिकेशन में, नक्शे recenter कूदने के लिए, यहाँ, केंद्र सुचारू रूप से किया जाता है बदलते जाता है)।

+0

वाह, यह अद्भुत जवाब है ... बहुत बहुत धन्यवाद!इसे सुलझाने के दौरान देरी के लिए खेद है - मैं छुट्टी पर था ... वैसे भी ... मैंने वास्तव में थोड़ी देर के बाद इसे अपने आप बनाया और यह आपके समाधान के समान था ... केवल अंतर यह था कि जब मैंने स्क्रॉल किया तो मैंने पूरी तरह से ताज़ा किया नक्शा व्यू, जो नया दृश्य क्षेत्र सेट करता है (यदि आप बहुत ज़ूम ज़ूम करते हैं) ... मुझे मानचित्र के नए केंद्र को बस सेट करने के साथ आपका समाधान पसंद है, तो मेरे समाधान के बाद और अधिक तेज़ तरीका है इसलिए मैं अपना कोड अपडेट करूंगा ... एक बार फिर बहुत धन्यवाद! :) –

+0

क्या आप समझा सकते हैं कि आप viewDidLoad विशेष रूप से संदर्भ स्थिति में deltaLatFor1px की गणना कैसे करते हैं। मुझे कोड के साथ एक ऐप क्रैश मिलता है जिसमें कहा गया है कि अवैध भौगोलिक निर्देशांक में कोई समस्या है। धन्यवाद! – MrBr

+0

वास्तव में मैं जो कर रहा हूं वह यह है कि मैं उनके बीच 100px के साथ दो स्क्रीन पोजीशन बना देता हूं। फिर मैं उन पदों की स्थिति को मानचित्र पदों में परिवर्तित करता हूं। तब मुझे पता है कि अक्षांश 100px कितना प्रतिनिधित्व करता है। और फिर यह जानना आसान है कि कितना अक्षांश 1px (100 स्क्रीन विभाजित 2 स्क्रीन स्थितियों के बीच डेल्टा अक्षांश) द्वारा दर्शाया गया है। – yonel

2

उपरोक्त उदाहरण अच्छा है। अगर आपको और मदद की ज़रूरत है, तो मुझे लगता है कि वे RBParallaxTableViewController के समान कुछ उपयोग कर रहे हैं। https://github.com/Rheeseyb/RBParallaxTableViewController

यह अनिवार्य रूप से वही प्रभाव है जो पथ अपने हेडर फोटो के लिए उपयोग करता है।

0

योनेल का जवाब अच्छा है, लेकिन मुझे एक समस्या मिली क्योंकि मेरे पास मानचित्र के केंद्र में एक पिन है। क्योंकि नकारात्मक वाई, बिंदु मेरे UINavigationBar के तहत छिपा हुआ है।

फिर, मैंने नकारात्मक वाई सेट नहीं किया, और मैं स्क्रॉल ऑफ़सेट के अनुसार अपना mapView.frame सही करता हूं।

मेरे MapView 320 x 160

_mapView.frame = CGRectMake(0, 160, 320, -160+y); 

आशा इस कोई मदद करता है।