2012-11-07 15 views
26

Devo aggiungere UIImageView come sottoview di MapView. Per fare questo ho creato un livello sopra MapView. In questo strato voglio mettere la mia immagine, ma ottengo un rettangolo bianco e nient'altro. La mia immagine non è visibile.aggiungi UIImage in CALayer

Questo è il codice:

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

risposta

6

ho rimosso

[layer setNeedsDisplay]; 

Non so perché, ma funziona!

+2

Immagino che setNeedsDisplay abbia reso il livello per ridisegnare il contenuto e quindi eliminare l'immagine. – Bastian

+0

Anche questo ha funzionato. grazie Adriana. –

41

deve essere

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

si può solo mettere un CGImage in uno strato, non un UIImage direttamente.

3

È necessario impostare correttamente il frame del CALayer, poiché il valore predefinito è CGRectZero.

77

Questa è una risposta generale per il futuro dei telespettatori. Si basa sul titolo della domanda piuttosto che sui dettagli della domanda originale.

Come aggiungere un UIImage ad un CALayer

È possibile aggiungere un'immagine a un punto di vista di layer semplicemente utilizzando la sua proprietà contents:

myView.layer.contents = UIImage(named: "star")?.cgImage 
  • Nota che le UIImage deve essere convertito a a CGImage.

Se si desidera aggiungere l'immagine nel proprio livello, si può fare in questo modo:

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

modificare l'aspetto

Il codice precedente produce una vista come questo. L'azzurro è il UIView e la stella blu scuro è il UIImage.

enter image description here

Come si può vedere, però, sembra pixel. Questo perché lo UIImage è più piccolo dello UIView quindi è ridimensionato per riempire la vista, che è quella predefinita che non si specifica nient'altro.

Gli esempi seguenti mostrano variazioni sulla proprietà contentsGravity del livello. Il codice è simile al seguente:

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

In iOS, è possibile impostare il isGeometryFlipped property per true se si sta facendo qualcosa con la parte superiore o la gravità basso, altrimenti sarà l'opposto di quello che ci si aspetta. (La gravità è capovolto solo verticalmente, non il rendering del contenuto. Se si hanno problemi con il contenuto che viene capovolto, vedi this answer.)

Ci sono due UIView esempi qui sotto per ogni ambiente contentsGravity, un punto di vista è più grande della UIImage e l'altro è più piccolo.In questo modo puoi vedere gli effetti del ridimensionamento e della gravità.

kCAGravityResize

Questa è l'impostazione predefinita.

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

correlati

+0

Ottima risposta. Ma come fai kCagravityResizeAspectFill e kCAgravityTop allo stesso tempo? – tcurdt

+1

regolando il contenuto Il rapporto corretto con la giusta misura fa il trucco. Un'altra opzione è usare UIImageView come UViewView maskView. – tcurdt

0

myView.layer.contents = UIImage (denominati: "stella") ?.cgImage

+2

Si prega di fornire maggiori dettagli nella risposta. Anche se la tua risposta è una soluzione completa, il richiedente ne impara di più se ti prendi il tempo per spiegare che cosa fa il tuo codice e come lo hai inventato. – Jolta