【问题标题】:How to fill background image of an UIView如何填充 UIView 的背景图像
【发布时间】:2011-12-26 00:54:42
【问题描述】:

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

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

我的问题是背景图像不在视图内居中,但它会重放几次以填充所有视图。有没有办法让 uiview 中的图像居中并显示屏幕尺寸?

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

【问题讨论】:

  • 为什么不先手动调整图像大小?

标签: iphone objective-c uiview background


【解决方案1】:

您需要预先处理图像,以制作居中和拉伸的图像。 试试这个:

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 ,这与这个相比不太好。
  • 我已经为我的视图尝试了这种方法,但图像在横向上被弄乱了。有人知道怎么解决吗?
  • 这解决了我在图像视图中从文档目录重新加载新图像的问题,否则它不会更新。谢谢
  • 嗨...我可以在不使用以下函数的情况下调整图像大小吗,UIGraphicsGetImageFromCurrentImageContext(),UIGraphicsEndImageContext(),UIGraphicsBeginImageContextWithOptions()
  • 我正在使用此代码为我的自定义标签栏制作背景图片。它会水平填充标签栏,但垂直会留下空格。这是正在发生的事情的图片。知道有什么问题吗? [imgur.com/qwbCC5J]
【解决方案2】:

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

【讨论】:

  • 使用 drawAsPatternInRect 而不是 drawInRect
  • 感谢您的建议,但我为什么要这样做?
  • 我的 xcode 有问题。它表明没有方法drawInRect。你说的对。多谢,伙计。 drawAsPatternInRect 没有给出确切的效果。
  • 如何在不拉伸的情况下在屏幕中间显示背景图片。
  • 我认真地准备砸我的显示器,因为无论我做什么,我都无法让 UIImage 对象适当地缩放或正确定位。感谢感谢感谢您对实际有效的代码的这种 Swift 改编!
【解决方案3】:

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

确实,您需要使用UIImageView 来居中和缩放图像。您拥有UIScrollView 的事实并不能阻止这一点:

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

恕我直言,这是面向未来变化的最简单、最灵活的设计。

【讨论】:

  • Also colorWithPatternImage: 似乎永远保留图像,造成内存泄漏。小棋盘格图案没关系,但如果你使用真实的图像,你会很快耗尽内存......
【解决方案4】:

重复:

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

拉伸

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

【讨论】:

  • 感谢您的回答。但作为旁注,不要忘记,对于重复的代码,必须处理图像并调整其大小。
【解决方案5】:

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

【讨论】:

    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

      您可以使用 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")];
      

      【讨论】:

        【解决方案8】:

        对于 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),它就会出现
        【解决方案9】:

        标记的答案很好,但它会使图像拉伸。 就我而言,我有一个小图块图像,我想要重复而不是拉伸。 以下代码是我解决黑色背景问题的最佳方法:

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

        【讨论】:

          【解决方案10】:

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

          【讨论】:

            猜你喜欢
            • 2018-10-02
            • 1970-01-01
            • 1970-01-01
            • 2015-08-07
            • 1970-01-01
            • 1970-01-01
            • 2012-04-28
            • 2016-02-12
            • 2019-01-28
            相关资源
            最近更新 更多