如何填充UIView的背景图像


72

我有一个UIView,我以这种方式设置了背景图片:

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

我的问题是,背面图像不在视图内部居中,但已重播了几次以填充所有视图。有没有一种方法可以将图像集中在uiview和scretch中以具有屏幕大小?

注意:我不能UIImageView用于背景,因为我有个scrollview


1
为什么不先手动调整图像大小呢?
Ankit Srivastava

Answers:


283

您需要事先处理图像,以使图像居中并拉伸。尝试这个:

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

self.view.backgroundColor = [UIColor colorWithPatternImage:image];

这是很棒的答案。stackoverflow中的大多数解决方案都指向使用UIImageView,相比之下,这不是那么好。
山姆YC

我已经尝试过这种方法,但是图像在风景中变得混乱了。有谁知道如何解决?
tyegah123 2014年

这解决了我从图像视图中的文档目录重新加载新图像的问题,否则它不会更新。谢谢
djay

嗨...我可以调整图像,而无需使用下列功能,UIGraphicsGetImageFromCurrentImageContext(),UIGraphicsEndImageContext(),UIGraphicsBeginImageContextWithOptions()
Mohith P

我正在使用此代码为自定义选项卡栏制作背景图像。它确实水平填充选项卡栏,但垂直方向留有空格。这是正在发生的事情的图片。知道有什么问题吗?[ imgur.com/qwbCC5J]
萨德·雷曼

58

对于Swift使用...

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

1
使用drawAsPatternInRect代替drawInRect
Chandan Reddy

1
感谢您的建议,但我为什么要这样做?
Mohammad Zaid Pathan'Feb

我的xcode有问题。它表明没有方法drawInRect。你是对的。多谢,伙计。drawAsPatternInRect没有给出确切的效果。
Chandan Reddy

如何在不拉伸的情况下在屏幕中间显示背景图像。
Chandan Reddy 2015年

1
我正准备粉碎监视器,因为无论如何我都无法使UIImage对象正确缩放或正确定位。谢谢谢谢谢谢您对Swift进行的实际工作代码改编!
迈克尔

18

colorWithPattern:方法实际上是根据图像生成图案。因此,您所需的自定义很可能是不可能的,也不是不可能的。

实际上,您需要使用UIImageView来居中和缩放图像。您拥有的事实UIScrollView并不能阻止这种情况:

创建self.view一个通用视图,然后添加UIImageViewUIScrollView子视图。确保所有接口在Interface Builder中正确连接,并使滚动视图的背景颜色透明。

这是恕我直言,最简单,最灵活的设计,可以应对未来的变化。


1
另外colorWithPatternImage:似乎会永久保留图像,从而导致内存泄漏。较小的棋盘图案无关紧要,但是如果您使用真实的图像,则会很快耗尽内存...
Mackie Messer 2014年

16

重复:

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

拉长的

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

谢谢您的回答。但要注意的是,请不要忘记,对于重复的代码段,必须处理图像并调整其大小。
Georgio Sayegh

4

Swift 4中的正确操作方法,如果您的框架作为屏幕尺寸是正确的,则将其放置在其他任何地方,重要的是在viewDidLayoutSubviews因为我们可以在其中获得实际的框架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!)
    }

3

对于Swift 2.1,请使用此...

    UIGraphicsBeginImageContext(self.view.frame.size)
    UIImage(named: "Cyan.jpg")?.drawInRect(self.view.bounds)

    let image: UIImage! = UIGraphicsGetImageFromCurrentImageContext()

    UIGraphicsEndImageContext()

    self.view.backgroundColor = UIColor(patternImage: image)

1

您可以使用UIGraphicsBeginImageContext方法将图像的大小设置为与视图相同。

语法: void UIGraphicsBeginImageContext(CGSize size);

 #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")];

1

对于Swift 3.0,请使用以下代码:

    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)

尽管图像未居中,但此方法有效。如果我使用过uibutton.setBackgroundImage(image)
Shivam Pokhriyal,

1

标记的答案很好,但是可以拉伸图像。在我的情况下,我有一个小的图块图像,我想重复进行而不拉伸。以下代码是我解决黑色背景问题的最佳方法:

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

0

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)
        }
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.