2014-09-20 3 views
12

iOS 8 UIView केDrawViewHierarchyInRect पर कॉल करते समय फ़्लैश को कैसे रोकें: AftercreenUpdates: आईओएस 8 पर?

छवि का एक 1 फ्रेम फ्लैश में
[self drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES]; 

परिणाम के लिए एक कॉल के तहत। आप इसे स्क्रीन पर एक अलग दूसरे के लिए देख सकते हैं। यह तब होता है जब स्क्रीनशॉट पैरामीटर के बाद हाँ है।

यह मेरा पूरा कोड स्क्रीनशॉट लेने के लिए किया जाता है:

UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, sf); 
CGContextRef ctx = UIGraphicsGetCurrentContext(); 
CGContextSaveGState(ctx); 
CGContextConcatCTM(ctx, [self.layer affineTransform]); 

if ([self respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)]) { // iOS 7+ 
    [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES]; 
} else { // iOS 6 
    [self.layer renderInContext:ctx]; 
} 

UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 

CGContextRestoreGState(ctx); 
UIGraphicsEndImageContext(); 

वहाँ एक समाधान है?

+2

पुhew, मैंने सोचा कि मैं पागल हो रहा था। मुझे एक ही समस्या दिखाई दे रही है, लेकिन मैंने पाया कि यह केवल आईफोन 6 (डिवाइस और सिम्युलेटर) पर होता है और खासकर आईओएस 8 के साथ नहीं होता है। ऐसा लगता है कि स्नैपशॉट कोड के किसी भी प्रकार के साथ ऐसा होता है जिसमें स्क्रीन अपडेट के बाद शामिल है: हाँ। – Danny

+0

मैं पुष्टि कर सकता हूं कि समस्या आईफोन 5 एस पर नहीं होती है। – iamjustaprogrammer

+0

मेरे लिए यह एक "फ़्लैश" नहीं है, बल्कि एक बहुत तेज़ ज़ूम है। बहुत कष्टप्रद। – afrederick

उत्तर

6

आईफोन 6 और आईफोन 6 प्लस में उपयोग करने के लिए @ 3x लॉन्च छवियां प्रदान करें और यह समस्या दूर हो गई है।

+1

वाह - यह काम नहीं कर सकता, लेकिन ऐसा करता है। –

+1

पुष्टि की। प्रतिभाशाली! – shmim

+0

मेरे लिए काम नहीं किया – Rizon

2

यहां एक संभावित कार्यवाही है जो मेरी समस्या का समाधान करती है।

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]; 
}]; 
+0

पर भी मेरे लिए काम नहीं किया है यह समाधान अच्छा दिखता है, लेकिन मुझे अपने कार्य में पूर्णता ब्लॉक से UIImage वापस करने की आवश्यकता है। यह मेरे लिए असंभव लगता है ... – RemembranceNN

संबंधित मुद्दे