Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
Software
Programování pro iOS - 20. Co nového v iOSu
15. prosince 2010, 00.00 | Už dávno jsme se v redakci domluvili, že jakmile bude iOS 4 veřejně k dispozici pro celou řadu zařízení Apple, podíváme se na jeho novinky z pohledu programátora.
Povídáním o gesture recognizerech jsme se poprvé v této části našeho programátorského seriálu dostali k poměrně zásadnímu API, které je dostupné jen v některé z novějších verzí systému (ačkoli zrovna recognizery jsou k dispozici už od 3.2, a psát aplikace, podporující iOS 3.1, už pomalu, až na konkrétní výjimky, přestává mít smysl).
Za "novinky" budeme pro tentokrát považovat to, co nebylo k dispozici v iOS 3.1 nebo starších. Budeme se také zabývat jen významnými samostatnými bloky služeb; drobná rozšíření – např. to, že od verze 3.2 je k dispozici třída UIBezierPath, že už od této verze lze obsah rámců ukládat do PDF apod. – si popisovat nebudeme.
Gesture recognizery
Jen pro úplnost se zmíníme o gesture recognizerech – těmi jsme se samozřejmě detailně zabývali v minulých dílech našeho seriálu a víme, k čemu slouží; víme také, že jsou novinkou verze 3.2.
Nové služby GUI pro iPad
Vzhledem k tomu, že iOS 3.2 byl první verzí podporující iPad s jeho velkou obrazovkou, není divu, že zde nalezneme několik nových prvků grafického uživatelského rozhraní, zaměřených právě na ni; na iPhone – byť i s novější verzí operačního systému – tyto služby buď nejsou použitelné vůbec, nebo jen velmi omezeně:
• Plovoucí okna, tzv. "pop-overs": ačkoli po technické stránce bylo vždy možné sestavit "okénko", které "se vznáší" nad pozadím obrazovky, nepřekrývá je celé, a obsahuje nějaký samostatný prvek GUI – typickým příkladem zde může být třeba seznam zpráv v aplikaci Mail, je-li iPad držen vertikálně –, bylo to vždy také poměrně náročné. Zatímco na iPhone je podobných případů málo, na iPadu jsou zcela běžné. Není proto divu, že iOS 3.2 přinesl velmi pohodlnou a standardní podporu pro takovéto prvky.
• Řídicí objekt pro dva samostatné objekty, tzv. "split view". Zde musíme malinko předběhnout: v následujících dílech našeho seriálu se budeme podrobně věnovat řídicím objektům rámců (tedy práci s třídou UIViewController a jejími dědici); kromě jiného uvidíme, že z řady dobrých důvodů normálně v podstatě není možné umístit rámce, řízené dvěma různými řídicími objekty, na obrazovku zároveň vedle sebe – vždy musí být právě jeden UIViewController aktuální, a jeho rámce musí překrýt celou obrazovku. Řešením této situace je třída UISplitViewController – ta je speciálně uzpůsobena k tomu, aby v ní bylo možné zobrazit rámce, řízené dvěma různými řídicími objekty, zároveň vedle sebe – a aby vše korektně fungovalo.
Na obě novinky se také podíváme v našem seriálu podrobně, a to hned po popisu řídicích objektů rámců.
Vstupní rámce
Speciální podporu nalezneme v iOSu pro rámce, jež obsahují nějaké specifické vstupní prvky – jejich typickým a archetypálním příkladem samozřejmě je klávesnice, která se automaticky zobrazí kdykoli je objekt, požadující vstup textu, právě aktivní (tj. je právě "prvým responderem").
Zatímco až do verze 3.1 byla klávesnice jediným takovýmto rámcem a navíc jsme do jejího použití systému nemohli moc "mluvit", od verze 3.2 nahoru můžeme definovat vstupní rámce libovolně, a můžeme je také libovolně přiřazovat prvkům GUI.
Za zběžnou zmínku zde možná stojí také to, že klávesnici samotnou můžeme rozšiřovat o vlastní ovladače ("accessory").
Práce s textem
Mnohem bohatší možnosti máme od verze 3.1 výše pro práci s textem: k dispozici jsou služby (bohužel neobjektového) frameworku CoreText; navíc mohou aplikace obsahovat a používat vlastní písma.
Sdílení souborů
Firma Apple kromě jiného pochopila také to, že naprosté vzájemné odstínění všech aplikací a faktická nemožnost spolupráce mezi nimi jsou neudržitelné; od verze 3.2 nahoru je proto k dispozici podpora pro sdílení souborů mezi aplikacemi a také mezi aplikací v zařízení s iOS a stolním počítačem:
• Programátor má k dispozici třídu UIDocumentInteractionController, která umožňuje libovolný soubor předat jiné aplikaci (navíc je možné jej otevřít ve standardním okně náhledu – tuto službu ale od iOS 4 nabízí v lepší podobě nový framework QuickLook –, a v iOS 4.2 dokonce třeba i vytisknout). Ačkoli služby této třídy jsou velmi omezené – např. nelze vůbec předem zjistit, zda bude možné nějak se souborem pracovat: prostě se to musí zkusit, a buď to půjde (takže uživatel uvidí nabídku možností), nebo ne –, oproti situaci ve verzi 3.1 a starších jde o velký pokrok.
• Aplikace může prostřednictvím položky CFBundleDocumentTypes v souboru Info.plist deklarovat typy souborů, s nimiž dokáže pracovat. Kdykoli pak někdo použije služby třídy UIDocumentInteractionController, dostane automaticky právě seznam aplikací, jež takto deklarovaly "zájem" o soubory patřičného typu, a soubor lze předat kterékoli z nich.
• Konečně pak prostým vložením klíče UIFileSharingEnabled do souboru Info.plist zajistíme, že uživatel bude mít z aplikace iTunes přístup do složky Documents naší aplikace, a bude moci do ní ukládat nebo z ní načítat jednotlivé soubory. I tato služba je nepříjemně omezena: už sám fakt, že přístup probíhá prostřednictvím aplikace iTunes a nikoli prostřednictvím Finderu, je naprosto absurdní; kromě toho nelze skoro vůbec pracovat se složkami.
Multitasking
Multitasking jako takový samozřejmě iOS plně podporuje hned od první verze. Bohužel, vždy bylo – a dosud je, i v nejnovější 4.2 – jeho praktické využití v aplikacích, které píše kdokoli jiný než sama firma Apple, podrobeno řadě limitů a omezení.
Až do verze 3 jedním z nejzásadnějších bylo to, že 3rd party aplikace musela v podstatě povinně běžet na popředí: přesně řečeno, jakmile aplikace opustila obrazovku a přesunula se na pozadí, dostala k dispozici jen velmi krátký čas pro případné uložení změn – a pak byla násilně ukončena. Když s ní chtěl uživatel znovu pracovat, musela být znovu spuštěna od začátku.
Dokonce i u Apple ale pochopili, že takhle to opravdu nejde, a v iOS 4 s velkou pompou "zavedli multitasking"; v zásadě to znamená, že
• jakmile aplikace opustí obrazovku a přesune se na pozadí, dostane k dispozici jen velmi krátký čas pro případné uložení změn – a pak je násilně suspendována: neběží tedy a nemůže vůbec nic dělat, ale není ukončena, a její nová aktivace je daleko rychlejší než případné nové spuštění. Přesto ale je rozdíl oproti iOS 3 z praktického hlediska celkem zanedbatelný;
• doba běhu na pozadí může být pomocí specifického API mírně (ale ne moc) prodloužena;
• v některých specifických situacích si suspendovaná aplikace může vyžádat, aby byla na pozadí automaticky "buzena" pro zpracování nějaké jasně definované události – např. zpracování změny polohy u navigačních aplikací, nebo pro možnost přehrávání audia.
Aplikace může ukládat do systému požadavky na takovéto "probuzení" i programově; jde o tzv. lokální notifikace. Je zde ale háček: dříve, než je lokální notifikace předána aplikaci, uživatel to musí explicitně potvrdit pomocí speciálního okénka. Není tedy dost dobře možné např. implementovat plnohodnotný budík apod.
Bloky a GCD
Od verze 4 nahoru je také možné při programování v iOSu využívat bloků – to je natolik významné, že to stojí za samostatný odstaveček. My jsme si bloky popsali v našem seriálu už poměrně dávno.
Také je od této verze nahoru k dispozici technologie Grand Central Dispatch: dosud jsme se na ni podrobně nedívali, ale jde o velmi pohodlné API pro práci se zároveň běžícími úseky kódu ("multithreading").
Píšeme-li už o novinkách, přinášejících pohodlí programátorům, můžeme se zmínit o tom, že od verze iOS 4.2 nahoru je velmi pohodlné ověření, zda je některá z nových tříd či funkcí k dispozici nebo ne – tzv. "weak linking". V podstatě libovolný framework můžeme (přímo v Xcode) označit jako "weak"; v takovém případě jsou všechny jeho symboly k dispozici i ve starších systémech, kde fakticky neexistovaly – ale jejich hodnotou je 0. V praxi to znamená, že pokud pracujeme s některou s nových tříd, nemusíme již zkoušet, zda "NSClassFromString(jméno-třídy)" vrátí třídu nebo ne; můžeme ji použít rovnou, protože libovolná zpráva zaslaná třídě – např. class nebo alloc nebo sharedXxxx – vrátí nil.
Přístup k dalším prvkům systému
Dalšími novinkami verze 4 jsou služby, zpřístupňující aplikacím
• údaje uložené v kalendáři prostřednictvím frameworku EventKit;
• údaje souvisící s telefonováním prostřednictvím frameworku CoreTelephony (ale stále není možné – a mimo jailbreak asi nikdy nebude – hovory programově bez přímé asistence uživatele přijímat, odmítat nebo zahajovat);
• fotografie a videa, uložená v aplikaci Photos, prostřednictvím frameworku AssetsLibrary;
• standardní náhledy prostřednictvím již výše zmíněného frameworku QuickLook;
• údaje z pohybových čidel prostřednictvím frameworku CoreMotion;
• inzerci Apple prostřednictvím frameworku iAd – s trochou zjednodušení v podstatě do aplikace umístíme jen místo pro inzerát; Apple si je vyplní čím chce, a pak nám za to pošle peníze;
• od iOSu 4.1 nahoru nabízí Apple přístup k vlastní herní sociální síti Game Center – jež obsahuje služby pro vzájemné vyhledávání hráčů, sdílení skóre apod. – prostřednictvím služeb knihovny GameKit;
• od verze 4.2 nahoru máme k dispozici přístup k zařízením MIDI prostřednictvím frameworku CoreMIDI.
Nové výkonné knihovny
Vedle nových frameworků pro přístup k různým systémovým prvkům přinesl iOS 4 také řadu nových knihoven, nabízejících řadu často potřebných služeb. Sem patří
• framework Accelerate, který obsahuje optimalisovaný kód pro rozsáhlé numerické výpočty s využitím hardwarové podpory na tom kterém zařízení;
• frameworky CoreVideo, CoreMedia, ImageIO a AVFoundation, jež nabízejí bohaté multimediální služby pro práci se zvukem, grafikou a videem.
Tisk
Možnost tisku je asi hlavní novinkou iOS 4.2 (spolu s možností streamování AirPlay, která nám ani za samostatný odstavec nestojí).
Moment... a jak že je to s tím kreslením čar?
Na konci minulého dílu jsme si řekli, že využití recognizeru UIPanGestureRecognizer pro kreslení přináší jednu drobnou nevýhodu – a slíbili jsme si, že si dnes ukážeme, jak se jí vyhnout.
Problém je v tom, že tento recognizer je určen pro "posunování" obsahu okna nebo objektů v něm; není proto zapotřebí (ba ani žádoucí), aby přesně identifikoval místo, v němž gesto začalo – a odlišil je od místa, v němž bylo interpretováno jako tažení. To druhé je samozřejmě o několik pixelů dál; pokud jste si vyzkoušeli implementaci podle minulého dílu, viděli jste, že když se pokusíte táhnout čáru přesně z nějakého bodu, je tam na začátku vynechané místo – přesně ten krok, který recognizer potřebuje k tomu, aby mohl říci "toto je tažení". Ve chvíli, kdy recognizer pošle akci ve stavu UIGestureRecognizerStateBegan, je už prst o něco dále!
Existuje několik možností, jak problém řešit; asi nejjednodušší zároveň ukáže, že je možné vzájemně kombinovat recognizery s "klasickými" metodami – mohlo by to vypadat asi nějak takto:
...
-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)evt {
start=[[touches anyObject] locationInView:self.view];
}
-(void)dragged:(UIPanGestureRecognizer*)pgr {
/*if (pgr.state==UIGestureRecognizerStateBegan)
start=[pgr locationInView:self.view];
else*/ if (pgr.state==UIGestureRecognizerStateChanged) {
current=[pgr locationInView:self.view];
... vše při starém ...
}
V této variantě metoda touchesBegan:withEvent: zaznamená přesný začátek tahu – a dále již se o jeho interpretaci stará recognizer.
Obsah seriálu (více o seriálu):
- Nastal čas na kakao...
- Tak nejdřív kakao ochutnáme...
- Programovací jazyk C: velmi, velmi stručně
- Objective C: to si vysvětlíme podrobněji
- Co jsme si o Objective C ještě neřekli...
- Nastal čas na kakao - Vznik a zánik objektů
- Nastal čas na kakao - Kopírování objektů
- Nastal čas na kakao - Skryté podtřídy
- Nastal čas na kakao - Základní služby objektů
- Nastal čas na kakao - Jak správně psát v Objective C
- Nastal čas na kakao - Jak správně importovat
- Nastal čas na kakao - Podtřídy, delegáti, vkládání, jak se to rýmuje?
- Nastal čas na kakao - Využití kategorií namísto dědičnosti
- Nastal čas na kakao - Vkládání objektů a přesměrování zpráv
- Nastal čas na kakao - Inicializace a rušení objektů
- Nastal čas na kakao - Metody initWith... a designovaný inicializátor
- Nastal čas na kakao - Inicializace: tipy a triky
- Nastal čas na kakao - Accesory: přístup k proměnným instancí
- Nastal čas na kakao - Šedá je teorie, zelený je strom života...
- Nastal čas na kakao - Více o XCode: inspektory
- Nastal čas na kakao - Aplikace RSS2: datový model
- Nastal čas na kakao - Aplikace RSS: implementace datového modelu
- Nastal čas na kakao - Aplikace RSS: parsování XML
- Nastal čas na kakao - Interface Builder a uživatelské rozhraní
- Nastal čas na kakao - Interface Builder: atributy objektů
- Nastal čas na kakao - Interface Builder: atributy objektů
- Nastal čas na kakao - Druhý kontrolér a dokončení aplikace
- Nastal čas na kakao - Drobná vylepšení a zdokonalení...
- Nastal čas na kakao - Ladění
- Nastal čas na kakao - Třídy Foundation Kitu
- Nastal čas na kakao - Třídy Foundation Kitu (2)
- Nastal čas na kakao - Textové řetězce: NS(Mutable)String
- Nastal čas na kakao - Čísla, binární data a další...
- Nastal čas na kakao - Archivace objektů
- Nastal čas na kakao - Trocha magie, aneb distribuované objekty
- Nastal čas na kakao - Málem bychom zapomněli: NSAutoreleasePool
- Nastal čas na kakao - Zpracování výjimek: NSException
- Nastal čas na kakao - NSInvocation a černá magie
- Nastal čas na kakao - Kakao v Tygrovi
- Nastal čas na kakao - Notifikace: nepřímé předávání zpráv
- Nastal čas na kakao - NSUserDefaults
- Nastal čas na kakao - Co nového ve Foundation Kitu
- Nastal čas na kakao – s Intelem, s Intelem, jedeme do...
- Co nového v Xcode
- Začínáme s AppKitem
- Jak MVC v Kakau vypadá doopravdy?
- Jak MVC v Kakau vypadá doopravdy: dokončení
- Přehled tříd AppKitu
- Nastal čas na kakao - Přehled tříd AppKitu 2
- Přehled tříd AppKitu 3: zbývající třídy GUI
- Přehled tříd AppKitu 4: textový systém
- Nastal čas na kakao - Přehled tříd AppKitu 5: hlavně grafika
- Přehled tříd AppKitu 6: dokumentový systém
- Přehled tříd AppKitu 7: dokončení
- Pojmenované vlastnosti objektů
- Pojmenované vlastnosti objektů: implementace
- Pojmenované vlastnosti objektů: relace 1:N
- Pojmenované vlastnosti objektů: řazení jmen a agregační funkce
- Sledování změn objektů
- Sledování změn objektů – ukázka
- Sledování změn objektů – zdrojový kód
- Sledování změn objektů: kód modelu
- Sledování změn objektů: přímý přístup
- Kontroléry a vazby
- Vázání vazeb
- Další vazby s jednoduchým kontrolérem
- Implementace a použití převodu hodnot
- Validace hodnot
- Validace a chyby, a jedna hezká vazba...
- Práce s polem objektů
- Základní vazby NSArrayControlleru
- Převodníky, přepínače, placeholdery
- Mírná vylepšení v mezích zákona
- Objective C 2.0 - novinky z Leoparda
- NSTreeController
- Programování v Cocoa - Pár tipů a triků
- Programování v Cocoa - Základy kreslení
- Kterak nakreslit modrý obdélník...
- Další služby pro kreslení
- Obrázky a písmenka...
- Události a myš
- Lepší práce s myší
- Události klávesnice
- Input Management
- Příkazy a schránka
- Další události
- Táhni a padni
- Byli jsme na tahu; nyní padneme.
- Zvolme si, jak vhodit
- Drobnosti a chybičky
- Speciální případy tahání či házení
- Kterak táhnout něco, co neexistuje?
- Jak na sítě...
- NSURLConnection
- Safari za minutu
- Služby WebKitu
- Kakao v Leopardu
- Druhé Objective C
- Druhé Objective C: různé drobnosti
- Druhé Objective C: kategorie a protokoly
- Druhé Objective C: nový příkaz cyklu
- Druhé Objective C: atributy a accesory
- Druhé Objective C: atributy a accesory
- 64 je dvakrát 32
- Ubicumque dulce est, ibi et acidum invenies...
- Irbis: že prý žádné novinky?
- Blok sem, blok tam, nám už je to všechno jasné...
- Bloky jsou i v AppKitu
- Irbis a Foundation Kit
- Kde jsou má data?
- Kde jsou má data? V NSCache!
- Soubor, jméno, URL, jak se to rýmuje...
- Další podpora NSURL
- Zabíjení!
- A máme tady i...OS!
- Systémové prvky GUI
- Programování pro iOS 1. díl - Rozdíly mezi "i" a "Mac"
- Programování pro iOS - 2. Začínáme programovat
- Programování pro iOS - 3. základní ovladače a propojení GUI s kódem
- Programování pro iOS - 4. Varovná hlášení
- Programování pro iOS - 5. Rámce a jejich řídicí objekty
- Programování pro iOS - 6. Ukládání dat
- Programování pro iOS - 7. Správa paměti a starý restík
- Programování pro iOS - 8. Dokončení aplikace
- Programování pro iOS - 9. Jak dostat aplikaci do iPhone
- Programování pro iOS - 10. Instalace aplikace do cizího iPhone
- Programování pro iOS - 11. Jak dostat aplikaci do libovolného iPhone
- Programování pro iOS - 12. Touching!
- Programování pro iOS - 13. Kreslíme na iPhone
- Programování pro iOS - 14. Udělejme gesto
- Programování pro iOS - 15. Další gesta
- Programování pro iOS - 16. Více prstů, více zábavy
- Programování pro iOS - 17. Podpora standardních gest
- Programování pro iOS - 18. Recognizery v iOS
- Programování pro iOS - 19. Další standardní recognizery
- Programování pro iOS - 20. Co nového v iOSu
- Programování pro iOS - 21. "Multitasking"
- Programování pro iOS - 22. Nulla est honesta avaritia nisi temporis
- Programování pro iOS - 23. Jak se aktivovat, jsme-li v pozadí
- Programování pro iOS - 24. Zbývající drobnosti
- Programování pro iOS - 25. Řídicí objekty rámců
- Programování pro iOS - 26. Jak se dělá UIViewController
- Programování pro iOS - 27. Kde vzít rámce
- Programování pro iOS - 28. Základní služby
- Programování pro iOS - 29. Práce s rámci
- Programování pro iOS - 30. Rotace zařízení
- Programování pro iOS - 31. Správa paměti v rámcích
- Programování pro iOS - 32. Řídicí objekt pro tabulky
- Programování pro iOS - 33. Řídicí objekt pro strom
- Programování pro iOS - 33. Více o UINavigationControlleru
- Programování pro iOS - 35. Ještě jednou UINavigationController
- Programování pro iOS - 36. Po navigátoru taby
- Programování pro iOS - 37. Více o UITabBarControlleru
- Programování pro iOS - 38. Dokončení UITabBarControlleru
- Programování pro iOS - 39. UIPopoverController
- Programování pro iOS - 40. Další triky UIPopoverControlleru
- Programování pro iOS - 41. Zbývající služby UIPopoverControlleru
- Programování pro iOS - 42. UISplitViewController
- Programujeme v
iTunesXcode 4 - Programování pro iOS - 44. Předvolby Xcode 4
- Programování pro iOS - 45. Práce v Xcode 4
- Xcode 4: projekt a cíle
- Xcode 4: práce s cíli
- Xcode 4: Build Settings
- Xcode 4: Build Phases
- Xcode4: Build Phases podruhé
- Xcode 4: Co jsou to Build Rules?
- Xcode4: taje editoru
- Xcode4: automatické doplňování v editoru
- XIBy chyby
- Více o XIBech
- Editor XIBů
- Inspektory pro XIBy
- Vazby mezi objekty v XIBech
- Vazby mezi objekty v kódu
- Paletky Xcode pro XIBy
- Xcode 4: levý sloupec
- Xcode 4: okno Organizer
- Xcode 4: okno Organizer, část druhá
- Xcode 4: co je to Workspace?
- Xcode 4: základy schémat
- Xcode 4: akční schémata