2014-09-08 13 views

Odpowiedz

7

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.

+1

Znakomita ekspansja! – seeker12

Powiązane problemy