Как заполнить фоновое изображение UIView - PullRequest
66 голосов
/ 10 ноября 2011

У меня есть UIView, и я установил фоновое изображение следующим образом:

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

Моя проблема в том, что заднее изображение не центрировано внутри вида, но оно воспроизводится несколько раз, чтобы заполнить всевид.Есть ли способ отцентрировать изображение внутри uiview и растянуть, чтобы получить размер экрана?

Примечание: я не могу использовать UIImageView для фона, потому что у меня есть scrollview.

Ответы [ 10 ]

278 голосов
/ 10 ноября 2011

Вам необходимо обработать изображение заранее, чтобы сделать центрированное и растянутое изображение.Попробуйте это:

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

self.view.backgroundColor = [UIColor colorWithPatternImage:image];
54 голосов
/ 11 октября 2014

Для 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")
 }
17 голосов
/ 10 ноября 2011

Метод colorWithPattern: действительно предназначен для генерации шаблонов из изображений. Таким образом, требуемая настройка, скорее всего, невозможна и не должна быть.

Действительно, вам нужно использовать UIImageView для центрирования и масштабирования изображения. Тот факт, что у вас есть UIScrollView, не мешает этому:

Сделайте self.view общим представлением, затем добавьте UIImageView и UIScrollView в качестве подпредставлений. Убедитесь, что все правильно подключено в Интерфейсном Разработчике, и сделайте фоновый цвет представления прокрутки прозрачным.

Это ИМХО самый простой и гибкий дизайн для будущих изменений.

16 голосов
/ 31 августа 2016

Повтор:

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

Натяжные

UIImage *img = [UIImage imageNamed:@"bg.png"];
view.layer.contents = img.CGImage;
3 голосов
/ 09 февраля 2016

Для 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)
2 голосов
/ 25 июля 2017

Правильный способ сделать в Свифт 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!)
    }
1 голос
/ 22 апреля 2017

Отмеченный ответ в порядке, но растягивает изображение. В моем случае у меня было маленькое изображение плитки, которое я хотел повторять, а не растягивать. И следующий код был лучшим способом для меня решить проблему черного фона:

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];
1 голос
/ 19 января 2017

Для 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)
1 голос
/ 06 октября 2014

Вы можете использовать метод 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")];
0 голосов
/ 18 ноября 2017

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)
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...