web-dev-qa-db-ja.com

プレーンなCALayerを使用して画像またはUIImageを表示する

CALayerではなくUIImageViewを使用すると、画像の使用量が多い場合にパフォーマンスが向上することをよく読んでいます。 UIImageViewはメモリ内に画像の3つのコピーを生成するため、これは理にかなっています。これはCoreAnimationに必要です。しかし、私の場合、CoreAnimationは使用していません。

UIImage(またはその画像データ)をCALayerに割り当てて、それを表示するにはどうすればよいですか?

25
HelloMoon
UIImage*    backgroundImage = [UIImage imageNamed:kBackName];
CALayer*    aLayer = [CALayer layer];
CGFloat nativeWidth = CGImageGetWidth(backgroundImage.CGImage);
CGFloat nativeHeight = CGImageGetHeight(backgroundImage.CGImage);
CGRect      startFrame = CGRectMake(0.0, 0.0, nativeWidth, nativeHeight);
aLayer.contents = (id)backgroundImage.CGImage;
aLayer.frame = startFrame;

またはSwiftプレイグラウンド(プレイグラウンドのリソースファイルに独自のPNG画像を提供する必要があります。「FrogAvatar」の例を使用しています。)

  //: Playground - noun: a place where people can play
import UIKit

if let backgroundImage = UIImage(named: "FrogAvatar") // you will have to provide your own image in your playground's Resource file
{
    let height = backgroundImage.size.height
    let width = backgroundImage.size.width

    let aLayer = CALayer()
    let startFrame = CGRect(x: 0, y: 0, width: width, height: height)

    let aView = UIView(frame: startFrame)
    aLayer.frame = startFrame
    aLayer.contentsScale = aView.contentScaleFactor
    aLayer.contents = backgroundImage.cgImage
    aView.layer.addSublayer(aLayer)
    aView // look at this via the Playground's ???? eye icon
}

An image as the content of a CALayer embedded in a UIView

54
Glenn Howes

ARCバージョンには別のキャストが必要です。

self.myView.layer.contents = (__bridge id) self.myImage.CGImage;
12
nevan king
CALayer *layer = [[CALayer alloc] init];
layer.contents = (__bridge id _Nullable)([UIImage imageNamed:@"REWIFISocketOff"].CGImage);
1
Denis Kutlubaev