我有CALayer,我將視角應用於使用CGTransform3D
並指定m14
屬性。當應用透視圖時,圖層邊緣呈鋸齒狀。我聽說有人提到在圖層周圍添加1px透明邊框可以幫助實現這一點。我不知道該怎麼做。我曾嘗試使用CALayer的border
和borderWidth
屬性,但鋸齒狀的邊緣仍然存在。我也試圖減少在所有方面以1px繪製的矩形,但它也沒有幫助。iPhone - 將視角應用於CALayer時的鋸齒邊緣
任何幫助將是偉大的!謝謝!
我有CALayer,我將視角應用於使用CGTransform3D
並指定m14
屬性。當應用透視圖時,圖層邊緣呈鋸齒狀。我聽說有人提到在圖層周圍添加1px透明邊框可以幫助實現這一點。我不知道該怎麼做。我曾嘗試使用CALayer的border
和borderWidth
屬性,但鋸齒狀的邊緣仍然存在。我也試圖減少在所有方面以1px繪製的矩形,但它也沒有幫助。iPhone - 將視角應用於CALayer時的鋸齒邊緣
任何幫助將是偉大的!謝謝!
通過「我聽說過人們提到,」我假設你的意思是this question的討論。有什麼建議有實際繪製的內容在你的CALayer,使其具有的核心內容之外的一個像素的透明邊框,使用該層的石英繪圖中的代碼
CGContextSetAllowsAntialiasing(theContext, true);
CGContextSetShouldAntialias(theContext, true);
。
還有上的CALayer的edgeAntialiasingMask
屬性,但我一直在使用如下代碼時看到任何影響:
layer.edgeAntialiasingMask = kCALayerLeftEdge | kCALayerRightEdge | kCALayerBottomEdge | kCALayerTopEdge;
上變換層邊緣抗鋸齒。關於這一點的討論,請參閱this question,以及他們如何在圖像周圍使用一個像素透明邊框來解決問題。
我發現這個問題的最佳解決方案是將shouldRasterize設置爲YES,並將光柵化比例設置爲設備屏幕的比例。
myLayer.shouldRasterize = YES;
myLayer.rasterizationScale = UIScreen.mainScreen().scale // iOS
myLayer.rasterizationScale = NSScreen.mainScreen()!.backingScaleFactor // OSX
這將反過來平滑邊緣爲您服務。
給您的CALayer面具這是嵌入每個邊緣0.5 PX:
UIView *aliasedView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, width, height)];
CALayer *maskLayer = [[CALayer alloc] init];
maskLayer.frame = CGRectMake(0.5, 0.5, width-1, height-1);
maskLayer.backgroundColor = [UIColor whiteColor].CGColor;
aliasedView.layer.mask = maskLayer;
一個像素的邊框平滑的內容的邊緣層(!):
- (UIImage *)drawAntiAliased:(UIImage *)image
{
const int B = 1; // Border width (anti-aliasing)
// Size of the output image
CGSize newImageSize = CGSizeMake(image.size.width + 2 * B, image.size.height + 2 * B);
UIGraphicsBeginImageContextWithOptions(newImageSize, NO, 0);
// Draw image with edge anti-aliasing
[image drawInRect:(CGRect){B, B, image.size}];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
如果您想要使用圖層的邊框屬性,這不再起作用,因爲邊框不是圖層內容的一部分,並且不受平滑的影響。
另一方面,設置shouldRasterize
同時影響內容和邊框。
在雨燕3.0:
context.setAllowsAntialiasing(true)
context.setShouldAntialias(true)
這似乎不再是iOS中5.1工作 – wdlindmeier 2012-03-13 05:18:36