简体   繁体   English

ios:colorWithPatternImage,全屏拉伸图像

[英]ios: colorWithPatternImage , stretch image full screen

I have one view , and want set backGroudColor for this view by UIImage. 我有一个视图,并希望通过UIImage为此视图设置backGroudColor。 The code as : 代码如下:

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

the problem is: the backImage'frame is small than the view. 问题是:backImage'frame比视图小。 how to stretch UIImage to full my view. 如何将UIImage拉伸到我的视野。 I konw use UIImageView can reach. 我知道使用UIImageView可以达到。

someone have good idea? 有人有好主意吗?

update: 更新:

I can't upload one image. 我无法上传一张图片。

Like this:backImge's size is 30*30, and my view's size is 1024*700, when i use myview.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"backImage.png"]]; 像这样:backImge的大小是30 * 30,我的视图大小是1024 * 700,当我使用myview.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"backImage.png"]];

The result is myview's backGroup has many 'backImage.png'. 结果是myview的backGroup有很多'backImage.png'。 my goal is have one 'backImage.png' streth full myview. 我的目标是让一个'backImage.png'充满我的观点。

Have a try. 试试。

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

Swift: 迅速:

self.view.layer.contents = UIImage(named: "freshBackground")!.cgImage

As far as I know, you cannot resize the background's pattern image directly. 据我所知,你无法直接调整背景的图案图像。 The easiest way is just to change your image to fit your parent view's frame size. 最简单的方法是更改​​图像以适合父视图的帧大小。 Or you can redraw your image to fit the size of your parent view. 或者,您可以重绘图像以适合父视图的大小。

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

world000的答案翻译成Swift:

self.layer.contents = UIImage(named: "freshBackground.png")?.CGImage

And based on Kjuly's answer, if you want the image to be inset properly at the center rather than being stretched, use this method to get the new image: 根据Kjuly的回答,如果您希望图像在中心正确插入而不是被拉伸,请使用此方法获取新图像:

#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;
}

The same with overloaded variant: 与重载变体相同:

+(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;
}

I use the following method to: 我使用以下方法:

  1. draw the image within the specific bounds (which makes it scale) 在特定边界内绘制图像(这使其缩放)
  2. use the resulting image as a pattern. 使用生成的图像作为模式。

Code: 码:

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

Here's based on previous comments a version that scales the image first, then crops to proportionally aspect fill. 这是基于之前的评论,一个版本首先缩放图像,然后裁剪成比例填充。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM