2012-04-03 27 views
34

Quiero tener un UIImage como imagen de fondo en una UIView.iOS UIView imagen de fondo

Aquí está mi código:

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

El problema es que la escala no está bien. Se escalaron de 640 a 480, así que no puedo decir que esté 100% seguro, pero parece que solo se muestran de 300 a 250 o algo así.

¿Hay un ajuste para escalar/ajustar al modo UIView/fit to size?

+0

¿Cuál es el tamaño del PNG original? ¿También estás viendo esto en un dispositivo de retina? –

Respuesta

7

De acuerdo con la API UIColor:

Puede utilizar los colores del dibujo para fijar el relleno o el trazo de color tal como lo haría un color sólido. Durante el dibujo, la imagen en el color del patrón se muestra en mosaico según sea necesario para cubrir el área determinada.

Eso significa que intenta crear un patrón de su imagen para llenar el área. Creo que la mejor forma de hacerlo es cambiar la escala de la imagen para que se ajuste exactamente al tamaño UIView.

Hay una respuesta agradable aquí cómo cambiar el tamaño de la imagen en tiempo de ejecución:

The simplest way to resize an UIImage?

27

hola probar esto,

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

No funciona ... – Kovu

+1

mejor respuesta, claro y funciona al instante. Perfecto para una investigación rápida. – Heckscheibe

+0

No funciona correctamente. – bapi

12

Especificar un fondo real y enviarlo a la parte posterior de la vista

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

se le requiere para procesar su imagen antes de agregarla, intente esto:

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

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

Gracias, funcionó bien para mí – swiftBoy

+0

Esta es la forma más correcta de hacerlo ... funcionó para mí ... Gracias. – bapi

+2

en 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

En Interface Builder, agregue Image View a View y seleccione la imagen que desea usar en Attributes inspector. Finalmente, haga que el Image View sea el primer hijo del View arrastrando el elemento en Document Outline.

0

Si la vista se va a tener el mismo tamaño, se puede colocar un método en su AppDelegate.m que escala la imagen de fondo en la primera ejecución, y después se mantiene la imagen escalada en la memoria para su uso 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]; 
} 

¡Gracias a @uneakharsh por su ayuda!

6

Y si quieres hacerlo en rápida:

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

y sí, quiero hacerlo en Swift: D –

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

Puede utilizar método UIGraphicsBeginImageContext para establecer el tamaño de la imagen misma que la de la vista.

Sintaxis: void UIGraphicsBeginImageContext (tamaño 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

En Swift uso de este ...

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

estoy usando la siguiente extensión en 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) 
    } 
} 

En el código se puede utilizar como esto:

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

También quería hacer esto y me encontré con que, debido al diseño automático , la UIImageView estira la UIView que contiene, cuando lo quiero a la inversa: Quiero que el UIImageView para tomar el tamaño de la UIView.

Así que creé esta clase. Actualiza el marco UIImageView según el contenedor UIView siempre que se distribuya a través del 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:)") } 
}