如何填充 UIView 的背景图片

我有一个 UIView,我用这种方法设置背景图像:

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

我的问题是,背景图像并不在视图内居中,但它重播了一些时候,以填补所有的视图。有没有一种方法可以在 uiview 中居中显示图像,并使屏幕尺寸有所变化?

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

126315 次浏览

你需要事先处理图像,使一个集中和拉伸的图像。 试试这个:

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


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

colorWithPattern:方法实际上是用于从图像生成模式。因此,您所需要的定制很可能是不可能的,也不应该是可能的。

实际上,您需要使用 UIImageView来定位和缩放图像。事实上,你有一个 UIScrollView并不能阻止这一点:

使 self.view成为一个通用视图,然后添加 UIImageViewUIScrollView作为子视图。确保所有的 Interface Builder 都是正确的,并且使滚动视图的背景颜色是透明的。

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

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

语法: Void UIGraphicsBeginImageContext (CGSize 大小) ;

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

对于 斯威夫特使用这个..。

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

对于 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)

重复:

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

拉伸

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

对于 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)

标记的答案是好的,但它使图像拉伸。 在我的情况下,我有一个小瓷砖图像,我想重复不拉伸。 下面的代码是我解决黑色背景问题的最佳方法:

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

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

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