如何为UIView填充背景图像

74

我有一个 UIView,我是这样设置背景图片的:

self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"sfond-appz.png"]];
我的问题是背景图像在视图中心没有居中,而是重复几次以填满整个视图。有没有一种方法可以将图像居中显示在UIView中,并将其拉伸到屏幕大小?
注意:我不能使用UIImageView作为背景,因为我有一个UIScrollView。

1
为什么你不先手动重新调整图片大小呢? - Ankit Srivastava
10个回答

284

你需要预处理图像,使其成为一个居中且拉伸的图像。 尝试使用以下代码:

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,而与这个相比并不那么好。 - Sam YC
我尝试过这种方法来处理我的视图,但是在横向模式下图像出现了问题。有人知道如何解决吗? - tyegah123
这解决了我的问题,否则我无法在图像视图中从文档目录重新加载新图像并更新。谢谢。 - djay
嗨...我能否在不使用以下函数的情况下调整图像大小,即UIGraphicsGetImageFromCurrentImageContext(),UIGraphicsEndImageContext()和UIGraphicsBeginImageContextWithOptions()? - Mohith P
我正在使用这段代码为我的自定义选项卡栏制作背景图像。它确实在水平方向上填充了选项卡栏,但在垂直方向上留下了空白。这是发生了什么的图片。有什么想法是错的吗?[https://imgur.com/qwbCC5J] - Saad Rehman

59

使用 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
我的Xcode出了问题,它显示没有drawInRect方法。你是对的,谢谢老兄。drawAsPatternInRect不能给出精确的效果。 - Chandan Reddy
从这里下载示例代码。 https://www.dropbox.com/sh/4mxoi9ogxy7olmp/AACWdOr2Wh3kacdxU4uudm9ha?dl=0 - Mohammad Zaid Pathan
1
我曾经严重地准备砸掉我的显示器,因为无论我怎么做,都无法使UIImage对象适当缩放或正确定位。非常感谢您提供的这个Swift代码适配器,它真正起作用了! - Michael
显示剩余4条评论

19

重复:

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

延伸的

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

谢谢您的回答。但是需要注意的是,在重复的代码片段中,必须处理图像并调整其大小。 - Georgio Sayegh

19

colorWithPattern: 方法主要用于从图片中生成图案。因此,您需要的定制很可能是不可能实现的,也不是它的本意。

实际上,您需要使用一个 UIImageView 来居中和缩放一张图片。您拥有一个 UIScrollView 并不会阻止这个操作:

self.view 设置为一个通用视图,然后将 UIImageViewUIScrollView 作为子视图添加进去。确保在 Interface Builder 中正确地连接所有内容,并将滚动视图的背景色设置为透明。

我认为这是最简单和最灵活的设计,方便进行未来的更改。


1
另外,colorWithPatternImage: 似乎会永久保留图像,从而创建内存泄漏。对于小的棋盘格图案无所谓,但如果使用真实图像,则很快会耗尽内存... - Mackie Messer

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接