2014-06-23 4 views
5

मैं एक UIView एनीमेशन के साथ मेरी MapView के फ्रेम एनिमेट हूँ एनिमेट जबकि:अक्षम MapView में व्याख्या जोड़ना इसके फ्रेम

 [UIView animateWithDuration:0.25f animations:^{ 
      self.mapView.frame = frame; 
     } completion:nil]; 
} 

ऊपर मुझे लगता है कि MapView एनीमेशन जब तक गलत एनोटेशन जोड़ने के साथ MapView का विस्तार करते हुए खत्म हो गया। जब एनीमेशन समाप्त हो जाता है तो गलत जगहें गायब हो जाती हैं।

कॉल इस प्रकार हैं जब मैं मानचित्र को विस्तृत:

  1. animateWithDuration शुरू
  2. MapView: regionWillChangeAnimated
  3. MapView: didAddAnnotationViews
  4. MapView: regionDidChangeAnimated
  5. animateWithDuration पूरा

कोई समस्या नहीं है जब मैं मानचित्र को कम से कम कर सकता हूं क्योंकि नक्शा दृश्य: didAddAnnotationViews को नहीं कहा जाता है।

क्या मैं किसी भी तरह एनिमेटिंग करते समय मानचित्रदृश्य क्षेत्र WillChange अक्षम कर सकता हूं?

एनीमेशन पहले

:

एनीमेशन में

before

आधे रास्ते। बहुत से मिस्डस्पेड एनोटेशन देख रहे हैं।

middle

एनीमेशन किया जाता है। सभी मिस्डस्ड एनोटेशन चला गया है।

after

+0

आप जोड़ रहे हैं/regionWill/DidChangeAnimated प्रतिनिधि तरीकों में एनोटेशन को हटाने? यदि ऐसा है, तो एनीमेशन शुरू करने से पहले और प्रतिनिधि विधियों में एक बूलियन ध्वज सेट करने का प्रयास करें, अगर ध्वज हाँ है तो कुछ भी न करें।एनीमेशन पूरा होने पर ध्वज को NO पर सेट करें। – Anna

+0

नहीं, एक छीन वाली परियोजना के साथ परीक्षण किया गया जहां मैं केवल एक बार देखने के लिए एनोटेशन जोड़ रहा हूं और फिर मानचित्र को ऊपर और नीचे एनिमेट कर रहा हूं। इसलिए मैं ऐसा होने के लिए नक्शा देखने के लिए किसी भी प्रतिनिधि विधि का उपयोग नहीं करता हूं। – Toydor

+1

एनिमेट करते समय एनोटेशन छुपाए जाने के बारे में कैसे? और फिर एनोटेशन दिखाओ? – iphonic

उत्तर

2

एक अस्थायी समाधान मैं आपको निम्न कार्य करने का सुझाव दे सकता है: बदल रहा है यह फ्रेम
2. है अपने माता पिता को देखने के लिए subview के रूप कि imageView जोड़े से पहले
1. अपने MapView के स्क्रीनशॉट के साथ एक UIImageView बनाओ और अपना नक्शा छुपाएं देखें।
3. दोनों को एनिमेट करें: imageView और mapView इसके फ्रेम को बदलने के साथ देखें।
4. एनीमेशन के समापन ब्लॉक में अपने मानचित्र को खोलें देखें और देखें छवि देखें।

कुछ इस तरह: आप जब तक यह अस्थायी समाधान

- (UIImage *)imageFromView:(UIView *) view 
{ 
    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { 
     UIGraphicsBeginImageContextWithOptions(view.frame.size, NO, [[UIScreen mainScreen] scale]); 
    } else { 
     UIGraphicsBeginImageContext(view.frame.size); 
    } 
    [view.layer renderInContext: UIGraphicsGetCurrentContext()]; 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return image; 
} 

- (void)foo 
{ 
    UIImageView *mapScreenShotView = [[UIImageView alloc] initWithImage:[self imageFromView:self.mapView]]; 
    mapScreenShotView.frame = self.mapView.frame; 
    [self.mapView.superview addSubview:mapScreenShotView]; 
    self.mapView.hidden = YES; 

    CGRect frame = self.mapView.frame; 
    frame.origin = ... 
    frame.size = ... 
    // here no more need to animate mapView, because currently its hidden. So we will change it's frame in outside of animation block. 
    self.mapView.frame = frame; 
    [UIView animateWithDuration:0.25f animations:^{ 
     mapScreenShotView.frame = frame; 
    } completion:^{ 
     self.mapView.hidden = NO; 
     [mapScreenShotView removeFromSuperview]; 
    }]; 
} 

उपयोग कि समस्या को हल करने के लिए एक सही तरीके से पाते हैं।

1

मैंने एक और अस्थायी समाधान की कोशिश की और ऐसा लगता है कि यह बहुत अच्छी तरह से काम करता है। यह एनीमेशन के दौरान मैप व्यू जोड़ रहा है कि सभी एनोटेशन छुपा रहा है।

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation { 

    ... 

    if (self.isAnimating) { 
     [annotationView hideForDurationOfSeconds:0.25f]; 
    } 

    ... 

} 

annotationView में:

- (void)hideForDurationOfSeconds:(NSTimeInterval)duration { 
    self.hidden = YES; 
    [self performSelector:@selector(setHidden:) withObject:NO afterDelay:duration]; 
} 
संबंधित मुद्दे