iOS 8 wprowadza klasę UIImageAsset z metodą registerImage:withTraitCollection:
. Jak korzystać z tej klasy?Jak korzystać z UImageAsset w iOS 8
Odpowiedz
Zazwyczaj nie trzeba. Zamiast tego użyjesz katalogu zasobów. UIImageAsset, w systemie iOS 8, jest po prostu mechanizmem leżącym u podstaw zestawów obrazów w katalogach zasobów.
Na przykład w systemie iOS 8 katalog zasobów może rozróżniać wersje obrazów przeznaczonych dla różnych klas wielkości, korzystając z wyskakujących menu Szerokość i Wysokość, aby określić różne możliwości klasy wielkości. Następnie, gdy używasz obrazu z katalogu zasobów w interfejsie, właściwa rzecz dzieje się automatycznie. Jeśli korzystamy z iPhone'a z aplikacją obróconą do orientacji poziomej, i jeśli w zestawie obrazów dostępna jest zarówno wysokość dowolna, jak i opcja wysokości kompaktowej, używana jest wersja o wysokości kompaktowej. Te funkcje są dostępne na żywo; jeśli aplikacja obraca się od pionu do portretu, a w zestawie obrazów dostępna jest zarówno wysokość dowolna, jak i opcja Wysokość kompaktowa, wersja o wysokości kompaktowej to zastąpiona z wersją Dowolna wysokość w interfejsie, automatycznie.
Zauważysz, że nie wspomniałem o UIImageAsset. Jednak UIImageAsset jest mechanizmem bazowym. Gdy obraz jest pobierany z katalogu zasobów przez init(named:)
i nazwę jego zestawu obrazów, jego właściwość imageAsset
jest zestawem UIImageAsset. Wszystkie obrazy w tym zestawie obrazów są dostępne za pośrednictwem zestawu UIImageAsset; każdy obraz ma przypisaną kolekcję cech (jej traitCollection
) i można zapytać UIImageAsset o obraz odpowiedni dla określonego zbioru cech, wywołując imageWithTraitCollection:
. W rzeczywistości jest to dokładnie to, co interfejs robi dla ciebie. Obiekt interfejsu, który może wyświetlać obraz, automatycznie rozpoznaje cechy w systemie iOS 8; odbiera komunikat traitCollectionDidChange:
i odpowiednio reaguje.
Jednak możliwe jest również łączenie zdjęć z własnym zestawem UIImageAsset. . W pewnym sensie jest to jak tworzenie katalogu zasobów (lub przynajmniej zestawu obrazów) w kodzie! W tym przykładzie pobieram dwa obrazy z pakietu aplikacji i konfiguruję je tak, aby jeden był używany, gdy aplikacja jest orientacji pionowej, a drugi jest używany, gdy aplikacja jest orientacja pozioma, automatycznie:
let tcdisp = UITraitCollection(displayScale: UIScreen.mainScreen().scale)
let tcphone = UITraitCollection(userInterfaceIdiom: .Phone)
let tcreg = UITraitCollection(verticalSizeClass: .Regular)
let tc1 = UITraitCollection(traitsFromCollections: [tcdisp, tcphone, tcreg])
let tccom = UITraitCollection(verticalSizeClass: .Compact)
let tc2 = UITraitCollection(traitsFromCollections: [tcdisp, tcphone, tccom])
let moods = UIImageAsset()
let frowney = UIImage(named:"frowney")
let smiley = UIImage(named:"smiley")
moods.registerImage(frowney, withTraitCollection: tc1)
moods.registerImage(smiley, withTraitCollection: tc2)
Po tym, jeśli frowney
zostanie umieszczony w interfejsie - na przykład, przekazując go do UIImageView jako jego obraz lub przypisując go jako obraz UIButtonu - jest on automatycznie zmieniany z , gdy aplikacja zmienia orientację.
Niezwykłe jest to, że ta magia działa chociaż nie ma trwałe odniesienie do frowney
, smiley
lub UIImageAsset (moods
). Powodem jest to, że frowney
i smiley
są buforowane przez system (z powodu połączenia z init(named:)
) i każde z nich utrzymuje silne odniesienie do zestawu UIImageAsset, z którym są one zarejestrowane.
Znakomita ekspansja! – seeker12