2012-12-24 10 views
5

मेरे पास MapView के साथ व्यू कंट्रोलर है, नियंत्रक को स्टोरीबोर्ड में निर्दिष्ट एक सेग्यू द्वारा प्रारंभ किया गया है। MapView नियंत्रक में एक संपत्ति के लिए (स्टोरीबोर्ड के माध्यम से) जुड़ा हुआ है।MKMapView और viewDidLoad/viewWillAppear/viewDidAppear स्टोरीबोर्ड का उपयोग कर


ज फ़ाइल

@interface DetailViewController : UIViewController <MKMapViewDelegate> 

@property (weak, nonatomic) IBOutlet MKMapView *locationMapView; 

मैं एक विधि का उपयोग कर रहा एक प्रमुख क्षेत्र तक MapView केंद्र के लिए: viewDidLoad/viewWillAppear से

- (void)centerMapView 
{ 
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(CLLocationCoordinate2DMake(geoPoint.latitude, geoPoint.longitude), 1000, 1000); 
    [self.locationMapView setRegion:region animated:NO]; 

    NSLog(@"size height: %f",self.locationMapView.frame.size.height); 
    NSLog(@"size width: %f",self.locationMapView.frame.size.width); 
} 

इस विधि कॉलिंग पहले के लिए कुछ नहीं करता है समय, लेकिन दृश्य को लोड होने पर दूसरी बार सही तरीके से केन्द्रित करता है। लॉग उत्पादन हमेशा होता है:

size height: 0.000000 
size width: 0.000000 

जब viewDidAppear में कहा जाता MapView केंद्रित है और उत्पादन आकार सही है:

size height: 400.000000 
size width: 320.000000 

मुझे लगता है कि आकार मान का मतलब है कि दृश्य अभी तक में प्रारंभ नहीं किया गया है viewDidLoad/viewWill प्रकट होता है, यह क्षेत्र को स्थापित करने के साथ मेरी समस्या से असंबंधित हो सकता है।

मुझे आश्चर्य है, अगर मैप व्यू के क्षेत्र को viewDidLoad/viewWillAppear में सेट करना संभव नहीं है, तो उपयोगकर्ता को इस क्षेत्र में बदलाव नहीं दिख रहा है।

कोई सलाह?

+0

क्या आपने कहा था कि आपने इसे विल्लएपियर में भी देखा है? यदि नहीं, तो वहां पर आज़माएं। –

+0

मैंने कोशिश की है कि सफलता के बिना –

उत्तर

0

दृश्य आकार समस्या शायद क्षेत्र को स्थापित करने के साथ आपकी समस्या से संबंधित नहीं है।

मुख्य प्रश्न: DetailViewControllergeoPoint संपत्ति सेट कब होता है, इसके दृश्य के संबंध में जब संबंधित होता है? यदि viewDidLoad उस प्रॉपर्टी को सेट करने से पहले चलाता है (संभावित रूप से prepareForSegue:sender: से दूसरे व्यू कंट्रोलर में), geoPoint जब आप मानचित्र को केंद्र में डालने का प्रयास करेंगे तो शून्य (शून्य) होगा, इसलिए यह सही तरीके से केंद्र नहीं करेगा। (और यह दूसरी बार काम करता है क्योंकि DetailViewController का उदाहरण पहले से मौजूद है और पिछले समय से अपने geoPoint है।)

आप अपने geoPoint संपत्ति के लिए एक कस्टम सेटर से अपने centerMapView विधि बुला विचार कर सकते हैं - इस तरह से आप कर रहे हैं गारंटी है कि दृश्य नियंत्रक के पास उचित डेटा होने के बाद ऐसा होगा, जो अब भी दिखाई देने से पहले होगा, इसलिए दृश्य मानचित्र संक्रमण दिखाई नहीं देगा।

+0

आप सही हैं, 'geoPoint'' readyForSegue: प्रेषक: 'किसी अन्य नियंत्रक से सेट है। हालांकि, कस्टम प्रारंभकर्ता से 'geoPoint' तक 'centerMapView' को कॉल करने से मदद नहीं मिली। मैं अपने 'centerMapView' में 'geoPoint' के अक्षांश और देशांतर को लॉग करता हूं और यह हमेशा' viewDidLoad' से बुलाए जाने पर भी सही मान पर सेट होता है। –