Подтвердить что ты не робот

Как вы делаете масштаб фонового изображения на размер экрана в swift?

Я пытаюсь сделать изображение UIView для моего фона в swift с использованием изображения шаблона. Код, который у меня есть, хорошо работает, за исключением того, что я хочу, чтобы изображение занимало весь экран. Мой код выглядит так: self.view.backgroundColor = UIColor(patternImage: UIImage(named: "backgroundImage")!)

Кто-нибудь знает, как сделать фоновое изображение, которое будет занимать весь экран, и будет масштабироваться при появлении на разных размерах экрана iPhone?

4b9b3361

Ответ 1

Обратите внимание, что:

Я опубликовал этот ответ со своего старого аккаунта (который больше не поддерживается для меня, и я больше не могу к нему обращаться), это мой улучшенный ответ.


Вы можете сделать это программно вместо создания IBOutlet в каждом представлении. просто создайте расширение UIView (Файл → Создать → Файл → Файл Swift → назовите его как хотите) и добавьте:

extension UIView {
func addBackground() {
    // screen width and height:
    let width = UIScreen.mainScreen().bounds.size.width
    let height = UIScreen.mainScreen().bounds.size.height

    let imageViewBackground = UIImageView(frame: CGRectMake(0, 0, width, height))
    imageViewBackground.image = UIImage(named: "YOUR IMAGE NAME GOES HERE")

    // you can change the content mode:
    imageViewBackground.contentMode = UIViewContentMode.ScaleAspectFill

    self.addSubview(imageViewBackground)
    self.sendSubviewToBack(imageViewBackground)
}}

Теперь вы можете использовать этот метод со своими представлениями, например:

override func viewDidLoad() {
    super.viewDidLoad()

    self.view.addBackground()
}

Ответ 2

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

enter image description here

Теперь просто выберите вид изображения и с помощью инспектора IB выберите, как вам понравится ваше изображение: заполнить или поместиться, как вы можете видеть ниже:

enter image description here

Ответ 3

Это обновленный ответ моего предыдущего.

Как и в предыдущем подходе, вы можете создать расширение UIView и добавить к addBackground() метод addBackground() следующим образом:

Помните: если вы добавляете его в новый файл .swift, не забудьте добавить import UIKit

extension UIView {
    func addBackground(imageName: String = "YOUR DEFAULT IMAGE NAME", contentMode: UIView.ContentMode = .scaleToFill) {
        // setup the UIImageView
        let backgroundImageView = UIImageView(frame: UIScreen.main.bounds)
        backgroundImageView.image = UIImage(named: imageName)
        backgroundImageView.contentMode = contentMode
        backgroundImageView.translatesAutoresizingMaskIntoConstraints = false

        addSubview(backgroundImageView)
        sendSubviewToBack(backgroundImageView)

        // adding NSLayoutConstraints
        let leadingConstraint = NSLayoutConstraint(item: backgroundImageView, attribute: .leading, relatedBy: .equal, toItem: self, attribute: .leading, multiplier: 1.0, constant: 0.0)
        let trailingConstraint = NSLayoutConstraint(item: backgroundImageView, attribute: .trailing, relatedBy: .equal, toItem: self, attribute: .trailing, multiplier: 1.0, constant: 0.0)
        let topConstraint = NSLayoutConstraint(item: backgroundImageView, attribute: .top, relatedBy: .equal, toItem: self, attribute: .top, multiplier: 1.0, constant: 0.0)
        let bottomConstraint = NSLayoutConstraint(item: backgroundImageView, attribute: .bottom, relatedBy: .equal, toItem: self, attribute: .bottom, multiplier: 1.0, constant: 0.0)

        NSLayoutConstraint.activate([leadingConstraint, trailingConstraint, topConstraint, bottomConstraint])
    }
}

Обратите внимание, что обновления для этого ответа:

  • Swift 4 код 🙂
  • Добавление -programatics- NSLayoutConstraints: это потому, что при применении того, что упомянуто в моем предыдущем ответе, он отлично работает для текущей ориентации устройства, но не когда приложение поддерживает оба портретного/ландшафтного режима, если ориентация устройства была изменена, background imageView Размер будет таким же (тот же размер) и не адаптирует новую ширину/высоту экрана устройства, поэтому добавление ограничений должно решить эту проблему.
  • Добавление параметров по умолчанию: для большей гибкости вы можете - иногда - захотеть изменить изображение по умолчанию или даже контекстный режим для вашего фона:

Использование:

Предполагая, что вы хотите вызвать его в viewDidLoad():

override func viewDidLoad() {
    //...

    // you can call 4 versions of addBackground() method

    // 1- this will add it with the default imageName and default contextMode
    view.addBackground()

    // 2- this will add it with the edited imageName and default contextMode
    view.addBackground(imageName: "NEW IMAGE NAME")

    // 3- this will add it with the default imageName and edited contextMode
    view.addBackground(contentMode: .scaleAspectFit)

    // 4- this will add it with the default imageName and edited contextMode
    view.addBackground(imageName: "NEW IMAGE NAME", contextMode: .scaleAspectFit)
}

Ответ 4

Используется PureLayout. Вы можете просто использовать AutoLayout с несколькими строками.

UIImageView* imgView = UIImageView(image: myUIImage)
imgView.setTranslatesAutoresizingMaskIntoConstraints(false)
self.view.addSubview(imgView)
self.view.addConstraints(imgView.autoPinEdgesToSuperviewEdgesWithInsets(UIEdgeInsetsMake(0,0,0,0))

Ответ 5

Вот ваши варианты масштабирования!

Для свойства .contentMode:

ScaleToFill Это позволит масштабировать изображение внутри изображения, чтобы заполнить все границы изображения.

ScaleAspectFit Это позволит убедиться, что изображение внутри изображения будет иметь правильное соотношение сторон и соответствовать границам изображений.

ScaleAspectFill Это позволит убедиться, что изображение внутри изображения будет иметь правильное соотношение сторон и заполнить все границы изображения. Чтобы это значение работало правильно, убедитесь, что вы установили для свойства clipsToBounds изображения в true.

class SecondViewController : UIViewController {

    let backgroundImage = UIImage(named: "centralPark")
    var imageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.thirdChoiceField.delegate = self
        self.datePicker.minimumDate = NSDate()
        imageView = UIImageView(frame: view.bounds)
        imageView.contentMode = .ScaleAspectFill
        imageView.clipsToBounds = true
        imageView.image = backgroundImage
        imageView.center = view.center
        view.addSubview(imageView)
        self.view.sendSubviewToBack(imageView)

Ответ 6

Я использовал ограничения, чтобы сделать изображение "autoLayout". Я сделал вид, чтобы показать индикатор активности (с полным фоновым изображением), в то время как просмотр по segue загружается. Код выглядит следующим образом.

var containerView: UIView = UIView()
var actionIndicator: UIActivityIndicatorView = UIActivityIndicatorView()

private func showActivityIndicator() {
    ///first I set the containerView and the background image
    containerView.translatesAutoresizingMaskIntoConstraints = false
    self.view.addSubview(containerView)
    adjustConstFullSize(containerView, parentView: self.view)
    let backImage = UIImageView(image: UIImage(named: "AppBackImage"))
    backImage.contentMode = UIViewContentMode.ScaleAspectFill
    backImage.translatesAutoresizingMaskIntoConstraints = false
    containerView.addSubview(backImage)
    adjustConstFullSize(backImage, parentView: containerView)

    ////setting the spinner (activity indicator)
    actionIndicator.frame = CGRectMake(0.0, 0.0, 40.0, 40.0)
    actionIndicator.center = CGPointMake(containerView.bounds.size.width / 2, containerView.bounds.size.height / 2)
    actionIndicator.hidesWhenStopped = true
    actionIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.WhiteLarge
    containerView.insertSubview(actionIndicator, aboveSubview: backImage)

    ///throw the container to the main view
    view.addSubview(containerView)
    actionIndicator.startAnimating()
}

Это код для функции "adjustConstFullSize".

func adjustConstFullSize(adjustedView: UIView!, parentView: UIView!) {
    let topConstraint = NSLayoutConstraint(item: adjustedView,
        attribute: .Top,
        relatedBy: .Equal,
        toItem: parentView,
        attribute: .Top,
        multiplier: 1.0,
        constant: 0.0)

    let leftConstraint = NSLayoutConstraint(item: adjustedView,
        attribute: .Leading,
        relatedBy: .Equal,
        toItem: parentView,
        attribute: .Leading,
        multiplier: 1.0,
        constant: 0.0)

    let rightConstraint = NSLayoutConstraint(item: adjustedView,
        attribute: .Trailing,
        relatedBy: .Equal,
        toItem: parentView,
        attribute: .Trailing,
        multiplier: 1.0,
        constant: 0.0)


    let bottomConstraint = NSLayoutConstraint(item: adjustedView,
        attribute: .Bottom,
        relatedBy: .Equal,
        toItem: parentView,
        attribute: .Bottom,
        multiplier: 1.0,
        constant: 0.0)

    parentView.addConstraints([topConstraint, leftConstraint, rightConstraint, bottomConstraint])
}

В приведенной выше функции я "привязал" ограничения контейнера к ограничениям основного вида, сделав представление "полным размером". Я сделал то же самое для UIImageView, а также установил contentMode в AspectFill - это важно, потому что мы хотим, чтобы изображение заполняло контент без растягивания.

Чтобы удалить представление, после ленивой загрузки просто используйте код ниже.

private func hideActivityIndicator() {
    actionIndicator.stopAnimating()
    containerView.removeFromSuperview()
}

Ответ 7

Решение Ahmad Fayyas в Swift 3.0:

func addBackground() {
    let width = UIScreen.main.bounds.size.width
    let height = UIScreen.main.bounds.size.height

    let imageViewBackground = UIImageView(frame: CGRect(x:0, y:0, width: width, height: height))
    imageViewBackground.image = UIImage(named: "YOUR IMAGE NAME GOES HERE")

    // you can change the content mode:
    imageViewBackground.contentMode = UIViewContentMode.scaleAspectFill

    self.view.addSubview(imageViewBackground)
    self.view.sendSubview(toBack: imageViewBackground)
}

Ответ 8

Для этого, я думаю, вам нужно создать UIImageView, прикрепленный к родительским представлениям top/bottom/left/right. Это приведет к тому, что UIImageView всегда будет соответствовать размеру дисплея. Просто убедитесь, что вы установили режим содержимого в представлении изображения как AspectFit

var newImgThumb : UIImageView
newImgThumb = UIImageView(view.bounds)
newImgThumb.contentMode = .ScaleAspectFit
view.addSubview(newImgThumb)

//Don't forget this line
newImgThumb.setTranslatesAutoresizingMaskIntoConstraints(false)

NSDictionary *views =NSDictionaryOfVariableBindings(newImgThumb);


// imageview fills the width of its superview
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[newImgThumb]|" options:0 metrics:metrics views:views]];
// imageview fills the height of its superview
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[newImgThumb]|" options:0 metrics:metrics views:views]];

Ответ 9

`

CGRect screenRect = [[UIScreen mainScreen] bounds];

CGFloat screenWidth = screenRect.size.width;

CGFloat screenHeight = screenRect.size.height;

_imgBackGround.frame = CGRectMake(0, 0, screenWidth, screenHeight);`