2012-04-03 1 views
34

Voglio avere un UIImage come immagine di sfondo su un UIView.iOS UIView immagine di sfondo

Ecco il mio codice:

UIColor *background = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"login.png"]]; 
self.view.backgroundColor = background; 
[background release]; 

Il problema è che la scala non va bene. È ridimensionato da 640 a 480, quindi non posso dirlo al 100%, ma sembra che vengano visualizzati solo da 300 a 250 o qualcosa del genere.

Esiste un adattamento per ridimensionare/adattarsi a UIView/Adattare al formato della dimensione?

+0

Qual è la dimensione del PNG originale? Inoltre stai visualizzando questo su un dispositivo retina? –

risposta

7

Secondo il UIColor API:

È possibile usare i colori del modello per impostare il colore di riempimento o ictus proprio come si farebbe con un colore a tinta unita. Durante il disegno, l'immagine nel colore del motivo viene affiancata secondo necessità per coprire l'area specificata.

Ciò significa che tenta di creare un motivo fuori dall'immagine per riempire l'area. Penso che il modo ottimale per farlo sia ridimensionare l'immagine per adattarla esattamente alla dimensione UIView.

C'è una bella risposta qui come ridimensionare l'immagine durante il runtime:

The simplest way to resize an UIImage?

27

ciao provare questo,

 self.view.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"login.png"]]; 
+0

Non funziona ... – Kovu

+1

risposta migliore, chiaro e funziona all'istante. Perfetto per una ricerca veloce. – Heckscheibe

+0

Non funziona correttamente. – bapi

12

Specificare uno sfondo reale e inviarlo alla parte posteriore della vostra vista

//add background 
UIImageView *background = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bg.png"]]; 
[myView addSubview:background]; 
[myView sendSubviewToBack:background]; 
myView.contentMode = UIViewContentModeScaleAspectFit; 
48

si sono tenuti per elaborare la tua immagine prima di aggiungerla, prova questo:

UIGraphicsBeginImageContext(self.view.frame.size); 
[[UIImage imageNamed:@"image.png"] drawInRect:self.view.bounds]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

self.view.backgroundColor = [UIColor colorWithPatternImage:image]; 
+0

Grazie, ha funzionato bene per me – swiftBoy

+0

Questo è il modo più corretto per farlo ... ha funzionato per me..Grazie. – bapi

+2

in swift: https://gist.github.com/asiviero/c9e63b3607bf58373cab – asiviero

0
UIColor *background = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"image.png"]]; 
self.view.backgroundColor = background; 
[background release]; 
1

In Interface Builder, aggiungere un Image View a View e selezionare l'immagine che si desidera utilizzare in Attributes inspector. Infine, crea lo Image View il primissimo figlio di View trascinando l'elemento in Document Outline.

0

Se la vista sta per avere le stesse dimensioni, è possibile inserire un metodo nella AppDelegate.m in grado di scalare l'immagine di sfondo al primo avvio, e quindi mantiene l'immagine in scala in memoria per un utilizzo futuro:

UIImage *backgroundImage = nil; 
- (void)setBackground:(UIView *)view 
{ 
    if (backgroundImage == nil) 
    { 
     UIGraphicsBeginImageContext(view.frame.size); 
     [[UIImage imageNamed:@"Background"] drawInRect:view.bounds]; 
     backgroundImage = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 
    } 
    view.backgroundColor = [UIColor colorWithPatternImage:backgroundImage]; 
} 

Grazie a @uneakharsh per il suo aiuto!

6

E se si vuole farlo in rapida:

self.view.backgroundColor = UIColor(patternImage: UIImage(named:"background.jpg")) 
+0

e sì, voglio farlo in Swift: D –

-1
this.View.BackgroundColor = UIColor.FromPatternImage (UIImage.FromFile ("body_background.png")); 
0

È possibile utilizzare il metodo UIGraphicsBeginImageContext per impostare le dimensioni dell'immagine stessa che di vista.

Sintassi: void UIGraphicsBeginImageContext (dimensione CGSize);

#define IMAGE(imageName) (UIImage *)[UIImage imageWithContentsOfFile: 
[[NSBundle mainBundle] pathForResource:imageName ofType:IMAGE_TYPE_PNG]] 

     UIGraphicsBeginImageContext(self.view.frame.size); 
     [[UIImage imageNamed:@“MyImage.png"] drawInRect:self.view.bounds]; 
     UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 

    self.view.backgroundColor = [UIColor colorWithPatternImage:IMAGE(@"mainBg")]; 
9

In Swift uso questo ...

UIGraphicsBeginImageContext(self.view.frame.size) 
    UIImage(named: "1.png")?.drawInRect(self.view.bounds) 

    var image: UIImage = UIGraphicsGetImageFromCurrentImageContext() 

    UIGraphicsEndImageContext() 

    self.view.backgroundColor = UIColor(patternImage: image) 
2

sto usando la seguente estensione a Swift:

extension UIView{ 

    func setBackgroundImage(img: UIImage){ 

     UIGraphicsBeginImageContext(self.frame.size) 
     img.drawInRect(self.bounds) 
     let patternImage: UIImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     self.backgroundColor = UIColor(patternImage: patternImage) 
    } 
} 

Nel codice è possibile utilizzare in questo modo:

if let image = UIImage(named: "HomeBg"){ 
     self.view.setBackgroundImage(image) 
    } 
0

Volevo anche fare questo e ho scoperto che, a causa di AutoLayout, il UIImageView estende la contenente UIView, quando lo voglio il contrario: io voglio la UIImageView a prendere le dimensioni del UIView.

Così ho creato questa classe. Aggiorna il frame UIImageView in base al contenitore UIView ogni volta che viene disposto tramite layoutSubviews.

/** 
* View with an image whose frame is adjusted to the frame of the view. 
*/ 
class ViewWithImage: UIView { 

    let image: UIImageView 

    init(image: UIImageView) { 
     self.image = image 
     super.init(frame: .zero) 
     self.addSubview(image) 
    } 

    override func layoutSubviews() { 
     super.layoutSubviews() 
     updateImageFrame() 
    } 

    private func updateImageFrame() { 
     image.frame = CGRect(origin: .zero, size: self.frame.size) 
    } 

    required init?(coder: NSCoder) { fatalError("no init(coder:)") } 
}