Ответ 1
Я удалил
[layer setNeedsDisplay];
Я не знаю почему, но это работает!
Я должен добавить 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];
}
Я удалил
[layer setNeedsDisplay];
Я не знаю почему, но это работает!
Это общий ответ для будущих зрителей. Он основан на названии вопроса, а не на деталях исходного вопроса.
Вы можете добавить изображение в представление 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
он должен быть
layer.contents = (id)[UIImage imageNamed:@"myImage.png"].CGImage;
Вы можете поместить CGImage в слой, а не в UIImage напрямую.
Вам необходимо правильно установить кадр CALayer, поскольку по умолчанию используется CGRectZero.
myView.layer.contents = UIImage (named: "star" )?. cgImage