2011-11-10 1 views
63

Ho un UIView e impostare un'immagine di sfondo in questo modo:Come riempire immagine di sfondo di un UIView

self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"sfond-appz.png"]]; 

Il mio problema è che di back-immagine non è centrata all'interno della vista, ma è riprodotto alcuni volte per riempire tutta la vista. C'è un modo per centrare l'immagine all'interno di uiview e scretch per avere le dimensioni dello schermo?

Nota: non è possibile utilizzare UIImageView per lo sfondo perché ho un scrollview.

+1

Perché non basta la ri-formato la prima immagine manualmente? –

risposta

268

È necessario elaborare l'immagine in anticipo per creare un'immagine centrata e allungata. 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

Questa è una risposta fantastica. La maggior parte delle soluzioni in stackoverflow puntano a utilizzare UIImageView che non è poi così paragonabile a questo. – GMsoF

+0

Ho provato questo approccio per la mia vista ma l'immagine è incasinata sul paesaggio. qualcuno sa come risolverlo? – tyegah123

+0

Come e dove inserisco questo codice? – cwiggo

17

Il metodo colorWithPattern: è davvero per la generazione di modelli da immagini. Pertanto, la personalizzazione richiesta non è probabilmente né possibile, né è destinata a esserlo.

Infatti è necessario utilizzare uno UIImageView per centrare e ridimensionare un'immagine. Il fatto che si dispone di un UIScrollView non impedisce questo:

Fai self.view una visione generica, quindi aggiungere sia il UIImageView e UIScrollView come subviews. Assicurati che tutto sia cablato correttamente in Interface Builder e rendi trasparente il colore di sfondo della vista di scorrimento.

Questo è IMHO il design più semplice e flessibile per le modifiche future.

+1

Anche colorWithPatternImage: sembra conservare l'immagine per sempre, creando una perdita di memoria. Non importa per i piccoli schemi a scacchiera, ma se utilizzi immagini reali, corri rapidamente dalla memoria ... –

1

È possibile utilizzare il metodo UIGraphicsBeginImageContext per impostare la dimensione dell'immagine come quella della 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")]; 
48

Per Swift uso questo ...

UIGraphicsBeginImageContext(self.view.frame.size) 
UIImage(named: "ImageName.png")?.draw(in: self.view.bounds) 

if let image = UIGraphicsGetImageFromCurrentImageContext(){ 
    UIGraphicsEndImageContext() 
    self.view.backgroundColor = UIColor(patternImage: image) 
}else{ 
    UIGraphicsEndImageContext() 
    debugPrint("Image not available") 
} 
+1

usa drawAsPatternInRect invece di drawInRect –

+1

grazie per il tuo suggerimento, ma perché dovrei farlo? –

+0

c'era un problema con il mio xcode. ha dimostrato che non esiste un metodo drawInRect. hai ragione. Grazie amico. drawAsPatternInRect non sta dando l'efetto esatto. –

3

Per Swift 2.1 Uso questo ...

UIGraphicsBeginImageContext(self.view.frame.size) 
    UIImage(named: "Cyan.jpg")?.drawInRect(self.view.bounds) 

    let image: UIImage! = UIGraphicsGetImageFromCurrentImageContext() 

    UIGraphicsEndImageContext() 

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

Repeat:

UIImage *img = [UIImage imageNamed:@"bg.png"]; 
view.backgroundColor = [UIColor colorWithPatternImage:img]; 

trasferimenti su

UIImage *img = [UIImage imageNamed:@"bg.png"]; 
view.layer.contents = img.CGImage; 
+0

Grazie per la risposta. Ma come nota a margine, non bisogna dimenticare che per la ripetizione del codice si deve elaborare l'immagine e ridimensionarla. –

1

per SWIFT 3.0 utilizzare il seguente codice:

UIGraphicsBeginImageContext(self.view.frame.size) 
    UIImage(named: "bg.png")?.drawAsPattern(in: self.view.bounds) 
    let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()! 
    UIGraphicsEndImageContext() 
    self.view.backgroundColor = UIColor(patternImage: image) 
1

La risposta marcata va bene, ma rende l'immagine allungato. Nel mio caso ho avuto una piccola immagine di piastrelle che volevo ripetere non allungare. E il seguente codice è stato il modo migliore per me per risolvere il problema di fondo nero:

UIImage *tileImage = [UIImage imageNamed:@"myTileImage"]; 
UIColor *color = [UIColor colorWithPatternImage:tileImage]; 
UIView *backgroundView = [[UIView alloc] initWithFrame:self.view.frame]; 
[backgroundView setBackgroundColor:color]; 
//backgroundView.alpha = 0.1; //use this if you want to fade it away. 
[self.view addSubview:backgroundView]; 
[self.view sendSubviewToBack:backgroundView]; 
0

modo corretto per farlo a Swift 3.x Deve & importante scrivere questo viewDidLayoutSubviews perché possiamo ottenere fotogrammi effettiva in viewDidLayoutSubviews

override func viewDidLayoutSubviews() { 
     super.viewDidLayoutSubviews() 
     UIGraphicsBeginImageContext(view.frame.size) 
     UIImage(named: "myImage")?.draw(in: self.view.bounds) 
     let image = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 

     view.backgroundColor = UIColor.init(patternImage: image!) 
    } 
0

Swift 4 Soluzione:

@IBInspectable var backgroundImage: UIImage? { 
    didSet { 
     UIGraphicsBeginImageContext(self.frame.size) 
     backgroundImage?.draw(in: self.bounds) 
     let image = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     if let image = image{ 
      self.backgroundColor = UIColor(patternImage: image) 
     } 
    } 
}