2011-06-05 21 views
14

Khi tôi đặt thuộc tính biến đổi của CALayer của tôi với CATransform3DRotate, lớp được xoay đúng cách. Tuy nhiên, các cạnh của lớp bị lởm chởm và không chống răng cưa. Tôi đã đọc một vài bài viết về đề tài này:Chống răng cưa đường chéo cạnh của CALayer

iPhone: CALayer + rotate in 3D + antialias?

iPhone - Jagged Edges when applying perspective to CALayer

tôi đã cố gắng để kết hợp lời khuyên của họ bằng cách thiết lập các thuộc tính sau vào lớp đường chéo của tôi

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; 

tôi cũng đã ghi đè phương thức drawLayer: inContext: của lớp chéo của tôi để đảm bảo chống răng cưa:

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

Tôi đang thiếu gì?

Trả lời

14

Tôi vừa đăng một bài đăng về hình ảnh này. Có lẽ nó sẽ giúp.

Tôi tìm thấy một vài thủ thuật giúp đỡ và thiết lập một biên giới đã không làm những gì tôi nghĩ nó sẽ. Những gì bạn có thể làm là thiết lập một vài cài đặt để trợ giúp với nội suy, rasterizing và rasterisationScale.

Xem nếu một cái gì đó từ mã này giúp:

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; 

Tôi đã một số ví dụ posted here

+0

Tuyệt vời! Bài đăng tuyệt vời. – tassock

+5

Có một giải pháp thay thế ồ ạt tốt hơn vào phiên bản 7.0 trở lên. http://stackoverflow.com/questions/6245276/anti-alias-diagonal-edges-of-calayer/19443644#19443644 – cbowns

29

Tính đến iOS7, đây là bây giờ cuối cùng đã có thể trên một cơ sở cho mỗi lớp và không có bất kỳ hacks xấu xí như pixel trong suốt hoặc cách giải quyết như rasterization:

layer.allowsEdgeAntialiasing = YES;

Điều thú vị là, đây không phải trang trải được chỉnh sửa bởi tài liệu chính thức của CALayer, nhưng chắc chắn là một API công khai. Xem số iOS7 API diffs và bài viết tuyệt vời của Peter Steinberger trên Hidden Gems and Workarounds in iOS7.

+0

Đây là API CA yêu thích mới của tôi. – cbowns

+0

Điều này không thể thực hiện trên OSX: ( 'allowEdgeAntialiasing' không khả dụng. Bạn sẽ làm điều này trong OSX như thế nào? –