Добавить UIImage в CALayer

Я должен добавить UIImageView в качестве подсмотра MapView. Для этого я создал слой над MapView. В этом слое я хочу поместить свое изображение, но я получаю белый прямоугольник и ничего больше. Мое изображение не видно.

Это код:

- (void)viewDidLoad
{
    //......

    CALayer *layer = [CALayer layer];
    layer.backgroundColor = [[UIColor whiteColor] CGColor];

    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
    {
        layer.bounds = CGRectMake(self.mapView.bounds.origin.x,
                                  self.mapView.bounds.origin.y, 80, 300);
    }
    else
    {
        layer.bounds = CGRectMake(self.mapView.frame.origin.x,
                                  self.mapView.frame.origin.y, 150, 700);
    }

    layer.contents = (id)[UIImage imageNamed:@"myImage.png"];
    //the name is correct but  in the output the image is not visible

    [[self.mapView layer] addSublayer:layer];
    [layer setNeedsDisplay];
}

Ответ 1

Я удалил

 [layer setNeedsDisplay];

Я не знаю почему, но это работает!

Ответ 2

Это общий ответ для будущих зрителей. Он основан на названии вопроса, а не на деталях исходного вопроса.

Как добавить UIImage в CALayer

Вы можете добавить изображение в представление layer просто используя его свойство contents:

myView.layer.contents = UIImage(named: "star")?.cgImage
  • Обратите внимание, что UIImage необходимо преобразовать в CGImage.

Если вы хотите добавить изображение в свой собственный слой, вы можете сделать это следующим образом:

let myLayer = CALayer()
let myImage = UIImage(named: "star")?.cgImage
myLayer.frame = myView.bounds
myLayer.contents = myImage
myView.layer.addSublayer(myLayer)

Изменение внешнего вида

Вышеприведенный код создает такое же представление. Голубой цвет - это UIView, а синяя звезда - UIImage.

введите описание изображения здесь

Как вы можете видеть, он выглядит пиксельно. Это связано с тем, что UIImage меньше, чем UIView, поэтому он масштабируется, чтобы заполнить представление, которое по умолчанию не указано ничем другим.

Ниже приведены примеры свойств слоя contentsGravity. Код выглядит следующим образом:

myView.layer.contents = UIImage(named: "star")?.cgImage
myView.layer.contentsGravity = kCAGravityTop
myView.layer.isGeometryFlipped = true

В iOS вы можете установить isGeometryFlipped свойство на true, если вы делаете что-либо с верхней или нижней степенью тяжести, иначе это будет противоположно тому, что вы ожидаете. (Только гравитация переворачивается вертикально, а не рендеринг содержимого. Если у вас возникли проблемы с переворачиванием содержимого, см. этот ответ.)

Ниже приведены два примера UIView для каждого параметра contentsGravity, один вид больше, чем UIImage, а другой меньше. Таким образом, вы можете увидеть эффекты масштабирования и гравитации.

kCAGravityResize

Это значение по умолчанию.

введите описание изображения здесь

kCAGravityResizeAspect

введите описание изображения здесь

kCAGravityResizeAspectFill

введите описание изображения здесь

kCAGravityCenter

введите описание изображения здесь

kCAGravityTop

введите описание изображения здесь

kCAGravityBottom

введите описание изображения здесь

kCAGravityLeft

введите описание изображения здесь

kCAGravityRight

введите описание изображения здесь

kCAGravityTopLeft

введите здесь описание изображения

kCAGravityTopRight

введите описание изображения здесь

kCAGravityBottomLeft

введите описание изображения здесь

kCAGravityBottomRight

введите описание изображения здесь

Связанные

Ответ 3

он должен быть

layer.contents = (id)[UIImage imageNamed:@"myImage.png"].CGImage;

Вы можете поместить CGImage в слой, а не в UIImage напрямую.

Ответ 4

Вам необходимо правильно установить кадр CALayer, поскольку по умолчанию используется CGRectZero.

Ответ 5

myView.layer.contents = UIImage (named: "star" )?. cgImage