Uzyskaj programowy dostęp do katalogu zasobów

96

Wiem, że to nowa funkcja i może nie być to możliwe, ale chciałbym mieć możliwość korzystania z katalogu zasobów do organizowania moich zasobów, ale mam dostęp do wszystkich moich obrazów w sposób programowy. Jak mam teraz uzyskać dostęp do moich obrazów? Czy nadal uzyskuję do nich dostęp po nazwach plików, na przykład:

[UIImage imageNamed:@"my-asset-name.png"];

Wygląda na to, że katalog zasobów nie odwołuje się do rozszerzenia, więc czy wydajniej byłoby uzyskać do niego dostęp bez pliku „.png”?

Powodem, dla którego pytam zamiast testować na sobie, jest to, że nawet po usunięciu zasobów i katalogu zasobów, a następnie wyczyszczeniu folderu kompilacji, nadal mogę uzyskać dostęp do swoich zasobów w mojej aplikacji. Uniemożliwia mi to testowanie katalogu zasobów, gdy go wdrażam.

Po przejrzeniu katalogu zasobów znalazłem plik „Contents.json” dla każdego zasobu i jest on sformatowany w następujący sposób:

{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "scale" : "2x",
      "filename" : "[email protected]"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

Nadal nie jestem pewien, jak mam uzyskać do niego dostęp, ale może to pomoże?

RileyE
źródło

Odpowiedzi:

138

Aby uzyskać dostęp do obrazu z katalogu zasobów, wystarczy uzyskać dostęp do nazwy grupy zasobów bez żadnych rozszerzeń.

Jeśli więc dodasz obraz o nazwie @"[email protected]"do katalogu zasobów, utworzy on grupę zasobów o nazwie my-button.

Teraz wszystko, co musisz zrobić, to uzyskać dostęp do obrazu w następujący sposób:

// Objective-C
[UIImage imageNamed:@"my-button"];
// Swift
UIImage(named: "my-button")

Możesz również edytować grupę zasobów, zmieniając jej nazwę (bez zmiany nazw obrazów) lub zmieniając jej poszczególne komponenty. Umożliwi to przestrzeganie łatwiejszych konwencji nazewnictwa, a także wyświetlanie zupełnie różnych zasobów między różnymi zasobami UIScreen scalebez żadnych scalesprawdzeń.

Aby uwzględnić obrazy dla różnych rozmiarów urządzeń, może być konieczne przełączenie ich w podtytule „Urządzenia” w opcjach grupy katalogu aktywów. Oto przykład tego przełącznika (dostępny po kliknięciu grupy prawym przyciskiem myszy).

RileyE
źródło
Dostępne są wersje R4, czyli obsługa 568. Jeśli przeglądasz atrybuty zestawu obrazów, możesz wybrać opcję „Specyficzne dla urządzenia” z listy rozwijanej Urządzenia, a następnie dodać obraz R4, który pojawi się na 4
calowych
Czy istnieje sposób na programowy dostęp do informacji o wycinaniu? Oprócz pobierania właściwości capInsets z obiektu UIImage?
Klaas
@Klaas Nie jestem pewien, dlaczego miałbyś to uzyskać w inny sposób niż UIImage. Z tego, co widziałem, nie, ponieważ każdy obraz kategorii w grupie może być zupełnie innym obrazem, więc nie będą dostępne żadne ogólne informacje, takie jak krojenie. A może coś mi brakuje?
RileyE
@RileyE Muszę wykonać obliczenia dla niestandardowego widoku nakładki i chciałbym użyć tych samych wstawek. Kiedy muszę tylko utworzyć UIImage dla moich obliczeń, wolałbym przechowywać potrzebną wartość gdzie indziej (i jest to zbędne).
Klaas
1
Wydaje się, że kod Swift został zmieniony naUIImage(named: imageName)
HKTonyLee
26

Apple dodał również nowy sposób uzyskiwania obrazu z zasobów za pomocą Swift 3, nazywa się on `` Image Literal '' i działa jak poniżej:

Obraz dosłowny

Yigit Yilmaz
źródło
5

Szybki

Możesz uzyskać odniesienie do obrazu w katalogu zasobów za pomocą

UIImage(named: "myImageName")

Nie musisz dołączać rozszerzenia.

Suragch
źródło
1

@RileyE ma 100% racji. Jednak z moich doświadczeń warto również zauważyć, że czasami odniesienie do katalogu zasobów dla obrazu może zawierać końcowe białe znaki. Prawdopodobnie nie zauważysz, jeśli użyjesz scenorysów / xibs, ponieważ autouzupełnianie doda je. Ale kiedy odwołujesz się do tego z kodu, nie jest tak oczywiste, na czym polega problem.

AppHandwerker
źródło