Obecnie posiadam aplikację, która będzie wyświetlać czas przydzielony użytkownikowi na wykonanie określonej akcji. Obecnie jest to proste, używając UILabel do wyświetlania pozostałego czasu.

Chciałbym dodać trochę dopracowania do interfejsu i wyświetlić graficzne odliczanie, które byłoby bardziej atrakcyjne dla użytkownika.

Nie jestem pewien, jak to zrobić, ale moja teoria jest następująca: wiem, że maksymalna wartość, od której odliczam, to 999. Mogę więc utworzyć 3 UIImageViews do reprezentowania każdej cyfry. Zegar aktualnie aktualizuje pozostałą wartość odliczania co sekundę, co z kolei ustawia wartość UILabel. Teoretycznie mógłbym podzielić ten ciąg na jego cyfry składowe (lub pętlę nad znakami ciągów) i załadować obraz „cyfrowy” do odpowiedniego UIImageView na podstawie przekazanej cyfry.

Moje pytania:

  1. Czy podejście, o którym wspomniałem, byłoby? wydajny?

  2. Czy to najlepsze podejście biorąc pod uwagę? sytuacja?

  3. Jak mogę animować zmianę obrazu? nad? Idealnie to, co chciałbym jej nowy obraz do wsunięcia z w górnej części widoku obrazu, podczas gdy obraz, który zastępuje slajdy z dołu. Czy to nawet? możliwy?

Żeby wyjaśnić, nie szukam kogoś, kto napisze dla mnie kod, tylko szukam kilku wskazówek wokół mojej rzeczywistej implementacji.

Wielkie dzięki za poświęcenie czasu na przeczytanie tego posta.

EDYTUJ, wygląda na to, że post tutaj Jak animować zmiana obrazu w UIImageView? pomaga mi w animowaniu rzeczywistych obrazów. Ale nadal chciałbym uzyskać sugestie dotyczące proponowanej przeze mnie realizacji.

1
Mick Walker 27 maj 2011, 17:31

2 odpowiedzi

Najlepsza odpowiedź

Twoje podstawowe podejście jest rozsądne. Kilka rzeczy, o których należy pamiętać:

W przypadku licznika czasu nie zmniejszaj czasu pozostałego w NSTimer. Zamiast tego zawsze używaj „teraz minus czas rozpoczęcia”. NSTimer może nie działać zgodnie z harmonogramem, jeśli system jest zajęty. Przeczytaj „Powtarzające się a nie powtarzające się liczniki czasu” w NSTimer, aby zrozumieć, jak działają.

W przypadku takiego problemu lubię nazywać swoje pliki nazwami typu digit0.png, digit1.png itp. Następnie możesz je załadować w ten sposób:

NSString *imageName = [NSString stringWithFormat:@"digit%d.png", digit];
self.imageView.image = [UIImage imageNamed:imageName];

+imageNamed: ma własne buforowanie, więc jest to dość wydajne. Alternatywnie możesz użyć tablicy 10 obrazów, które wczytujesz na początku i użyj objectAtIndex:, aby uzyskać właściwy. Zwykle robię to za pomocą +imageNamed:.

Wsunięcie nowego obrazu nie stanowi problemu, ale nie powinieneś do tego używać UIImageView. Powinieneś prawdopodobnie zrobić niestandardowy widok z dwoma CALayers, które ładujesz z bieżącym i następnym obrazem, i użyj prostej animacji, aby przesunąć się z jednego do drugiego. Zacznij od Przewodnika programowania Core Animation, a także w sieci jest kilka samouczków. To doskonały mały projekt do nauki Core Animation.

0
Rob Napier 27 maj 2011, 17:56
Dziękuję bardzo za rabunek wejściowy.
 – 
Mick Walker
27 maj 2011, 18:05
  1. Wydajny? Myślę, że twoje podejście jest słuszne. Animowanie 3 stosunkowo niewielkich widoków obrazu co 1000 milisekund nie jest dla procesora dużym nakładem pracy. Ale na pytanie o efektywność/wydajność zawsze trzeba odpowiedzieć empirycznie (imo).
  2. Najlepsza? - Jeśli działa, działa, nie zawiesza się itp. czego więcej potrzebujesz? Jedyne inne podejście, jakie przychodzi mi do głowy, to dostarczenie obrazu tła i nadal używanie dynamicznego UILabel dla cyfry.

W tym momencie powiedziałbym, że idź i zobacz, co otrzymasz.
Powodzenia.

1
Rayfleck 27 maj 2011, 17:55
Chciałbym móc oznaczyć kilka odpowiedzi na pytanie jako poprawne.
 – 
Mick Walker
27 maj 2011, 18:05
Walker - cóż, odpowiedź Roba jest o wiele lepsza niż moja, więc jestem zadowolony z mojego głosowania. Powodzenia!
 – 
Rayfleck
27 maj 2011, 18:14