Je n’ai qu’une vue et je veux définir backGroudColor pour cette vue par UIImage . Le code comme:
self.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"backImage.png"]];
le problème est le suivant: le backImage'frame est plus petit que la vue. comment étirer UIImage pour profiter pleinement de ma vue . Je sais que je peux utiliser UIImageView.
quelqu'un a une bonne idée?
mettre à jour:
Je ne peux pas télécharger une image.
Comme ceci: la taille de backImge est de 30 * 30, et celle de ma vue est de 1024 * 700, .__ quand j'utilise myview.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"backImage.png"]];
Le résultat est que backGroup de myview a beaucoup de 'backImage.png' . Mon objectif est d'avoir une 'backImage.png' complète.
Autant que je sache, vous ne pouvez pas redimensionner directement l'image de motif de l'arrière-plan. Le moyen le plus simple consiste simplement à modifier votre image en fonction de la taille du cadre de votre vue parent. 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]];
la réponse de world000 traduite en Swift:
self.layer.contents = UIImage(named: "freshBackground.png")?.CGImage
Et sur la base de la réponse de Kjuly, si vous voulez que l'image soit insérée 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;
}
La même chose 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;
}
Voici, sur la base des commentaires précédents, une version qui redimensionne l’image en premier, puis coupe le remplissage proportionnellement.
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;
}
J'utilise la méthode suivante pour:
Code:
UIGraphicsBeginImageContext(self.window.frame.size);
[[UIImage imageNamed:@"background"] drawInRect:self.window.bounds];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
self.window.backgroundColor = [UIColor colorWithPatternImage:image];