piątek, 9 stycznia 2015

iOS, a co to jest - odcinek dziesiąty: iOS 7

Post zbierający wprowadzone funkcjonalności w wersji siódmej iOS (2013 rok). Ogólnie - jak dla mnie - szału nie było poza pewnymi wyjątkami, niektóre rzeczy wydają się wprowadzone nawet dość późno na tle Windows Phone /Windows (np. transfer plików w tle był już w Windows Phone w 2010 roku) lub wydają się mniej uniwersalne (np. ukrywanie klawiatury przy scrollowaniu czy kolorowanie pasków).  Do czego chciałbym się ustosunkować ? Znajdzie się kilka zagadnień. Oto one:

  • lekkie echa z Modern UI: uproszczenie wyglądu, największy nacisk na content, chrome w odwrocie (do Modern UI nie pasują jednak przezroczystości i pół-przezroczystości, efekty 3d, pickery wyświetlane inline)
  • ciekawostką wydaje się tryb renderowania obrazków na podstawie warstw przezroczystości, z pominięciem kolorystyki obrazka i z użyciem koloru tint, tak by dopasować się do reszty UI
  • możliwość implementacji funkcjonalnego odpowiednika zachowania kontrolki SemanticZoom z Windows 8.x w oparciu o animowane zmiany w layout CollectionView
  • obsługa ruchu urządzenia (w Windows bardziej ogólne API do sensorów związanych z ruchem też jest)
  • Dynamics - zbiór fizycznych zachowań np. grawitacji, kolizji, z pewnością ułatwi to tworzenie prostych gier (tutaj kojarzy mi się rok 2009, kiedy wprowadzono zachowania w Blend i zrobiono demo budowy prostej gry w deklaratywny sposób z przygotowanych wcześniej zachowań, jednak nic takiego nie trafiło do standardowego API platformy Windows)
  • praca w tle - trochę dziwne, że zdecydowano się uzależnić w iOS 7 pracę w tle od tego, czy aplikacja jest w pamięci (za wyjątkiem transferu w tle), ładowanie danych w tle ideowo kojarzy mi się trochę z prefetchingiem w Windows 8.1, choć mamy inny nieco sposób realizacji (interesujące jest też automatyczne odświeżanie screenshotu z aplikacji w oknie przełączania między aplikacjami). Zdalne notyfikacje przypominają nieco znane mi do tej pory zdalne notyfikacje (przy zachowaniu pewnych różnic np. flagi do uruchomienia aplikacji przed wyświetleniem notyfikacji w Windows nie ma). Transfer w tle z uniwersalną infrastrukturą będącą alternatywą także dla zwykłej komunikacji sieciowej wydaje mi się trochę przekombinowany, ale ujdzie.
  • “Assets Catalog” w XCode na zasoby graficzne wydaje się niezłym pomysłem (chociaż używanie konwencji nazw w plikach nie wydaje mi się piekłem)
  • interesująca jest możliwość podglądu widoku w wybranej wersji systemu operacyjnego

 

iOS 7

Zasadnicze zmiany

  • pierwszy duży redesign iOS
  • redesign wbudowanych aplikacji (Mail, Safari, Photos, itd.)
  • mnóstwo udogodnień (w multitaskingu, komunikacji sieciowej, itd.)

Właściwości UI

  • chrome w odwrocie, najważniejsza zawartość, najwięcej miejsca dla niej (np. w TableView)
  • przejrzystość i łatwość użycia
  • głębia
    • rozmycia, przezroczystość, dynamiczne efekty 3d

Widoki

  • aplikacja zajmuje pełny ekran
  • pasek statusu jest rysowany nad powierzchnią widoku
    • większa kontrola z poziomu UIViewController
      • możliwość nadpisania propercji preferredStatusBarStyle
      • metoda setNeedsStatusBarAppearanceUpdate (przy wywołaniu w bloku animacji zmiany będą animowane)
      • prefersStatusBarHidden (domyślnie NO, powiązanie z preferredStatusBarStyle)

- (void) viewDidLoad  {

         [self setNeedsStatusBarAppearanceUpdate];

         [super viewDidLoad];

}

- (UIStatusBarStyle) preferredStatusBarStyle {

          return UIStatusBarStyleLightContent;   //białe napisy

}

//jak umieścimy te metody w klasie rozszerzającej navigation controller, to będzie to dziedziczone na obsługiwanych przez niego kontrolerach

W pblist projektu dodajemy wpis:  View controller-based status bar = YES

  • paski nawigacji i zakładek
    • są przezroczyste / półprzezroczyste
    • zmiana tła za pomocą barTintColor (tintColor nie daje takiego efektu jak kiedyś)
    • inne rozmiary
  • pasek nawigacji
    • półprzezroczysty
    • możliwość zmiany backIndicatorImage
      • backIndicatorTransitionMaskImage używany podczas tranzycji push i pop
    • displaysSearchBarInNavigationBar - umieszcza pasek wyszukiwarki w pasku nawigacji zamiast nad TableView
  • toolbar (przy opcji Shows Toolbar)
    • także półprzezroczysty i rysowany nad widokiem
  • sterowanie wjeżdżaniem zawartości ekranu po paski
    • opcje Extended Edges: Under Top Bars, Under Bottom Bars, Under Opaque Bars
  • kolory są wskazówką dla użytkownika
    • tintColor w klasie bazowej UIView
      • wcześniej tylko na paskach
      • na interaktywnych elementach (co jest klikalne, dotykalne itp.)
      • każda aplikacja może mieć własny
      • domyślnym kolorem w iOS 7 jest niebieski
    • automatycznie dziedziczony przez podwidoki
    • action sheets eksponują kontrolki

Zmiany w kontrolkach

  • modyfikacja rozmiarów większości kontrolek
  • szybka migracja z iOS6, jeśli używany był autolayout
  • przyciski nie mają obramowań ani krawędzi
    • nowy domyślny typ przycisku UIButtonTypeSystem
    • TintColor używany do ustawienia kolorów normal i selected
  • TableView
    • w trybie grupowania komórki są rozciągane do krawędzi (większe odstępy między sekcjami, ciemniejsze tło)
    • podświetlane komórki - szary zamiast niebieskiego, selectedBackgroundView
    • separatory są wstawiane
    • możliwość podania szacowanej wysokości przed załadowaniem komórek
  • UIScrollView
    • propercja keyboardDismiss
      • UIScrollViewKeyboardDismissModeOnDrag - przy formularzu w scroll view przewijanie wyłącza klawiaturę
  • wszystkie pickery wyświetlane są inline

UIImage

  • sposób renderowania obrazków obsługiwany przez UIKit
    • metoda imageWithRenderingMode
      • UIImageRenderingModeAlwaysTemplate  - obrazek traktowany jak szablon (kolory są ignorowane, uwzględniane są kanały przezroczystości, tintColor)
      • UIImageRenderingModeAlwaysOriginal
      • UIImageRenderingModeAutomatic (domyślnie) - użycie szablonu zależy od kontekstu

UIActivity

  • nowe typy aktywności
    • UIActivityTypeAddToReadingList
    • UIActivityTypePostToFlickr
    • UIActivityTypePostToVimeo
    • UIActivityTypePostToTencentWeibo
    • UIActivityTypeAirDrop
  • nowy enum: UIActivityCategory
    • UIActivityCategoryShare - Facebook, Twitter, itp.
    • UIActivityCategoryAction - AirDrop

Typografia

  • większa dynamika czcionek
  • style tekstu (w tym obsługa transformacji)
  • wysoka dostępność (zmiana wielkości czcionki przez użytkownika, wysoki kontrast)
  • Text Kit - nowy framework, bazuje na OSX Cocoa Text

Animacje

  • dużo nowych animacji dla tranzycji widoków
  • wymowne, nie gratisowe
    • odzwierciedlają przepływ w aplikacji (np. photos i calendar)
  • otwarcie w API kontroli nad animacjami podczas tranzycji między kontrolerami
    • nowe metody “animate with” umożliwiają używanie zarówno wbudowanych animacji, jak i własnych
    • własne tranzycje - implementacja UIViewControllerTransitioningDelegate
  • możliwość wyłączenia potencjalnych animacji
    • [UIView performWithoutAnimation] - przyjmuje blok, który gwarantuje wykonywanie bez animacji
  • CollectionViews
    • możliwość animowania zmian layoutu wewnątrz CollectionView
      • nowa metoda ma blok completion
    • możliwość customizacji tranzycji pomiędzy layoutami za pomocą podklasy UICollectionViewTransitionLayout
    • możliwość koordynacji zmian w layout przez kontroler nawigacji
      • useLayoutToLayoutNavigationTransitions musi być ustawione na NO w bieżącym kontrolerze kolekcji
      • useLayoutToLayoutNavigationTransitions musi być ustawione na YES na otwieranym kontrolerze kolekcji

zoom-in, zoom-out na kolekcji:

zoomedInLayout = [[UICollectionViewFlowLayout alloc] init];

zoomedInLayout.itemSize = CGSizeMake(120, 120);

zoomedInLayout.sectionInset = UIEdgeInsetsMake(10, 5, 0, 5);

[self.collectionView addGestureRecognizer: gestuer];

…  //obsługa gestów pinch i stretch

[self.collectionView reloadData];

[self.collectionView setCollectionViewLayout: zoomedInLayout  animated: YES  completion: ^(BOOL finished) {

}];

… //obsługa CollectionView  przypominająca trochę obsługę TableView

Ruch

  • system jest świadomy umiejscowienia i przemieszczania urządzenia w przestrzeni
    • Springboard - efekt paralaksy
  • alerty się przemieszczają wraz ze zmianą położenia
    • Safari - wielostronicowe widoki
  • UIMotionBehavior - główna klasa w nowym API
  • efekty ruchu
    • klasa bazowa UIMotionEffect
      • tworzenie własnych efektów w klasach pochodnych
      • przekazujemy UIOffset - wertykalny/horyzontalny offset ruchu urządzenia
    • UIInterpolatingMotionEffect - zamiast dziedziczenia
      • dodawanie do każdego UIView - addMotionEffect
      • nowa propercja motionEffects - jakie efekty są zaaplikowane do widoku
      • removeMotionEffect - usuwanie widoku
    • UIMotionEffectGroup - kolekcja efektów
      • [UIView addMotionEffect] - możliwość dodania

przykładowe dodanie ruchu:

UIInterpolatingMotionEffect* xmotion = [[UIInterpolatingMotionEffect alloc]

        initWithKeyPath: @”center.x”  type:

        UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis];

xmotion.maximumRelativeValue = [NSNumber numberWithFloat: 20.0];

xmotion.minimumRelativeValue = [NSNumber numberWithFloat: –20.0];

//podobnie ymotion

UIMotionEffectGroup* group = [[UIMotionEffectGroup alloc] init];

group.motionEffects = @[xmotion, ymotion];

[self.collectionView addMotionEffect: group];

Dynamics

  • możliwość odsłonięcia kamery na lock screen
    • zetknięcie się z dołem ekranu
    • symulowana waga
  • przewijanie wiadomości pod palcem
  • implementacja za pomocą UIDynamics
    • fizyczny engine wbudowany w UIKit
  • tworzenie zachowania
    • konfiguracja z elementami do animowania
    • dodanie tego do widoku
  • wbudowane zachowania
    • UIAttachmentBehavior - łączy dwa widoki ze sobą
    • UICollisionBehavior - modeluje kolizję między widokami lub granicami
    • UIGravityBehavior - modeluje grawitację: 1000 punktów/s2 zamiast 9.8 m/s2
    • UIPushBehavior - aplikuje siły do widoków
    • UISnapBehavior - snapuje do punktu
    • UIDynamicItemBehavior - dostęp do niskopoziomowych propercji elementu w Dynamics

UIDynamicAnimator* animator;

//opadnięcie na dół ekranu i lekkie odbicia przed ostatecznym zatrzymaniem

animator = [[UIDynamicAnimator alloc] initWithReferenceView: self.view];

UIGravityBehavior* gravity = [UIGravityBehavior alloc] initWithItems:  @[labelView];

UICollisionBehavior* collision = [[UICollisionBehavior alloc] initWithItems: @[labelView]];

collision.translatesReferenceBoundsIntoBoundary = YES;

UIDynamicItemBehavior* dynamic = [[UIDynamicItemBehavior alloc] initWithItems: @[labelView]];

dynamic.elasticity = .7;

[animator addBehavior: dynamic];

[animator addBehavior: gravity];

[animator addBehavior: collision];

Przywracanie stanu

  • możliwość rejestracji obiektów do bycia częścią przywracanego stanu
    • [UIApplication registerObjectForStateRestoration:  restorationIdentifier: ]
      • implementacja protokołu UIStateRestoration
  • przechwytywanie snaphotów
    • iOS 7 używa snapshotu przy uruchamianiu
    • ignoreSnapshotOnNextApplicationLaunch

Adaptatywny multitasking

  • nowe UI prezentujące uruchomione aplikacje
  • aplikacja może aktualizować UI w tle dzięki nowym właściwościom notyfikacji i transferu w tle
    • w nowym UI system robi wizualny snaphot aplikacji
  • wrażenie ciągłego wykonywania się aplikacji
    • background fetch
    • remote notifications
    • background transfer service

iCloud

  • największe do tej pory ulepszenie niezawodności i wydajności
  • testowanie w symulatorze
  • integracja z narzędziami debugującymi w XCode

Objective-C

  • moduły - bardziej efektywny sposób importu frameworków
    • @import (binarnie) zamiast #import (tekstowo)
    • automatyczny import innych modułów w razie potrzeby
  • instancetype - weryfikacja przez kompilator zwracanych wartości
  • jawnie typowane enum-y
  • poprawa szybkości ARC

XCode

  • “Asset Catalog” np. Images.xcassets
    • utrzymuje listę obrazków, w tym ikonę aplikacji i splash-screeny
    • dla każdego obrazka pokazywane są wszystkie rozdzielczości
    • nazwy nie są już istotne (do tej pory używano w nazwach plików konwencji nazewniczych dla retiny - np. Default@2x.png i różnych rozdzielczości np. Default-586@2x.png)
  • tylko LLVM (gcc już niedostępny)
  • podgląd .xib w różnych wersjach iOS i orientacjach ekranu
  • XCTest zamiast OCTest

Rozszerzenia frameworku

  • Store Kit - weryfikacja in-app purchases na urządzeniu lub serwerze
  • bezpieczeństwo - dostęp do iCloud keychain
  • Pass Kit - wiele przejść za jednym razem, lepsza kontrola
  • OpenGL ES - rozszerzenia
  • Message UI - dodawanie załączników
  • Map Kit - wsparcie dla map 3d i innych rozszerzeń
  • Audio Unit - miksowanie audio między aplikacjami

Nowe właściwości i frameworki

  • AirDrop - transfer plików pomiędzy urządzeniami w bliskiej odległości (NFC)
  • komunikacja peer-to-peer
  • framework JavaScript Core - dostęp do maszyny JavaScript z poziomu Objective-C
  • media - kontrola zamkniętych opisów
  • Safari Services - dodawanie url-i do listy odczytu
  • Sprite Kit - engine gier 2d
  • Game Controllers - abstrakcja używania kontrolerów do gier

Rzeczy usunięte

  • adresy UUID i MAC (deprecated), zamiast tego UIDevice.identifierForVendor

Wspieranie iOS6

  • możliwość obsługi iOS 6 i iOS7
  • zalecana jest stylizacja z iOS 7 (mimo innych kontrolek)

 

Ogólne uzupełnienia

przykładowe sharowanie:

UIActivityViewController* activity = [[UIActivityViewController alloc]

         initWithActivityItems: @[@”xxx”]  applicationActivities: nil];

[self presentViewController: activity animated: YES  completion: ^{

}];

proste odtworzenie dźwięku *.aif:

SystemSoundID soundID;

AudioServicesCreateSystemSoundID ((CFURLRef) CFBridgingRetain([NSURL fileURLWithPath:

         soundPath]), &soundID);

AudioServicesPlaySystemSound (soundID);

Brak komentarzy: