6

パースペクティブを使用してプロパティCGTransform3Dを指定するCALayerがありm14ます。パースペクティブを適用すると、レイヤーのエッジがギザギザになります。レイヤーの周りに1pxの透明な境界線を追加すると、これに役立つと人々が言うのを聞いたことがあります。どうすればいいのかわかりません。borderCALayerのプロパティとプロパティを使用してみましborderWidthたが、ギザギザのエッジがまだ残っています。また、すべての面で1pxで描画される四角形を縮小しようとしましたが、どちらも役に立ちません。

どんな助けでも素晴らしいでしょう!ありがとう!

4

5 に答える 5

11

この問題に対して私が見つけた最善の解決策は、shouldRasterizeをYESに設定し、ラスタライズスケールをデバイスの画面のスケールに設定することでした。

myLayer.shouldRasterize = YES;
myLayer.rasterizationScale = UIScreen.mainScreen().scale // iOS
myLayer.rasterizationScale = NSScreen.mainScreen()!.backingScaleFactor // OSX

これにより、エッジが滑らかになります。

于 2011-08-23T04:53:56.643 に答える
3

「人々が言及するのを聞いた」とは、あなたがこの質問についての議論を意味していると思います。コードを使用して、コアコンテンツの外側に1ピクセルの透明な境界線ができるように、実際にCALayerにコンテンツを描画することが提案されました。

CGContextSetAllowsAntialiasing(theContext, true);
CGContextSetShouldAntialias(theContext, true);

そのレイヤーのQuartz図面内。

CALayerにもedgeAntialiasingMaskプロパティがありますが、次のようなコードを使用しても影響は見られません。

layer.edgeAntialiasingMask = kCALayerLeftEdge | kCALayerRightEdge | kCALayerBottomEdge | kCALayerTopEdge;

変換されたレイヤーエッジのアンチエイリアシングについて。これについての説明、および画像の周囲に1ピクセルの透明な境界線を使用して問題をどのように解決したかについては、この質問も参照してください。

于 2010-04-23T22:02:34.633 に答える
1

CALayerに、各エッジから0.5ピクセルの位置に挿入されたマスクを指定します。

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;
于 2012-01-03T05:30:28.680 に答える
0

1ピクセルの境界線は、レイヤーのコンテンツ(!)のエッジを滑らかにします。

- (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一方、設定はコンテンツと境界線の両方に影響します。

于 2012-07-27T12:18:42.383 に答える
0

Swift 3.0の場合:

context.setAllowsAntialiasing(true)
context.setShouldAntialias(true)
于 2016-11-11T23:09:59.017 に答える