Подтвердить что ты не робот

Отображение изображения или UIImage с простым CALayer

Я часто читал, что использование CALayer, а не UIImageView - это повышение производительности, когда дело доходит до интенсивного использования изображений. Это имеет смысл, потому что UIImageView вызывает 3 копии изображения в памяти, которые необходимы для Core Animation. Но в моем случае я не использую Core Animation.

Как назначить UIImage (или его данные изображения) на CALayer, а затем отобразить его?

4b9b3361

Ответ 1

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-образ в файле ресурсов Playground. Я использую пример "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 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 👁 eye icon
}

Изображение как содержимое CALayer, встроенного в UIView

Ответ 2

Для версии ARC требуется другое исполнение:

self.myView.layer.contents = (__bridge id) self.myImage.CGImage;

Ответ 3

CALayer *layer = [[CALayer alloc] init];
layer.contents = (__bridge id _Nullable)([UIImage imageNamed:@"REWIFISocketOff"].CGImage);