2011-06-04 10 views
8

मुझे कैलियर छाया के साथ कोई समस्या है। यहां बताया गया है कि मैं अपना विचार कैसे बना रहा हूं:परत में छाया जोड़ने से अव्यवस्थित रेटिना उपस्थिति

UIImage *screenshot = [SomeClass getScreenshot:mainView.view]; //full screen snap 
CGFloat scale = [SomeClass getScreenScale]; // 1 or 2 for retina 
CGFloat width = mainView.view.frame.size.width; 
CGRect r1 = CGRectMake(0, 0, width*scale, 300*scale);  
CGRect u1 = CGRectMake(0, 0, width, 300); 
CGImageRef ref1 = CGImageCreateWithImageInRect([screenshot CGImage], r1); 
l1 = [[UIButton alloc] initWithFrame:u1]; 
UIImage *img1 = [UIImage imageWithCGImage:ref1]; 
[l1 setBackgroundImage:img1 forState:UIControlStateNormal]; 
[l1 setAdjustsImageWhenHighlighted:NO]; 
CGImageRelease(ref1); 
[mainView.view addSubview:l1]; 

ठीक है, तो यह ठीक काम करता है। जोड़ा गया छवि रेटिना संकल्प है। हालांकि, जैसे ही मैं परत पर एक छाया जोड़ता हूं, यह मानक रिज़ॉल्यूशन पर कूद जाता है, जिससे बटन अस्पष्ट दिखाई देता है।

l1.layer.shadowOffset = CGSizeMake(0, 0); 
l1.layer.shadowRadius = 20; 
l1.layer.shadowColor = [UIColor blackColor].CGColor; 
l1.layer.shadowOpacity = 0.8f; 
l1.layer.shouldRasterize = YES; 

क्या कोई कारण है कि छाया जोड़ने से यह समस्या होगी?

उत्तर

20

मैं वास्तव में नहीं बता सकता, ऐसा क्यों होता है, लेकिन मुझे लगता है कि यह UIImage निर्माण के कारण होता है। आपने एक बड़ा (रेटिना आकार 600 * 600 पिक्सेल) CGImageRef और उस से UIImage बनाया है। लेकिन यूआईएममेज को पता नहीं है कि यह रेटिना छवि है (अब इसमें 600 * 600 अंक हैं, इसमें 300 * 300 अंक स्केल फैक्टर 2 के साथ होना चाहिए जो परिणामस्वरूप 600 * 600 पिक्सल होगा)।

imageWithCGImage:scale:orientation: का उपयोग करके अपना UIImage बनाने का प्रयास करें। इससे UIImage रेटिना-स्केल के बारे में जागरूक हो जाएगा और परत संचालन ठीक से काम कर सकता है।

तो अपने लाइन होगा:

UIImage *img1 = [UIImage imageWithCGImage:ref1 
    scale: scale 
    orientation: UIImageOrientationUp]; 

संपादित (नीचे मेरी टिप्पणी देखें): इस मुद्दे को l1.layer.shouldRasterize = YES के कारण होता है। आपको l1.layer.rasterizationScale = scale को भी निर्दिष्ट करने की आवश्यकता है और छवि अपेक्षित के रूप में प्रस्तुत की जाती है।

+0

आपके सुझाव के लिए धन्यवाद, लेकिन यह काम नहीं करता प्रतीत होता है। अभी भी मानक संकल्प में बदल जाता है। :/ –

+12

मैंने इसे अपने आप से बाहर करने की कोशिश की। खराब प्रतिपादन का कारण l1.layer.shouldRasterize = हाँ है; आपको l1.layer.rasterizationScale = स्केल भी सेट करने की आवश्यकता है। – marcus

+0

वह समस्या थी। मदद के लिए धन्यवाद! –

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