2010-05-10 10 views
6

मेरे कोड में मैं UIWebView को एक पृष्ठ लोड होने के रूप में दिखाने की कोशिश कर रहा हूं, और फिर, जब यह हो जाए, तो वेब दृश्य से छवि को कैश करने और बाद में प्रदर्शित करने के लिए कैप्चर करें (इसलिए मुझे पुनः लोड करने और प्रस्तुत करने की आवश्यकता नहीं है वेब पृष्ठ)।मैं कैसे बता सकता हूं कि UIWebView ने संदर्भ में ड्राइंग कब समाप्त कर दिया है?

मैं की तर्ज पर कुछ है:

CGContextRef context = CGBitmapContextCreate(…); 
[[webView layer] renderInContext:context]; 

CGImageRef imageRef = CGBitmapContextCreateImage(context); 
UIImage *image = [UIImage imageWithCGImage:imageRef]; 
समस्या मैं में चल रहा हूँ

कि, UIWebView की खपरैल की वजह से, पृष्ठ के कभी कभी केवल आधा समय से संदर्भ के लिए प्रदान की गई है है मैं छवि पर कब्जा करता हूं।

UIWebView के पृष्ठभूमि प्रतिपादन धागे को पहचानने या अवरोधित करने का कोई तरीका है ताकि मैं सभी प्रतिपादन समाप्त होने के बाद ही छवि प्राप्त कर सकूं?


अद्यतन: हो सकता है कि धागा दौड़ की स्थिति एक रेड हेरिंग थे (यह दस्तावेज़ से स्पष्ट नहीं है, किसी भी दर पर, चाहे UIWebView के कस्टम परत या इसकी पृष्ठभूमि धागे पर सामान्य ब्लॉकों में एक CATiledLayer) ।

यह और इसकी परत दोनों पर setNeedsDisplay पर कॉल के कई प्रकारों के बावजूद एक अमान्यता मुद्दा हो सकता है)। प्रस्तुति से पहले UIWebView की सीमाओं को बदलना ऐसा लगता है कि "पूरी चीज़ को चित्रित नहीं करना" समस्या समाप्त हो गई है।

मैं अभी भी एक समस्या में भाग गया जहां पुराने पैमाने पर कुछ टाइल्स खींचे जा रहे थे, लेकिन renderInContext: पर दो बार कॉल करना पर्याप्त रूप से कम हो गया है।

उत्तर

0

UIWebView शायद CATiledLayer या कस्टम व्युत्पन्न का उपयोग कर रहा है। आप लेयर को अपने स्वयं के चयन के साथ प्रतिस्थापित करने में सक्षम हो सकते हैं जैसे कि सरल कैलियर जो थ्रेडेड ड्राइंग नहीं करता है। सामग्री लोड करना शुरू करने से पहले परत को बदलें।

यदि मानक कैलियर के साथ परत को प्रतिस्थापित नहीं किया जाता है, तो आपको अपना स्वयं का उप-वर्ग बनाना पड़ सकता है जो बिना किसी थ्रेड किए हुए कैटिल्डलेयर के व्यवहार को अनुकरण करता है।

संपादित करें:

CATiledLayer.h से

/* Note: do not attempt to directly modify the `contents' property of 
* an CATiledLayer object - doing so will effectively turn it into a 
* regular CALayer. */ 

तो आप बस नहीं के बराबर करने के लिए सामग्री सेट करने में सक्षम हो सकता है renderInContext:

कॉल करने से पहले
संबंधित मुद्दे

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