यहां एक संभावित कार्यवाही है जो मेरी समस्या का समाधान करती है।
UIView drawViewHierarchyInRect को कॉल करने के लिए CATransaction.completionBlock का उपयोग करें: स्क्रीन अपडेट के साथ स्क्रीन अपडेट अपडेट करें। मैंने इसे एक ही समस्या को हल करने के लिए इस्तेमाल किया। यह मेरे मामले में ध्वज को YES में सेट करने के बराबर है, क्योंकि मैं केवल को के बाद आविष्कार कर रहा हूं, वर्तमान कैट्रानक्शन समाप्त हो गया है और स्क्रीन वांछित स्थिति में है। उस ने कहा, मेरे मामले में, मेरे पास कोई एनिमेशन नहीं है, इसलिए यह बहुत तेज़ है और मैं जो चाहता हूं उसे कैप्चर करता हूं। अगर एनिमेशन थे, तो यह उचित नहीं हो सकता है।
मेरे मामले में, मेरे पास एक संग्रह दृश्य है जो फ़ाइलों का संग्रह है। प्रत्येक आइटम को उपयोगकर्ता द्वारा खोलने के बाद फ़ाइल की तरह दिखने के स्नैपशॉट के रूप में प्रस्तुत किया जाता है। कुछ फाइलें यूआई को सैकड़ों परतें बनाती हैं। जब इन जटिल विचारों को स्नैपशॉट किया जा रहा था, तो मुझे एक ब्लैक स्क्रीन फ्लैश मिलेगा; या आंशिक रूप से पुन: चालू करने के लिए अंतिम/वर्तमान एनीमेशन। मेरा संग्रह दृश्य एक नेविगेशन नियंत्रक में w/w है, मैं पॉप एनीमेशन के आंशिक reruns देख रहा था। मैंने घूर्णन एनिमेशन के पुनर्मिलन को भी देखा है। सरल फ़ाइलों के लिए, अक्सर कोई समस्या नहीं थी। मैंने इसे अपने आईपैड एयर (आईओएस 8.1) और विभिन्न सिमुलेटर पर देखा। मैंने ऐप आइकन और लॉन्च इमेज डालने की कोशिश की लेकिन उनका कोई प्रभाव नहीं पड़ा।
यहां मूल कोड था। यह एक व्यू कंट्रोलर शुरू करता है, फिर नियंत्रक के दृश्य को उपयोगिता दृश्य में जोड़ता है।
UIViewController *vlController = [[ComplicatedViewController alloc]init];
UIView *innerView = vlController.view;
[v addSubview:innerView];
innerView.transform = CGAffineTransformMakeScale(scalar, scalar);
innerView.center = CGRectCenterPoint(v.bounds);
auto sz = v.bounds.size;
innerView.bounds = {{0,0}, {sz.width/scalar, sz.height/scalar}};
UIGraphicsBeginImageContextWithOptions(v.bounds.size, YES, 0);
[v drawViewHierarchyInRect:v.bounds afterScreenUpdates:YES];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[innerView removeFromSuperview];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
[v addSubview:imageView];
नया कोड केवल यूआईवीव एनिमेट के समापन ब्लॉक के लिए नीचे आधा स्थानांतरित करता है अवधि: समापन। ध्यान दें कि UIView एनीमेशन की अवधि 0 है, लेकिन यह अभी भी नए UI के साथ स्क्रीन को अपडेट करने के लिए अतिरिक्त रीफ्रेश चक्र देना प्रतीत होता है।
UIViewController *vlController = [[ComplicatedViewController alloc]init];
UIView *innerView = vlController.view;
[UIView animateWithDuration:0.0 animations:^{
[v addSubview:innerView];
innerView.transform = CGAffineTransformMakeScale(scalar, scalar);
innerView.center = CGRectCenterPoint(v.bounds);
auto sz = v.bounds.size;
innerView.bounds = {{0,0}, {sz.width/scalar, sz.height/scalar}};
} completion:^(BOOL finished) {
UIGraphicsBeginImageContextWithOptions(v.bounds.size, YES, 0);
BOOL drawResult = [v drawViewHierarchyInRect:v.bounds afterScreenUpdates:NO];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[innerView removeFromSuperview];
[self add:image forFile:v.filename withOrientation:v.orientation];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
[v addSubview:imageView];
}];
पुhew, मैंने सोचा कि मैं पागल हो रहा था। मुझे एक ही समस्या दिखाई दे रही है, लेकिन मैंने पाया कि यह केवल आईफोन 6 (डिवाइस और सिम्युलेटर) पर होता है और खासकर आईओएस 8 के साथ नहीं होता है। ऐसा लगता है कि स्नैपशॉट कोड के किसी भी प्रकार के साथ ऐसा होता है जिसमें स्क्रीन अपडेट के बाद शामिल है: हाँ। – Danny
मैं पुष्टि कर सकता हूं कि समस्या आईफोन 5 एस पर नहीं होती है। – iamjustaprogrammer
मेरे लिए यह एक "फ़्लैश" नहीं है, बल्कि एक बहुत तेज़ ज़ूम है। बहुत कष्टप्रद। – afrederick