2011-06-05 10 views
14

के एंटी-एलियास विकर्ण किनारों जब मैं अपने कैलियर की एक CATransform3DRotate के साथ ट्रांसफॉर्म प्रॉपर्टी सेट करता हूं, तो परत ठीक से घूमती है। हालांकि, परत के किनारों को झुका हुआ है और एंटी-एलाइज्ड नहीं है।कैलियर

iPhone: CALayer + rotate in 3D + antialias?

iPhone - Jagged Edges when applying perspective to CALayer

मैं अपने विकर्ण परत

CALayer* layer = myView.layer; 
layer.shadowOpacity = 0.01; 
layer.edgeAntialiasingMask = kCALayerTopEdge | kCALayerBottomEdge | kCALayerRightEdge | kCALayerLeftEdge; 
layer.borderWidth = 1.0; 
layer.borderColor = [UIColor clearColor].CGColor; 
layer.backgroundColor = [UIColor greenColor].CGColor; 

मैं पर निम्नलिखित गुण निर्धारित करके उनकी सलाह को शामिल करने की कोशिश की है: मैं इस विषय पर कुछ पदों पढ़ा है ड्रॉलेयर पर भी ओवरराइड किया गया है: इन कॉन्टेक्स्ट: एंटी-एलाइजिंग सुनिश्चित करने के लिए मेरी विकर्ण परत की विधि:

-(void)drawLayer:(CALayer*)layer inContext:(CGContextRef)context 
{ 
    CGContextSetAllowsAntialiasing(context, true); 
    CGContextSetShouldAntialias(context, true); 
    CGContextSetFillColorWithColor(context, [UIColor greenColor].CGColor); 
    CGContextFillRect(context, self.bounds); 
} 

मुझे क्या याद आ रही है?

उत्तर

14

मैंने अभी छवियों के लिए इस पर एक पोस्ट किया है। शायद यह मदद करेगा।

मुझे कुछ चालें मिलीं जो केवल एक सीमा की मदद करने और स्थापित करने के लिए नहीं करतीं जो मैंने सोचा था। आप क्या कर सकते हैं इंटरपोलेशन, रास्टरराइजिंग और रास्टरराइशन स्केल के साथ मदद करने के लिए कुछ सेटिंग्स सेट करें।

देखने के लिए कि इस कोड से कुछ मदद करता है:

UIImage * img =[UIImage imageWithData:[NSData dataWithContentsOfFile:[[[NSBundle mainBundle ] resourcePath ] stringByAppendingPathComponent:@"AliasImage.png" ] ] ]; 
CGRect imageRect = CGRectMake(0 , 0 , img.size.width + 4 , img.size.height + 4); 
UIGraphicsBeginImageContext(imageRect.size); 
[img drawInRect:CGRectMake(imageRect.origin.x + 2 , imageRect.origin.y + 2 , imageRect.size.width - 4 , imageRect.size.height - 4) ]; 
CGContextSetInterpolationQuality(UIGraphicsGetCurrentContext() , kCGInterpolationHigh); 
img = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
[aliasImage setImage:img ]; 

aliasImage.transform = CGAffineTransformScale(aliasImage.transform , 0.45 , 0.45); 
aliasImage.layer.shouldRasterize = YES; 
aliasImage.layer.rasterizationScale = 0.45; 
aliasImage.layer.edgeAntialiasingMask = kCALayerLeftEdge | kCALayerRightEdge | kCALayerBottomEdge | kCALayerTopEdge; 
aliasImage.clipsToBounds = NO; 
aliasImage.layer.masksToBounds = NO; 

मैं कुछ उदाहरण पोस्ट किया है here

+0

बहुत बढ़िया! महान पद। – tassock

+5

7.0 और बाद में एक बड़े पैमाने पर बेहतर विकल्प है। http://stackoverflow.com/questions/6245276/anti-alias-diagonal-edges-of-calayer/19443644#19443644 – cbowns

29

iOS7 के रूप में, यह अब प्रति-परत आधार पर और जैसे किसी भी बदसूरत हैक्स के बिना अंत में संभव है पारदर्शी पिक्सेल या समाधान रैस्टराइज़ेशन की तरह:

layer.allowsEdgeAntialiasing = YES;

दिलचस्प है, इस को कवर नहीं किया जाता है आधिकारिक कैलियर दस्तावेज द्वारा संपादित, लेकिन निश्चित रूप से एक सार्वजनिक एपीआई है। iOS7 API diffs और पीटर स्टीनबर्गर के Hidden Gems and Workarounds in iOS7 पर महान लेखन-अप देखें।

+0

यह मेरा नया पसंदीदा सीए एपीआई है। – cbowns

+0

ओएसएक्स पर यह संभव नहीं है :( 'अनुमतिएडएन्टएन्टियालाइजिंग' उपलब्ध नहीं है। आप ओएसएक्स में यह कैसे करेंगे? –

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