Como preencher a imagem de fundo de um UIView

Eu tenho um UIView e defino uma imagem de plano de fundo dessa maneira:

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

Meu problema é que a imagem de retorno não está centralizada na vista, mas é repetida algumas vezes para preencher toda a visão. Existe uma maneira de centralizar a imagem dentro do uiview e scretch para ter o tamanho da canvas?

Nota: Eu não posso usar o UIImageView para o fundo porque eu tenho um scrollview .

Você precisa processar a imagem antes, para criar uma imagem centralizada e esticada. Tente isto:

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

Para Swift use isso …

 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") } 

O método colorWithPattern: é realmente para gerar padrões de imagens. Assim, a personalização que você precisa provavelmente não é possível, nem é para ser.

Na verdade, você precisa usar um UIImageView para centralizar e dimensionar uma imagem. O fato de você ter um UIScrollView não impede isso:

Faça self.view uma visão genérica, então adicione o UIImageView e o UIScrollView como subvisualizações. Certifique-se de que tudo esteja conectado corretamente no Interface Builder e torne a cor de fundo da exibição de rolagem transparente.

Este é IMHO o design mais simples e flexível para futuras mudanças.

Repetir:

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

Esticado

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

Para o Swift 2.1 use este …

  UIGraphicsBeginImageContext(self.view.frame.size) UIImage(named: "Cyan.jpg")?.drawInRect(self.view.bounds) let image: UIImage! = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() self.view.backgroundColor = UIColor(patternImage: image) 

Maneira correta de fazer no Swift 4 , Se o seu quadro como o tamanho da canvas estiver correto, coloque em qualquer outro lugar, importante escrever isso em viewDidLayoutSubviews pois podemos obter o quadro real em 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!) } 

Você pode usar o método UIGraphicsBeginImageContext para definir o tamanho da imagem igual ao da visualização.

Sintaxe: void UIGraphicsBeginImageContext (tamanho 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")]; 

Para o Swift 3.0, use o seguinte código:

  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) 

A resposta marcada é boa, mas faz a imagem esticada. No meu caso, eu tinha uma pequena imagem que eu queria repetir, não esticar. E o código a seguir foi a melhor maneira de resolver o problema de fundo preto:

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

Solução Swift 4:

 @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) } } }