poniedziałek, 22 grudnia 2014

iOS, a co to jest - odcinek ósmy: podstawy iOS cz.3

Dziś, w okresie przedświątecznym chciałbym dokonać “małej rehabilitacji” iOS. Otóż pokazywałem starodawną listę UITableView oraz widoki w postaci plików .xib. Nie pisałem wcześniej, ale nie podobał mi się layout, brakowało mi w nim wydaje się podstawowych rzeczy, nie czułem dobrej kontroli nad nim, widząc tylko wszędzie sztywne liczby, dające różne efekty na różnych ekranach.  Dziś “odkryłem” albo “bliżej poznałem” kilka rzeczy zbliżających bardziej do współczesności:

  • storyboard - wrzucany do standardowo do nowych projektów zamiast .xib, pozwala definiować kilka ekranów i przejścia między nimi, wszystko łącznie z naciśnięciem przycisku mającego wyświetlić inny ekran zrobimy używając zero linii kodu, wszystko za pomocą designera. Tak dobrze to było zdaje się w Sketchflow w Blend, który ma już nie być wspierany w Blend 2015. Pewnym minusem w Xcode jest bardziej skomplikowany powrót z ekranu, przeciągamy przycisk na poprzedni ekran na wyjście, ale dodatkowo zdaje się musi być nawet pusta akcja w kodzie
  • bardziej elastyczny layout - nie widziałem ostatnio w .xib czegoś takiego, dziś w designerze storyboard podefiniowałem warunki na layout  i mogę cieszyć się już wycentrowanym przyciskiem na ekranie niezależnie od jego orientacji i rozdzielczości, podobnie z pozycjonowaniem względem dołu czy góry. Powiew cywilizowanego świata nie oznacza pełnej cywilizacji, trzeba tych warunków na layout trochę się nadefiniować, w tym na szerokość i wysokość i co jakiś czas taki layout “naprawiać” wybierając odpowiednią opcję z menu XCode.
  • UICollectionView - uwolniony layout dla kolekcji, nie jesteśmy więc tylko skazani na tradycjonalistyczną pionową listę z komórkami. Hurra! Nie poznałem na razie szczegółów, ale już sama możliwość czegoś takiego jak “wrappanel” czy bardziej wymyślnego układania elementów znowu daje mi poczucie przybliżenia do świata współczesnego.

Zaczynałem od podstaw (które i tak były znacząco lepsze niż w zamierzchłych czasach, jak słyszałem, że ktoś liczy referencje na piechotę), teraz zaczynam przyglądać się iOS 7, już jest lepiej, ale nie od razu Kraków zbudowano. Jak spojrzę kiedyś na iOS 8 powinno być jeszcze lepiej.  Mam tu na myśli możliwości samej platformy, ponieważ od początku używam najnowszego XCode z projektami na 8.1 i te rzeczy, o których piszę są wciąż obsługiwane.  Takie wędrówki przez historię ostatnich dwóch, trzech lat  są pożyteczne, pozwoli mi to spojrzeć na różne rzeczy w sposób bardziej świadomy. Przykładowo widziałem gdzieś .xib w Xamarin, teraz będę zainteresowany, czy wspiera też storyboard.

 

Objective-C

  • NSDate*, NSNumber*, NSDecimalNumber*
  • NSNumber, NSDecimalNumber
    • [x stringValue]
  • NSDecimalNumber
    • [NSDecimalNumber decimalNumberWithString: str];
  • NSNumberFormatter
    • [formatter numberFromString: str]
  • [x isKindOfClass: [NSNumber class]]
  • NSDictionary
    • [dict copy]

MVC

  • UIViewController
    • view
      • addSubview
  • UIWindow (self.window w AppDelegate) spodziewa się ustawienia propercji rootViewController
    • zwykle jest to ustawiane przez Storyboard
    • old school: ustawianie w kodzie w AppDelegate
  • w nadpisanej metodzie drawRect w view:

CGContextBeginPath(context);

CGContextAdRect(context, self.bounds);

CGContextFillPath(context);

  • Storyboard
    • więcej możliwości, bardziej funkcjonalny designer (np. zoom!)
    • więcej niż jeden view controller
      • przeciągamy drugi view kontroler z narzędzi do designera (pierwszy już jest w nim)
      • na jednym z kontrolerów przeciągamy przycisk
      • przycisk łączymy z widokiem drugiego kontrolera (wybieramy np. present modally)
      • możliwość wyboru rodzaju tranzycji między ekranami
      • po odpaleniu naciśniecie przycisku spowoduje zmianę widoku na ten drugi
      • na drugim widoku umieszczamy przycisk, który łączymy z exit ekranu i pozwala wybrać nam przygotowaną wcześniej w kodzie kontrolera akcję
      • możemy teraz po odpaleniu aplikacji wracać z drugiego ekran na pierwszy
    • można też łączyć z plikami .xib
  • layout widoków - dwa sposoby
    • springs and struts - prosty system do dodania możliwości rozciągania lub pozycjonowania widoków w oparciu o zmiany w layout
    • auto-layout - oparty na wymuszaniu system layoutu
      • nowsza technologia (domyślnie od iOS6 spring & struts layout jest tłumaczony w runtime na auto-layout)
      • domyślnie włączony od XCode 5
      • zaznaczamy element w drzewie wizualnym designera
      • definiujemy constraint-y poprzez Editor –> Pin –> Width i to samo dla Height (np. wartości minimalne, maksymalne lub równe)
      • wyrównujemy element np. Editor –> Align –> Horizontal Center in Container
      • brakujące warunki - okno dialogowe w XCode, wybieramy Update Frame
      • ustawiamy element wertykalnie poprzez Editor –> Pin –> Bottom Space to Superview
  • w designerze można wybrać rodzaj ekranu do podglądu

         Obsługa storyboard w view kontrolerze:

  -(IBAction) goBackToFirst: (UIStoryboardSegue*) sender {

  }

Capture4

Plusy:

  • w pełni deklaratywna nawigacja między ekranami z doborem tranzycji!
  • wreszcie mamy elastyczny layout ze środkowaniem lub podawaniem położenia względem np. góry czy dołu

Minusy:

  • przykładowo wyśrodkowanie przycisku w pionie i poziomie przycisku wymaga wielu czynności w XCode:
    • zdefiniowania warunków na długość i szerokość
    • wycentrowanie w poziomie
    • naprawienie problemów z layoutem
    • wycentrowanie w pionie
    • naprawienie problemów z layoutem

Wersje

  • przed zmianą docelowej wersji z iOS 7 na 6.1 trzeba zmienić architekturę projektu na wersję bez 64-bit
  • widok w iOS 7 zajmuje cały ekran, także na pasku systemowym (w iOS 6 pasek systemowy jest czarny)

 

Widoki na dane

  • UITableView
    • lista pionowa
    • predefiniowany layout komórek
  • UICollectionView
    • elastyczny layout
    • nie ma predefiniowanego layoutu komórek
      • “wrappanel” (elementy układane horyzontalnie obok siebie i przenoszone do następnych wierszy)
      • po okręgu
    • od iOS 6

Brak komentarzy: