2012-11-07 15 views
26

Muszę dodać UIImageView jako wyeksponowanie MapView. Aby to zrobić, stworzyłem warstwę powyżej MapView. W tej warstwie chcę umieścić mój obraz, ale dostaję biały prostokąt i nic więcej. Mój obraz nie jest widoczny.dodać UIImage w CALayer

Jest to kod:

- (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]; 
} 

Odpowiedz

6

usunąłem

[layer setNeedsDisplay]; 

nie wiem dlaczego, ale to działa!

+2

Domyślam się, że setNeedsDisplay spowodował, że warstwa przerysowywała zawartość i usuwała obraz. – Bastian

+0

To też mnie zadziałało. dzięki Adriana. –

41

musi być

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

Możesz umieścić CGImage tylko w warstwie, a nie bezpośrednio UIImage.

3

Musisz poprawnie ustawić ramkę CALayer, ponieważ domyślną wartością jest CGRectZero.

77

To jest ogólna odpowiedź dla przyszłych widzów. Opiera się na tytule pytania, a nie na szczegółach pierwotnego pytania.

Jak dodać UIImage w CALayer

Można dodać zdjęcie do widokiem na layer po prostu za pomocą swojego contents właściwość:

myView.layer.contents = UIImage(named: "star")?.cgImage 
  • Uwaga że UIImage musi zostać przekształcony a CGImage.

Jeśli chcesz dodać zdjęcie na osobnej warstwie, można zrobić to tak:

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

Modyfikacja wyglądu

Powyższy kod tworzy widok takiego. Jasnoniebieski to UIView, a ciemnoniebieska gwiazda to UIImage.

enter image description here

Jak widać, choć wygląda na piksele. Dzieje się tak, ponieważ UIImage jest mniejszy niż UIView, więc jest skalowany, aby wypełnić widok, co jest domyślnym, że nie określasz niczego innego.

Poniższe przykłady pokazują odmiany właściwości warstwy contentsGravity. Kod wygląda następująco:

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

w iOS, możesz ustawić isGeometryFlipped property do true jeśli robisz coś z górnej lub dolnej grawitacji, w przeciwnym razie będzie to przeciwieństwo tego, co można się spodziewać. (Jedynie grawitacja jest odwrócony w pionie, a nie renderowanie treści. Jeśli masz problemy z zawartością są odwrócone, zobacz this answer.)

Istnieją dwa UIView Poniższe przykłady dla każdego ustawienia contentsGravity, jeden widok jest większy niż UIImage a drugi jest mniejszy.W ten sposób możesz zobaczyć efekty skalowania i grawitacji.

kCAGravityResize

Jest to ustawienie domyślne.

enter image description here

kCAGravityResizeAspect

enter image description here

kCAGravityResizeAspectFill

enter image description here

kCAGravityCenter

enter image description here

kCAGravityTop

enter image description here

kCAGravityBottom

enter image description here

kCAGravityLeft

enter image description here

kCAGravityRight

enter image description here

kCAGravityTopLeft

enter image description here

kCAGravityTopRight

enter image description here

kCAGravityBottomLeft

enter image description here

kCAGravityBottomRight

enter image description here

pokrewne

+0

Świetna odpowiedź. Ale jak zrobić kCAGravityResizeAspectFill i kCAGravityTop w tym samym czasie? – tcurdt

+1

regulacja zawartości. Odpowiednia proporcja rozwiązuje problem. Inną opcją jest użycie UIImageView jako UIView maskView. – tcurdt

0

myView.layer.contents = UIImage (o nazwie: "gwiazda") ?.cgImage

+2

Proszę podać więcej szczegółów w swojej odpowiedzi. Nawet jeśli twoja odpowiedź jest kompletnym rozwiązaniem, osoba pytająca dowie się więcej, jeśli poświęcisz czas na wyjaśnienie, co robi twój kod i jak do niego doszło. – Jolta