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


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

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

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

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

10 65

10 ответов:

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

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

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

на Свифт использовать это...

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

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

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

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

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

повторю:

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

растянутых

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

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

правильный способ сделать в 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!)
    }

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

для 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 Решение:

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