#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:)’ не используется» @LeejaySchmidt2. Я сделал это
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. Почему я должен это делать? Я хочу, чтобы кнопка устанавливала изображение, мой код работает довольно хорошо (за исключением ошибок, которые я получил при реализации нового кода, который я пытаюсь решить)…