Перемещение изображений в отдельную папку Xcode - PullRequest
0 голосов
/ 02 ноября 2019

Я следовал собственным учебным курсам Apple и сейчас пробую что-то с этими файлами: https://developer.apple.com/tutorials/swiftui/building-lists-and-navigation

Я проверяю, как получить изображения, но для моего теста это будет около 100 изображений, поэтому я хочуих в отдельной папке, поэтому это не делает папку ресурсов грязной. Поэтому вместо всех изображений, помещаемых в Resource, я создал папку с именем «img» внутри ресурса.

Это заставило XCode выдать ошибку, сказав, что не может найти изображения. Даже после того, как я закомментировал все ссылки на все изображения, он по-прежнему выдает сообщение об ошибке: «/Downloads/BuildingListsAndNavigation/Complete/Landmarks/Landmarks/Resources/umbagog.jpg: Нет такого файла или каталога»

Вот Appleсобственный код, Models / Data.swift:

final class ImageStore {
    typealias _ImageDictionary = [String: CGImage]
    fileprivate var images: _ImageDictionary = [:]

    fileprivate static var scale = 2

    static var shared = ImageStore()

    func image(name: String) -> Image {
        let index = _guaranteeImage(name: name)

        return Image(images.values[index], scale: CGFloat(ImageStore.scale), label: Text(verbatim: name))
    }

    static func loadImage(name: String) -> CGImage {
        guard
            let url = Bundle.main.url(forResource: name, withExtension: "jpg"),
            let imageSource = CGImageSourceCreateWithURL(url as NSURL, nil),
            let image = CGImageSourceCreateImageAtIndex(imageSource, 0, nil)
        else {
            fatalError("Couldn't load image \(name).jpg from main bundle.")
        }
        return image
    }

    fileprivate func _guaranteeImage(name: String) -> _ImageDictionary.Index {
        if let index = images.index(forKey: name) { return index }

        images[name] = ImageStore.loadImage(name: name)
        return images.index(forKey: name)!
    }
}

Итак, мой вопрос: как мне заставить его хранить и получать изображения в папке resource / img?

Ответы [ 2 ]

1 голос
/ 03 ноября 2019

tl; dr

Очистите ваш проект после внесения структурных изменений. Используйте Shift + Command + K , затем создайте свой проект Command + R


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

Внутри файла Data.swift есть функция с именем loadImage(name:) Я скопировал ее здесь, чтобы вы могли ее легко прочитать.

static func loadImage(name: String) -> CGImage {
    guard
        let url = Bundle.main.url(forResource: name, withExtension: "jpg"),
        let imageSource = CGImageSourceCreateWithURL(url as NSURL, nil),
        let image = CGImageSourceCreateImageAtIndex(imageSource, 0, nil)
    else {
        fatalError("Couldn't load image \(name).jpg from main bundle.")
    }
    return image
 }

Они играют ключевую роль в этом let url = Bundle.main.url(forResource: name, withExtension: "jpg"). Это просматривает весь ваш пакет приложений для ресурса с именем name с указанным расширением файла. Как только он находит его, он возвращает url ресурса в комплекте. Затем url используется для открытия изображения.

Загрузка учебного проекта по вышеуказанной ссылке (и использование завершенного проекта);перемещение изображений в папку с именем img внутри папки Resources не нарушает работу приложения. И это все, что вам нужно сделать. Вам не нужно переименовывать какие-либо файлы внутри вашего проекта. Что приятно.

Одна вещь, которую вам нужно будет сделать, , и, вероятно, именно поэтому вы получаете эту ошибку , это очистить ваш проект перед его сборкой, особенно если вы вносите структурные изменения,Вы можете сделать это, перейдя в меню Product -> Clean Build Folder, или вы также можете сделать это, нажав Shift + Команда + K

Вот что находится внутри моего проекта Xcode после перемещения файлов.

xcode

Вот что находится в моем каталоге

project directory


Почему вы должны использовать каталог активов?

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

В каталогах активов также могут быть разные папки, и вы можетеиметь разные каталоги, что значительно упрощает управление активами, которые есть в вашем приложении.

0 голосов
/ 03 ноября 2019

В папке ресурсов находится файл JSON с именем landmarkData. Приложение может получить изображения из этого файла, потому что изображения являются локальными для этого файла. Когда вы добавили новую папку, все пути, вероятно, были перепутаны. В каждом наборе данных набора файлов JSON есть «imageName»: изображение. Переформатируйте изображения следующим образом, если вам действительно нужна новая папка:

«imageName»: «img / theImageName»

Надеюсь, это поможет! Вы всегда можете не использовать новую папку, но я понимаю, почему вы этого хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...