iOS: colorWithPatternImage, stretch image plein écran

j'ai une vue , et je veux mettre backGroudColor pour cette vue par UIImage. Le code est:

self.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"backImage.png"]];

le problème est que le fond d'image est petit par rapport à la vue. comment étendre UIImage à ma vue. - Je connaître l'utilisation UIImageView peut atteindre.

quelqu'un a une bonne idée?

mise à jour:

Je ne peux pas télécharger une image.

comme ceci:la taille de backImge est de 30*30, et la taille de ma vue est de 1024*700, quand j'utilise myview.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"backImage.png"]];

le résultat est que le backGroup de myview a beaucoup de backImage.png". mon but est d'avoir un 'backImage.png' streth plein de mavue.

40
demandé sur Hiren 2012-05-17 07:20:59

6 réponses

essayez.

self.layer.contents = (id)[UIImage imageNamed:@"freshBackground.png"].CGImage;

Swift:

self.view.layer.contents = UIImage(named: "freshBackground")!.cgImage
117
répondu world000 2018-08-20 17:25:09

autant que je sache, vous ne pouvez pas redimensionner l'image de motif de l'arrière-plan directement. La façon la plus simple est simplement de modifier votre image pour qu'elle corresponde à la taille du cadre de votre vue mère. Ou vous pouvez redessiner votre image pour l'adapter à la taille de votre vue parent.

UIView * yourView = [[UIView alloc] initWithFrame:CGRectMake(10.f, 100.f, 300.f, 100.f)];
UIImage * targetImage = [UIImage imageNamed:@"backImage.png"];

// redraw the image to fit |yourView|'s size
UIGraphicsBeginImageContextWithOptions(yourView.frame.size, NO, 0.f);
[targetImage drawInRect:CGRectMake(0.f, 0.f, yourView.frame.size.width, yourView.frame.size.height)];
UIImage * resultImage = UIGraphicsGetImageFromCurrentImageContext();    
UIGraphicsEndImageContext();

[yourView setBackgroundColor:[UIColor colorWithPatternImage:resultImage]];
23
répondu Kjuly 2012-05-17 04:07:48

la réponse de world000 traduite à Swift:

self.layer.contents = UIImage(named: "freshBackground.png")?.CGImage
3
répondu Connor Krupp 2015-08-31 20:05:44

et basé sur la réponse de Kjuly, si vous voulez que l'image soit inset correctement au centre plutôt que d'être étirée, utilisez cette méthode pour obtenir la nouvelle image:

#pragma mark - Image
+(UIImage*)imageFitInCenterForSize:(CGSize)inSize forSourceImage:(UIImage*)inImage
{
    // redraw the image to fit |yourView|'s size
    CGSize imageOriginalSize = inImage.size;
    UIImage *resultImage = nil;
    if (imageOriginalSize.width<=inSize.width && imageOriginalSize.height<=inSize.height)
    {
        UIGraphicsBeginImageContextWithOptions(inSize, NO, 0.f);
        [inImage drawInRect:CGRectMake((inSize.width-imageOriginalSize.width)/2.0, (inSize.height-imageOriginalSize.height)/2.0, imageOriginalSize.width, imageOriginalSize.height)];
        resultImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    }
    return resultImage;
}

même avec la variante surchargée:

+(UIImage*)imageFitInCenterForSize:(CGSize)inSize forSourceImage:(UIImage*)inImage xOffset:(CGFloat)inXOffset yOffset:(CGFloat)inYOffset
{
    // http://stackoverflow.com/questions/10629403/ios-colorwithpatternimage-stretch-image-full-screen
    // redraw the image to fit |yourView|'s size
    CGSize imageOriginalSize = inImage.size;
    UIImage *resultImage = nil;
    if (imageOriginalSize.width<=inSize.width && imageOriginalSize.height<=inSize.height)
    {
        UIGraphicsBeginImageContextWithOptions(inSize, NO, 0.f);
        [inImage drawInRect:CGRectMake((inSize.width-imageOriginalSize.width)/2.0+inXOffset, (inSize.height-imageOriginalSize.height)/2.0+inYOffset, imageOriginalSize.width, imageOriginalSize.height)];
        resultImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    }
    return resultImage;
}
2
répondu Raj Pawan Gumdal 2015-04-16 04:13:10

voici basé sur des commentaires précédents une version qui balance d'abord l'image, puis récolte à l'aspect proportionnellement remplir.

func imageScaledToFillSize(size: CGSize, image: UIImage) -> UIImage
{
    let aspect = image.size.width / image.size.height;
    UIGraphicsBeginImageContextWithOptions(size, false, 0)
    if (size.width / aspect <= size.height) {
        let resizedImg = self.imageScaledToSize(CGSize(width: size.height * aspect, height: size.height), image: image)
        resizedImg.drawInRect(CGRectMake((size.width - resizedImg.size.width)/2, 0, resizedImg.size.width, resizedImg.size.height))
    } else {
        let resizedImg = self.imageScaledToSize(CGSize(width: size.width, height: size.width / aspect), image: image)
        resizedImg.drawInRect(CGRectMake(0, (size.height-resizedImg.size.height)/2, resizedImg.size.width, resizedImg.size.height))
    }
    let imageR = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return imageR;
}

func imageScaledToSize(size: CGSize, image: UIImage) -> UIImage {
    UIGraphicsBeginImageContextWithOptions(size, false, 0.0);
    image.drawInRect(CGRectMake(0.0, 0.0, size.width, size.height))
    let imageR = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext();
    return imageR;
}
0
répondu ceed 2015-10-17 12:22:56

j'utilise la méthode suivante:

  1. dessinez l'image à l'intérieur des limites spécifiques (ce qui la fait échelle)
  2. utilisez l'image résultante comme motif.

Code:

UIGraphicsBeginImageContext(self.window.frame.size);
[[UIImage imageNamed:@"background"] drawInRect:self.window.bounds];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
self.window.backgroundColor = [UIColor colorWithPatternImage:image];
0
répondu Michael 2017-12-14 15:26:46