Как заполнить фоновое изображение UIView

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

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

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

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

Ответ 1

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

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

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

Ответ 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")
 }

Ответ 3

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

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

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

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

Ответ 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 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)

Ответ 6

Вы можете использовать метод 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")];

Ответ 7

Для 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)

Ответ 8

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

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

Ответ 9

Правильный способ сделать в Swift 3.x Необходимо и важно написать это в 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!)
    }

Ответ 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)
        }
    }
}