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:
Prześlij komentarz