¿Cómo embaldosar un UIImage verticalmente mientras solo se extiende horizontalmente en iOS?

Tengo una image que se puede estirar en dirección horizontal, pero es necesario que se teje verticalmente (una encima de la otra) para llenar mi vista. ¿Cómo podría hacer esto?

Sé que una image se puede cambiar de tamaño mediante el uso del método -(UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets . Por lo tanto, funciona bien para la dirección horizontal, pero ese método no se puede usar para la dirección vertical; en realidad, necesita ser alicatado y no estirarse en dirección vertical para funcionar.

Ahora mi idea de cómo podría funcionar esto es ejecutar un ciclo que cree un UIImageView con la image horizontalmente estirada y simplemente ajustar la propiedad frame.origin.y luego agregarlo como una subvista cada ciclo hasta que haya pasado la altura de la vista Sin embargo, esto parece una forma excesivamente compleja de hacerlo y, en realidad, no es práctico cuando se necesita cambiar el tamaño de la vista (en una rotation de iPad, por ejemplo)

¿Hay una manera más simple y eficiente de hacer esto en iOS 6.x?

Utilicé esto para embaldosar una image horizontalmente en UIImageView:

 UIImage *image = [UIImage imageNamed:@"my_image"]; UIImage *tiledImage = [image resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0) resizingMode:UIImageResizingModeTile]; UIImageView *imageView = [[UIImageView alloc] initWithImage:tiledImage]; 

Esto supone que establece el marco de UIImageView en un tamaño mayor que el activo de image. Si la altura es más alta que tu image, también se teja verticalmente.

¿Ha considerado utilizar el método de colorWithPatternImage: para crear un patrón repetitivo y simplemente pasar una image con el ancho horizontal correcto?

Ejemplo de código:

  // On your desinetworking View Controller - (void)viewDidLoad { [super viewDidLoad]; UIImage *patternImage = [UIImage imageNamed:@"repeating_pattern"]; self.view.backgroundColor = [UIColor colorWithPatternImage:patternImage]; // ... do your other stuff here... } 
 UIImage *image = [UIImage imageNamed:@"test.png"]; UIImage *resizableImage = [image resizableImageWithCapInsets:UIEdgeInsetsMake(0, image.size.width / 2, 0, image.size.width / 2)]; 

Entonces he descubierto una solución para esto. Creo que es un poco cursi, pero funciona.

Básicamente, lo que he hecho fue crear mi image estirable con las tapas izquierda y derecha especificadas. Y luego inicializo un UIImageView con él. Luego ajuste el marco de la vista de la image al ancho deseado. Esto cambiará el tamaño de la image que está contenida.

Luego, finalmente, utilicé una pieza de código que encontré que crea una nueva image al hacer un mosaico vertical de la image ajustada que ahora está contenida en la vista de la image. Observe cómo, en lugar de acceder al UIImage original, estoy usando la propiedad de image de la vista UIImageView.

Lo último es configurar el nuevo UIImage como el color de background estampado de la vista

Aquí está el código:

 // create a strechable image UIImage *image = [[UIImage imageNamed:@"progressBackgroundTop@2x.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 60, 0, 60)]; // create the image view that will contain it UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; CGRect frame = imageView.frame; frame.size.width = self.view.bounds.size.width; imageView.frame = frame; // create the tiled image CGSize imageViewSize = imageView.bounds.size; UIGraphicsBeginImageContext(imageViewSize); CGContextRef imageContext = UIGraphicsGetCurrentContext(); CGContextDrawTiledImage(imageContext, (CGRect){ CGPointZero, imageViewSize }, imageView.image.CGImage); UIImage *finishedImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); self.view.backgroundColor = [UIColor colorWithPatternImage:finishedImage];