Как установить пользовательское изображение в качестве фона ViewController

#swift #path #background #uiimageview

#swift #путь #фон #uiimageview

Вопрос:

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

 class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    @IBOutlet weak var backgroundSelectionView: UIView!
    @IBOutlet weak var imageView: UIImageView!

    @IBAction func imageButton(_ sender: UIButton) {
        let imagePicker = UIImagePickerController()
        imagePicker.delegate = self
        imagePicker.sourceType = .photoLibrary
        imagePicker.allowsEditing = false

        present(imagePicker, animated: true, completion: nil)
    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
            imageView.image = image
        }
        self.dismiss(animated: true, completion: nil)
    }
}
  

Я думаю, мне следует использовать пути (я где-то это читал, но я не знаю, как это сделать, поскольку я ничего не могу найти). Не могли бы вы дать совет о том, как сохранить и загрузить пользовательское изображение (не конкретное, которое вы выбираете вручную и импортируете в свой код, я уже могу это сделать?)

Ответ №1:

Добро пожаловать в StackOverflow!

Вероятно, самым простым способом сделать это было бы сохранить изображение на диск после его выбора и восстановить при ViewController загрузке.

Чтобы сохранить изображение, используйте FileManager и сохраните в хранилище документов приложения:

 /// Saves a background image to disk
/// - Parameter image: The background image to save to disk
/// - Returns: true if successful, false otherwise
func saveBackgroundImage(image: UIImage) -> Bool {

    // make sure that the image can be transformed into data (assuming PNG)
    guard let data = image.pngData() ?? imageView.image?.pngData() else {
        return false
    }

    // ensure that you can write to the document director
    guard let directory = FileManager.default.urls(for: .documentDirectory, 
                                                   in: .userDomainMask).first else {
        return false
    }

    // write the file
    do {
        try data.write(to: directory.appendingPathComponent("backgroundImage.png")!)
        return true
    } catch {   
        print(error.localizedDescription)
        return false
    }
}
  

Теперь вам нужен способ извлечения файла:

 /// Retrieves the saved background image
/// - Returns: The background image from disk if it exists, or nil
func getSavedBackgroundImage() -> UIImage? {
    if let dir = FileManager.default.urls(for: .documentDirectory, 
                                          in: .userDomainMask).first {
        return UIImage(contentsOfFile: URL(fileURLWithPath: dir.absoluteString).appendingPathComponent("backgroundImage.png").path)
    }
    return nil
}
  

Внутри вашего imagePickerController(picker: didFinishPickingMediaWithInfo:) метода, когда вы включаете изображение imageView , сохраните фоновое изображение, вызвав self.saveBackgroundImage(image: image) . Если вы не проверяете логическое значение, возвращаемое из saveBackgroundImage(image:) , то вызовите его следующим образом:

 let _ = self.saveBackgroundImage(image: image)
  

чтобы предотвратить предупреждение «Результат не используется».

Теперь реализуйте свое viewDidLoad , где вы попытаетесь загрузить изображение:

 override func viewDidLoad() {
    super.viewDidLoad()
    if let backgroundImage = self.getSavedBackgroundImage() {
        // set the background image on the `imageView`
        self.imageView.image = backgroundImage
    }
}
  

Комментарии:

1. Спасибо! Я просто получаю несколько ошибок, потому что я предполагаю, что это не swift 4, и я не уверен в том, как их преобразовать … первая из них находится в: guard let data = UIImageJPEGRepresentation(image, 1) ?? UIImagePNGRepresentation(image) else { return false } и поскольку я видел нечто подобное на udemy, я предположил, что мне пришлось изменить UIImagePNGRepresentation(image) в imageView.image!.pngData() , но я предполагаю, что это неправильно… в любом случае, я все еще не могу разобраться с первой частью. и затем в моей кнопке написано «Результат вызова ‘saveBackgroundImage(image:)’ не используется» @LeejaySchmidt

2. Я сделал это guard let data = image.pngData() ?? imageView.image!.pngData() else { return false } , и это работает, но я хотел бы знать, правильно ли это… и как я могу исправить изображение в кнопке?

3. Для безопасности вы можете захотеть сделать это imageView.image?.pngData() , поскольку технически возможно, что вы обнулите объединение и все еще будете иметь nil изображение в imageView .

4. Чтобы устранить проблему с Result of call to 'saveBackgroundImage(image:)' is unused , если вы не проверяете, было ли сохранено изображение или нет, вы можете просто вызвать его следующим образом: let _ = self.saveBackgroundImage(image: image) . Я соответствующим образом обновлю свой ответ.

5. Нет проблем! Рад, что смог помочь!

Ответ №2:

Пожалуйста, установите BackgroundImage, как показано ниже,

 override func viewDidLoad() {
    super.viewDidLoad()
    assignbackground()
}

func assignbackground(){
        let background = UIImage(named: backgroundImage)

        var imageView : UIImageView!
        imageView = UIImageView(frame: view.bounds)
        imageView.contentMode =  UIViewContentMode.ScaleAspectFill
        imageView.clipsToBounds = true
        imageView.image = background
        imageView.center = view.center
        view.addSubview(imageView)
        self.view.sendSubviewToBack(imageView)
    }
  

Пожалуйста, используйте оставшийся код как есть, как код @Leejay Schmidt

Комментарии:

1. Почему я должен это делать? Я хочу, чтобы кнопка устанавливала изображение, мой код работает довольно хорошо (за исключением ошибок, которые я получил при реализации нового кода, который я пытаюсь решить)…