Sjednocené scénáře v Xamarin.iOS
IOS 8 obsahuje nový, jednodušší mechanismus pro vytvoření uživatelského rozhraní – sjednocené scénáře. Díky jedinému scénáři, který pokryje všechny různé velikosti hardwarových obrazovek, je možné rychlé a responzivní zobrazení vytvořit ve stylu "design-once, use-many".
Vzhledem k tomu, že vývojář už nemusí vytvářet samostatnou a konkrétní scénář pro zařízení iPhone a iPad, může flexibilně navrhovat aplikace se společným rozhraním a pak toto rozhraní přizpůsobit pro různé třídy velikostí. Tímto způsobem je možné aplikaci přizpůsobit silným stránekm jednotlivých provedení a každé uživatelské rozhraní je možné vyladit tak, aby poskytovalo co nejlepší prostředí.
Třídy velikostí
Před iOSem 8 vývojář používal a k rozlišení mezi režimy na výšku a na šířku a mezi režimy UIInterfaceOrientationUIInterfaceIdiom iPhone a iPad zařízeními. V iOSu 8 se orientace a zařízení určují pomocí tříd velikostí.
Zařízení jsou definována třídami velikostí ve svislých i vodorovných osách a v iOSu 8 existují dva typy tříd velikosti:
- Regular – tato vlastnost je buď pro velkou velikost obrazovky (například iPad), nebo pro zařízení, které má dojem na velkou velikost (například
- Kompaktní – jedná se o menší zařízení (například pro iPhone). Tato velikost bere v úvahu orientaci zařízení.
Pokud se tyto dva koncepty používají společně, výsledkem je mřížka 2 x 2, která definuje různé možné velikosti, které lze použít v obou různých orientacích, jak je vidět na následujícím diagramu:
Vývojář může vytvořit kontroler zobrazení, který používá libovolnou ze čtyř možností, které by vedlo k různým rozložením (jak je vidět na grafech výše).
iPad tříd velikosti
Třída iPad vzhledem k velikosti normální velikost třídy pro obě orientace.
iPhone tříd velikosti
Třída iPhone různé třídy velikosti na základě orientace zařízení:
- Když je zařízení v režimu na výšku, má obrazovka kompaktní třídu vodorovně apravidelně svisle.
- Když je zařízení v režimu na šířku, třídy obrazovek se převrácené z režimu na výšku.
iPhone 6 tříd velikosti Plus
Při orientaci na výšku jsou velikosti stejné jako u starších iPhonů, ale v orientaci na šířku se liší:
Protože iPhone 6 Plus má dostatečně velkou obrazovku, může mít třídu velikosti běžné šířky v režimu Na šířku.
Podpora nové škálování obrazovky
Obrazovka iPhone 6 Plus používá nový displej Retina HD s faktorem měřítka obrazovky 3,0 (třikrát vyšší než původní iPhone rozlišení obrazovky). Pro zajištění nejlepšího možného prostředí na těchto zařízeních zahr uveďte nová díla navržená pro tuto obrazovku. V Xcode 6 a vyšších mohou katalogy assetů obsahovat obrázky o velikosti 1x, 2x a 3x. Jednoduše přidejte nové prostředky obrázku a iOS zvolí správné prostředky při spuštění na iPhone 6 Plus.
Chování při načítání obrázků v iOSu také rozpozná @3x příponu u souborů obrázků. Pokud například vývojář do sady aplikací zabalí asset obrázku (v různých rozlišeních) s následujícími názvy souborů: , a MonkeyIcon.pngMonkeyIcon@2x.pngMonkeyIcon@3x.png . Na kartě iPhone 6 Plus se image použije automaticky, pokud vývojář načte MonkeyIcon@3x.png obrázek pomocí následujícího kódu:
UIImage icon = UIImage.FromFile("MonkeyImage.png");
Dynamické spouštěcí obrazovky
Během spouštění aplikace pro iOS se soubor spouštěcí obrazovky zobrazí jako úvodní obrazovka, aby uživateli poskytl zpětnou vazbu, že se aplikace skutečně spouští. Před iOSem 8 musí vývojář pro každý typ zařízení, orientaci a rozlišení obrazovky, na které by aplikace běžela, zahrnout Default.png několik obrázových prostředků.
S iOSem 8 může vývojář vytvořit v Xcode jeden atomický soubor, který pomocí automatického rozložení a tříd velikostí vytvoří dynamickou spouštěcí obrazovku, která bude fungovat pro každé zařízení, rozlišení .xib a orientaci. .xib Tím se nejen snižuje množství práce, kterou vývojář vyžaduje k vytvoření a údržbě všech požadovaných prostředků image, ale také zmenšuje velikost nainstalované sady aplikací.
Vlastnosti
Vlastnosti jsou vlastnosti, které lze použít k určení toho, jak se rozložení mění při změnách prostředí. Skládají se ze sady vlastností (a na základě ), a také idiomu rozhraní ( ) a HorizontalSizeClassVerticalSizeClassUIUserInterfaceSizeClassUIUserInterfaceIdiom měřítka zobrazení.
Všechny výše uvedené stavy jsou zabalené v kontejneru, na který Apple odkazuje jako na Trait Collection ( ), která obsahuje nejen vlastnosti, ale UITraitCollection také jejich hodnoty.
Prostředí vlastností
Prostředí vlastností jsou nové rozhraní v iOSu 8 a jsou schopná vrátit kolekci vlastností pro následující objekty:
- Obrazovky (
UIScreens). - Windows (
UIWindows). - Kontrolery zobrazení (
UIViewController). - Zobrazení (
UIView). - Prezentační kontroler (
UIPresentationController).
Vývojář používá kolekci vlastností vrácenou prostředím trait k určení způsobu, jakým by mělo být rozloženo uživatelské rozhraní.
Všechna prostředí vlastností tvoří hierarchii, jak je znázorněno v následujícím diagramu:
Kolekce vlastností, kterou má každé z výše uvedených prostředí, bude ve výchozím nastavení tok z nadřazeného do podřízeného prostředí.
Kromě získání aktuální kolekce vlastností má Prostředí vlastností metodu , kterou je možné přepsat v podtřídách Zobrazení nebo TraitCollectionDidChange Kontroler zobrazení. Vývojář může tuto metodu použít k úpravě libovolného prvku uživatelského rozhraní, které závisí na vlastnostech, pokud se tyto vlastnosti změnily.
Typické kolekce vlastností
Tato část se bude vztahovat k typickým typům kolekcí vlastností, se kterou bude uživatel pracovat s iOSem 8.
Následuje typická kolekce vlastností, kterou vývojář může vidět na iPhone:
| Vlastnost | Hodnota |
|---|---|
HorizontalSizeClass |
Kompaktní |
VerticalSizeClass |
Pravidelný |
UserInterfaceIdom |
Rozložení |
DisplayScale |
2.0 |
Výše uvedená sada by představovala plně kvalifikovanou kolekci vlastností, protože má hodnoty všech vlastností.
Je také možné mít kolekci vlastností, u které chybí některé z jejích hodnot (které Apple označuje jako Nespecifikované):
| Vlastnost | Hodnota |
|---|---|
HorizontalSizeClass |
Kompaktní |
VerticalSizeClass |
Unspecified |
UserInterfaceIdom |
Unspecified |
DisplayScale |
Unspecified |
Obecně ale platí, že když vývojář požádá o vlastnost Prostředí pro svou kolekci vlastností, vrátí plně kvalifikovanou kolekci, jak je vidět v příkladu výše.
Pokud prostředí vlastností (například zobrazení nebo kontroler zobrazení) není v aktuální hierarchii zobrazení, vývojář může získat zpět neurčené hodnoty pro jednu nebo více vlastností vlastnosti.
Vývojář také dostane částečně kvalifikovanou kolekci vlastností, pokud k vytvoření nové kolekce použije jednu z metod vytváření poskytovaných společností Apple, UITraitCollection.FromHorizontalSizeClass jako je .
Jedna operace, kterou je možné provést s více kolekcemi vlastností, je jejich vzájemná porovnání, což zahrnuje dotazování jedné kolekce vlastností, pokud obsahuje jinou. Znamená to, že u všech vlastností zadaných ve druhé kolekci se hodnota musí přesně shodovat s hodnotou v první kolekci.
K otestování dvou vlastností použijte metodu předávání ContainsUITraitCollection hodnoty vlastnosti, která se má testovat.
Vývojář může porovnání provést ručně v kódu a určit, jak rozložení zobrazení nebo kontrolerů zobrazení. Tuto UIKit metodu však používá interně k poskytování některých funkcí, například v proxy vzhledu.
Proxy vzhledu
Proxy vzhledu byl představen v dřívějších verzích iOSu, aby vývojářům umožnil přizpůsobit vlastnosti jejich zobrazení. Byla rozšířena v iOSu 8 tak, aby podporovala kolekce vlastností.
Proxy pro vzhled teď obsahují novou metodu , která vrací nový proxy vzhledu pro danou kolekci vlastností, AppearanceForTraitCollection která byla předána. Všechna přizpůsobení, která vývojář provede na tomto proxy vzhledu, budou mít vliv pouze na zobrazení, která odpovídají zadané kolekci vlastností.
Vývojář obvykle metodě předá částečně zadanou kolekci vlastností, například metodě, která právě specifikuje třídu horizontální velikosti typu Compact, aby mohl přizpůsobit libovolné zobrazení v aplikaci, které je AppearanceForTraitCollection kompaktní vodorovně.
Image uživatelského rozhraní
Další třídou, do které Apple přidal kolekci vlastností, je UIImage . V minulosti musel vývojář zadat verzi @1X @2x libovolného rastrového grafického assetu, který měl zahrnout do aplikace (například ikonu).
Systém iOS 8 byl rozšířen tak, aby vývojář mohl do katalogu obrázků zahrnout více verzí image na základě kolekce vlastností. Vývojář může například zahrnout menší obrázek pro práci s kompaktní třídou vlastností a obrázek s plnou velikostí pro jakoukoli jinou kolekci.
Když se jeden z obrázků použije uvnitř třídy, v zobrazení obrázku se automaticky zobrazí správná verze UIImageView image pro svou kolekci vlastností. Pokud se prostředí vlastností změní (například uživatel přepne zařízení z režimu na výšku na šířku), zobrazení obrázku automaticky vybere novou velikost obrázku tak, aby odpovídala nové kolekci vlastností, a změní jeho velikost tak, aby odpovídala aktuální verzi zobrazeného obrázku.
UIImageAsset
Apple přidal do iOSu 8 novou třídu s názvem , která dává vývojáři ještě větší kontrolu UIImageAsset nad výběrem obrázku.
Image Asset zabalí všechny různé verze image a umožní vývojáři požádat o konkrétní image, která odpovídá předané kolekci vlastností. Image je možné přidat nebo odebrat z prostředku s obrázkem průběžně.
Další informace o prostředcích imagí najdete v dokumentaci k UIImageAsset společnosti Apple.
Kombinování kolekcí vlastností
Další funkcí, kterou může vývojář provádět při kolekcích vlastností, je přidat dvě dohromady, které budou mít za následek kombinovanou kolekci, kde neurčené hodnoty z jedné kolekce nahradí zadané hodnoty v druhé. To se provádí pomocí FromTraitsFromCollections metody UITraitCollection třídy.
Jak je uvedeno výše, pokud některý z vlastností není v jedné z kolekcí vlastností uveden a je specifikován v jiném, hodnota se nastaví na zadanou verzi. Pokud je však zadána více verzí zadané hodnoty, hodnota z poslední kolekce vlastností bude hodnota, která se používá.
Řadiče adaptivního zobrazení
V této části najdete podrobné informace o tom, jak řadiče zobrazení a zobrazení pro iOS přijaly koncepty vlastností a tříd velikostí, které se v aplikacích vývojářů automaticky upraví.
Kontroler rozděleného zobrazení
Jedna z tříd kontroleru zobrazení, která změnila nejvíce v iOS 8, je UISplitViewController Třída. v minulosti mohl vývojář často použít rozdělený kontroler zobrazení v iPad verzi aplikace a pak by musel pro iPhone verzi aplikace poskytnout zcela jinou verzi své hierarchie zobrazení.
v iOS 8 UISplitViewController je třída k dispozici na obou platformách (iPad a iPhone), která vývojářům umožňuje vytvořit jednu hierarchii kontrol zobrazení, která bude fungovat jak pro iPhone, tak pro iPad.
když je iPhone na šířku, zobrazí se vedle sebe zobrazení s rozděleným zobrazením vedle sebe, stejně jako při zobrazení na iPad.
Přepsání vlastností
v prostředích s vlastnostmi se kaskády nacestují z nadřazeného kontejneru dolů do podřízených kontejnerů, jak je znázorněno na následujícím obrázku znázorňujícím iPad v orientaci na šířku:
vzhledem k tomu, že iPad má ve vodorovném i svislém směru třídu regulární velikosti, bude rozdělené zobrazení zobrazovat hlavní i podrobné zobrazení.
v iPhone, kde je třída Size v obou směrech kompaktní, se pro rozdělené zobrazení zobrazí pouze podrobné zobrazení, jak je vidět níže:
V aplikaci, kde vývojář chce zobrazit hlavní a detailní zobrazení iPhone v orientaci na šířku, musí vývojář vložit nadřazený kontejner pro řadič rozděleného zobrazení a přepsat kolekci vlastností. Jak je vidět na obrázku níže:
A UIView je nastaven jako nadřazený objekt řadiče rozděleného zobrazení a SetOverrideTraitCollection Metoda je volána v zobrazení, které předává novou kolekci vlastností a cílí na kontroler rozděleného zobrazení. Nová kolekce vlastností Přepisuje vlastnost HorizontalSizeClass , nastaví ji na Regular , aby kontroler rozděleného zobrazení zobrazil hlavní a detailní zobrazení na iPhone v orientaci na šířku.
Všimněte si, že vlastnost VerticalSizeClass byla nastavena na hodnotu unspecified , která umožňuje přidání nové kolekce vlastností do kolekce vlastností v nadřazeném prvku, což vede k tomu, že Compact VerticalSizeClass pro podřízeného řadiče zobrazení pro podřízený objekt.
Změny vlastností
V této části se podrobně podíváme na to, jak se při změně prostředí vlastností převedou kolekce vlastností. Například při otočení zařízení z výšky na šířku.
Za prvé, iOS 8 provede některé nastavení, které se připraví, aby se přechod mohl uskutečnit. Dále systém animuje stav přechodu. A nakonec iOS 8 vyčistí všechny dočasné stavy vyžadované během přechodu.
iOS 8 poskytuje několik zpětných volání, která může vývojář použít k účasti na změně vlastností, jak je vidět v následující tabulce:
| Fáze | OnCuePoint | Description |
|---|---|---|
| Nastavení |
|
|
| Animace | WillTransitionToTraitCollection |
Koordinátor přechodu, který se předává této metodě, má AnimateAlongside vlastnost, která vývojářům umožňuje přidat animace, které se spustí spolu s výchozími animacemi. |
| Vyčištění | WillTransitionToTraitCollection |
Poskytuje způsob, jak vývojářům zahrnout svůj vlastní kód pro vyčištění po provedení přechodu. |
Tato WillTransitionToTraitCollection Metoda je vhodná pro animování řadičů zobrazení spolu se změnami kolekce vlastností. WillTransitionToTraitCollectionMetoda je k dispozici pouze na řadičích zobrazení ( UIViewController ) a nikoli v prostředí jiných vlastností, jako je UIViews .
TraitCollectionDidChangeJe skvělé pro práci s UIView třídou, kde vývojář chce aktualizovat uživatelské rozhraní, protože se mění vlastnosti.
Sbalení řadičů rozděleného zobrazení
Teď se podíváme na to, co se stane, když se rozdělený kontroler zobrazení sbalí ze dvou sloupců do jednoho zobrazení sloupce. V rámci této změny existují dva procesy, které je potřeba provést:
- Ve výchozím nastavení bude kontroler rozděleného zobrazení používat primární kontroler zobrazení, jakmile dojde k sbalení. Vývojář může toto chování přepsat přepsáním
GetPrimaryViewControllerForCollapsingSplitViewControllermetodyUISplitViewControllerDelegatea poskytnutím libovolného kontroleru zobrazení, který chcete zobrazit ve sbaleném stavu. - Sekundární kontroler zobrazení musí být sloučen do primárního kontroleru zobrazení. Obecně platí, že vývojář nebude muset pro tento krok provádět žádné akce. Kontroler rozděleného zobrazení zahrnuje automatické zpracování této fáze na základě hardwarového zařízení. Mohou však nastat některé zvláštní případy, kdy bude vývojář chtít s touto změnou pracovat. Volání
CollapseSecondViewControllermetodyUISplitViewControllerDelegateumožňuje zobrazit kontroler hlavního zobrazení, když dojde k sbalení, místo zobrazení podrobností.
Rozbalení řadiče rozděleného zobrazení
Teď se podíváme na to, co se stane při rozbalení rozděleného kontroleru zobrazení ze sbaleného stavu. Později je potřeba provést dvě fáze:
- Nejdřív definujte nový primární kontroler zobrazení. Ve výchozím nastavení bude kontroler rozděleného zobrazení automaticky používat primární kontroler zobrazení ze sbaleného zobrazení. Vývojář může toto chování přepsat pomocí
GetPrimaryViewControllerForExpandingSplitViewControllermetodyUISplitViewControllerDelegate. - Po zvolení primárního kontroleru zobrazení se musí znovu vytvořit sekundární kontroler zobrazení. Kontroler rozděleného zobrazení bude zase zahrnovat automatické zpracování této fáze na základě hardwarového zařízení. Vývojář může toto chování přepsat voláním
SeparateSecondaryViewControllermetodyUISplitViewControllerDelegate.
V rozděleném kontroleru zobrazení je primární kontroler zobrazení součástí rozbalování a sbalení zobrazení pomocí implementace CollapseSecondViewControllerSeparateSecondaryViewController metod a UISplitViewControllerDelegate . UINavigationController implementuje tyto metody pro automatické vložení a skrytí sekundárního kontroleru zobrazení.
Zobrazení řadičů zobrazení
Další změnou, kterou Apple provedl v systému iOS 8, je způsob, jakým vývojář zobrazuje řadiče zobrazení. Pokud v minulosti měla aplikace kontroler zobrazení na list (například kontroler zobrazení tabulky) a vývojář vykázal jiný (například v reakci na klepnutí na buňku), aplikace se dorazí přes hierarchii kontroléru na kontroler zobrazení a zavolá PushViewController metodu na ni, aby se zobrazilo nové zobrazení.
To představuje velmi těsné propojení mezi řídicím zařízením a prostředím, ve kterém bylo spuštěno. V iOS 8 se společnost Apple odpojí tím, že poskytuje dvě nové metody:
ShowViewController– Přizpůsobí zobrazení nového kontroleru zobrazení na základě jeho prostředí. Například vUINavigationControllertakovém případě stačí nové zobrazení vložit do zásobníku. V rámci řadiče rozděleného zobrazení se nový kontroler zobrazení zobrazí na levé straně jako nový primární kontroler zobrazení. Pokud není k dispozici žádný kontroler zobrazení kontejneru, bude nové zobrazení zobrazeno jako modální kontroler zobrazení.ShowDetailViewController– Funguje podobným způsobem jakoShowViewController, ale implementuje se na rozděleném kontroleru zobrazení, aby bylo možné nahradit zobrazení podrobností novým kontrolérem zobrazení, který se předává. pokud je rozbalený kontroler zobrazení (jak se může zobrazit v aplikaci iPhone), volání se přesměruje naShowViewControllermetodu a nové zobrazení se zobrazí jako primární kontroler zobrazení. Pokud není k dispozici žádný kontroler zobrazení kontejneru, bude nové zobrazení zobrazeno jako modální kontroler zobrazení.
Tyto metody fungují tak, že se spustí na řídicím panelu zobrazení listu a provedou hierarchii zobrazení, dokud nenaleznou správný kontroler zobrazení kontejneru pro zpracování zobrazení nového zobrazení.
Vývojáři můžou implementovat ShowViewController a vlastní ShowDetailViewController řadiče zobrazení a získat tak stejné automatizované funkce, které UINavigationControllerUISplitViewController nabízí.
Jak to funguje
V této části se podíváme na to, jak jsou tyto metody ve skutečnosti implementované v iOS 8. Nejprve se podíváme na novou GetTargetForAction metodu:
Tato metoda projde řetěz hierarchie, dokud není nalezen správný kontroler zobrazení kontejneru. Například:
- Pokud
ShowViewControllerje volána metoda, první kontroler zobrazení v řetězci, který implementuje tuto metodu, je navigační kontroler, takže se používá jako nadřazené nové zobrazení. - Pokud
ShowDetailViewControllerbyla namísto toho volána metoda, je pro její implementaci kontroler rozděleného zobrazení první kontroler zobrazení, takže se používá jako nadřazený objekt.
GetTargetForActionMetoda funguje tak, že vyhledá kontroler zobrazení, který implementuje danou akci, a pak s dotazem, jestli chce tuto akci přijmout. Vzhledem k tomu, že je tato metoda veřejná, mohou vývojáři vytvořit vlastní metody, které fungují stejně jako ShowViewController integrované ShowDetailViewController metody a.
Adaptivní prezentace
V systému iOS 8 vytvořila společnost Apple také popover prezentace ( UIPopoverPresentationController ). Proto kontroler zobrazení prezentace popover automaticky nabídne normální zobrazení popover v běžné velikosti třídy, ale zobrazí celou obrazovku v horizontálně zkomprimované třídě velikosti (například na iPhone).
Aby bylo možné přizpůsobit změny v rámci sjednoceného systému scénářů, byl vytvořen nový objekt kontroleru pro správu zobrazených řadičů zobrazení – UIPresentationController . Tento kontroler se vytvoří z doby, kdy se kontroler zobrazení zobrazí, dokud není zavřený. Vzhledem k tomu, že se jedná o správu třídy, může být při reakci na změny zařízení, které ovlivňují kontroler zobrazení (například orientace), považována za super třídu, která je pak předávána do kontroleru zobrazení řídící kontroler.
Když vývojář prezentuje kontroler pomocí PresentViewController metody, Správa procesu prezentace je předána na UIKit . UIKit zpracovává (mimo jiné) správný kontroler pro vytváření stylu s jedinou výjimkou, když má kontroler zobrazení nastaven styl na UIModalPresentationCustom . V tomto případě může aplikace poskytnout vlastní PresentationController místo použití UIKit řadiče.
Vlastní styly prezentace
S vlastním stylem prezentace mají vývojáři možnost použít vlastní prezentační kontroler. Tento vlastní kontroler je možné použít ke změně vzhledu a chování zobrazení, které je příbuzné.
Práce s třídami velikostí
adaptivní fotografie Xamarin Project, který je součástí tohoto článku, poskytuje pracovní příklad použití tříd velikosti a adaptivních řadičů zobrazení v aplikaci sjednoceného rozhraní iOS 8.
I když aplikace vytváří svoje uživatelské rozhraní zcela z kódu, a to na rozdíl od vytvoření sjednoceného scénáře pomocí Interface Builder Xcode, platí stejné postupy.
Teď se podíváme na to, jak projekt adaptivních fotek implementuje několik funkcí třídy Size v iOS 8 a vytvoří adaptivní aplikaci.
Přizpůsobení ke změnám prostředí ve vlastnosti
při spuštění aplikace adaptivní fotky na iPhone, když uživatel otočí zařízení z na výšku na šířku, zobrazí se v rozděleném řadiči zobrazení hlavní a podrobné zobrazení:
Toho je možné dosáhnout přepsáním UpdateConstraintsForTraitCollection metody kontroleru zobrazení a úpravou omezení na základě hodnoty VerticalSizeClass . Například:
public void UpdateConstraintsForTraitCollection (UITraitCollection collection)
{
var views = NSDictionary.FromObjectsAndKeys (
new object[] { TopLayoutGuide, ImageView, NameLabel, ConversationsLabel, PhotosLabel },
new object[] { "topLayoutGuide", "imageView", "nameLabel", "conversationsLabel", "photosLabel" }
);
var newConstraints = new List<NSLayoutConstraint> ();
if (collection.VerticalSizeClass == UIUserInterfaceSizeClass.Compact) {
newConstraints.AddRange (NSLayoutConstraint.FromVisualFormat ("|[imageView]-[nameLabel]-|",
NSLayoutFormatOptions.DirectionLeadingToTrailing, null, views));
newConstraints.AddRange (NSLayoutConstraint.FromVisualFormat ("[imageView]-[conversationsLabel]-|",
NSLayoutFormatOptions.DirectionLeadingToTrailing, null, views));
newConstraints.AddRange (NSLayoutConstraint.FromVisualFormat ("[imageView]-[photosLabel]-|",
NSLayoutFormatOptions.DirectionLeadingToTrailing, null, views));
newConstraints.AddRange (NSLayoutConstraint.FromVisualFormat ("V:|[topLayoutGuide]-[nameLabel]-[conversationsLabel]-[photosLabel]",
NSLayoutFormatOptions.DirectionLeadingToTrailing, null, views));
newConstraints.AddRange (NSLayoutConstraint.FromVisualFormat ("V:|[topLayoutGuide][imageView]|",
NSLayoutFormatOptions.DirectionLeadingToTrailing, null, views));
newConstraints.Add (NSLayoutConstraint.Create (ImageView, NSLayoutAttribute.Width, NSLayoutRelation.Equal,
View, NSLayoutAttribute.Width, 0.5f, 0.0f));
} else {
newConstraints.AddRange (NSLayoutConstraint.FromVisualFormat ("|[imageView]|",
NSLayoutFormatOptions.DirectionLeadingToTrailing, null, views));
newConstraints.AddRange (NSLayoutConstraint.FromVisualFormat ("|-[nameLabel]-|",
NSLayoutFormatOptions.DirectionLeadingToTrailing, null, views));
newConstraints.AddRange (NSLayoutConstraint.FromVisualFormat ("|-[conversationsLabel]-|",
NSLayoutFormatOptions.DirectionLeadingToTrailing, null, views));
newConstraints.AddRange (NSLayoutConstraint.FromVisualFormat ("|-[photosLabel]-|",
NSLayoutFormatOptions.DirectionLeadingToTrailing, null, views));
newConstraints.AddRange (NSLayoutConstraint.FromVisualFormat ("V:[topLayoutGuide]-[nameLabel]-[conversationsLabel]-[photosLabel]-20-[imageView]|",
NSLayoutFormatOptions.DirectionLeadingToTrailing, null, views));
}
if (constraints != null)
View.RemoveConstraints (constraints.ToArray ());
constraints = newConstraints;
View.AddConstraints (constraints.ToArray ());
}
Přidávání animací přechodu
Když se kontroler rozděleného zobrazení v aplikaci adaptivní fotky přechází ze sbalené na rozbalené, do výchozích animací se přidají animace přepsáním WillTransitionToTraitCollection metody kontroleru zobrazení. Například:
public override void WillTransitionToTraitCollection (UITraitCollection traitCollection, IUIViewControllerTransitionCoordinator coordinator)
{
base.WillTransitionToTraitCollection (traitCollection, coordinator);
coordinator.AnimateAlongsideTransition ((UIViewControllerTransitionCoordinatorContext) => {
UpdateConstraintsForTraitCollection (traitCollection);
View.SetNeedsLayout ();
}, (UIViewControllerTransitionCoordinatorContext) => {
});
}
Přepsání prostředí vlastností
jak je vidět výše, aplikace adaptivní fotky vynutí, aby se při zobrazení iPhoneho zařízení v zobrazení na šířku zobrazily podrobnosti i zobrazení předloh.
To bylo provedeno pomocí následujícího kódu v kontroleru zobrazení:
private UITraitCollection forcedTraitCollection = new UITraitCollection ();
...
public UITraitCollection ForcedTraitCollection {
get {
return forcedTraitCollection;
}
set {
if (value != forcedTraitCollection) {
forcedTraitCollection = value;
UpdateForcedTraitCollection ();
}
}
}
...
public override void ViewWillTransitionToSize (SizeF toSize, IUIViewControllerTransitionCoordinator coordinator)
{
ForcedTraitCollection = toSize.Width > 320.0f ?
UITraitCollection.FromHorizontalSizeClass (UIUserInterfaceSizeClass.Regular) :
new UITraitCollection ();
base.ViewWillTransitionToSize (toSize, coordinator);
}
public void UpdateForcedTraitCollection ()
{
SetOverrideTraitCollection (forcedTraitCollection, viewController);
}
Rozbalení a sbalení kontroleru rozděleného zobrazení
Teď se podíváme, jak se v Xamarin implementovalo chování rozšíření a sbalení kontroleru rozděleného zobrazení. V případě AppDelegate , kdy je vytvořen kontroler rozděleného zobrazení, je jeho delegát přiřazen pro zpracování těchto změn:
public class SplitViewControllerDelegate : UISplitViewControllerDelegate
{
public override bool CollapseSecondViewController (UISplitViewController splitViewController,
UIViewController secondaryViewController, UIViewController primaryViewController)
{
AAPLPhoto photo = ((CustomViewController)secondaryViewController).Aapl_containedPhoto (null);
if (photo == null) {
return true;
}
if (primaryViewController.GetType () == typeof(CustomNavigationController)) {
var viewControllers = new List<UIViewController> ();
foreach (var controller in ((UINavigationController)primaryViewController).ViewControllers) {
var type = controller.GetType ();
MethodInfo method = type.GetMethod ("Aapl_containsPhoto");
if ((bool)method.Invoke (controller, new object[] { null })) {
viewControllers.Add (controller);
}
}
((UINavigationController)primaryViewController).ViewControllers = viewControllers.ToArray<UIViewController> ();
}
return false;
}
public override UIViewController SeparateSecondaryViewController (UISplitViewController splitViewController,
UIViewController primaryViewController)
{
if (primaryViewController.GetType () == typeof(CustomNavigationController)) {
foreach (var controller in ((CustomNavigationController)primaryViewController).ViewControllers) {
var type = controller.GetType ();
MethodInfo method = type.GetMethod ("Aapl_containedPhoto");
if (method.Invoke (controller, new object[] { null }) != null) {
return null;
}
}
}
return new AAPLEmptyViewController ();
}
}
SeparateSecondaryViewControllerMetoda Testuje, zda je fotografie zobrazena a na základě tohoto stavu provede akci. Pokud se nezobrazí žádná fotka, sbalí se sekundární kontroler zobrazení, aby se zobrazil kontroler hlavního zobrazení.
CollapseSecondViewControllerMetoda se používá při rozbalení řadiče rozděleného zobrazení, aby se zobrazilo, jestli v zásobníku existují fotografie, pokud se tak sbalí zpátky do tohoto zobrazení.
Přesun mezi řadiči zobrazení
Teď se podíváme na to, jak se aplikace adaptivní fotky pohybuje mezi řadiči zobrazení. Ve AAPLConversationViewController třídě když uživatel vybere buňku z tabulky, ShowDetailViewController je volána metoda pro zobrazení podrobností.
public override void RowSelected (UITableView tableView, NSIndexPath indexPath)
{
var photo = PhotoForIndexPath (indexPath);
var controller = new AAPLPhotoViewController ();
controller.Photo = photo;
int photoNumber = indexPath.Row + 1;
int photoCount = (int)Conversation.Photos.Count;
controller.Title = string.Format ("{0} of {1}", photoNumber, photoCount);
ShowDetailViewController (controller, this);
}
Zobrazení indikátorů zpřístupnění
V aplikaci adaptivní fotky je několik míst, kde jsou indikátory zpřístupnění skryté nebo zobrazené na základě změn v prostředí vlastností. Tato akce je zpracována s následujícím kódem:
public bool Aapl_willShowingViewControllerPushWithSender ()
{
var selector = new Selector ("Aapl_willShowingViewControllerPushWithSender");
var target = this.GetTargetViewControllerForAction (selector, this);
if (target != null) {
var type = target.GetType ();
MethodInfo method = type.GetMethod ("Aapl_willShowingDetailViewControllerPushWithSender");
return (bool)method.Invoke (target, new object[] { });
} else {
return false;
}
}
public bool Aapl_willShowingDetailViewControllerPushWithSender ()
{
var selector = new Selector ("Aapl_willShowingDetailViewControllerPushWithSender");
var target = this.GetTargetViewControllerForAction (selector, this);
if (target != null) {
var type = target.GetType ();
MethodInfo method = type.GetMethod ("Aapl_willShowingDetailViewControllerPushWithSender");
return (bool)method.Invoke (target, new object[] { });
} else {
return false;
}
}
Tyto jsou implementovány pomocí GetTargetViewControllerForAction metody popsané výše v podrobnostech.
Když kontroler zobrazení tabulky zobrazuje data, používá výše implementované metody k zobrazení, zda se má nebo nemá nasdílení změn a zda má být indikátor zpřístupnění příslušným způsobem zobrazen nebo skryt:
public override void WillDisplay (UITableView tableView, UITableViewCell cell, NSIndexPath indexPath)
{
bool pushes = ShouldShowConversationViewForIndexPath (indexPath) ?
Aapl_willShowingViewControllerPushWithSender () :
Aapl_willShowingDetailViewControllerPushWithSender ();
cell.Accessory = pushes ? UITableViewCellAccessory.DisclosureIndicator : UITableViewCellAccessory.None;
var conversation = ConversationForIndexPath (indexPath);
cell.TextLabel.Text = conversation.Name;
}
Nový ShowDetailTargetDidChangeNotification typ
Společnost Apple přidala do rozděleného kontroleru zobrazení nový typ oznámení pro práci s třídami velikostí a prostředími vlastností ShowDetailTargetDidChangeNotification . Toto oznámení se pošle vždy, když se změní cílové zobrazení podrobností pro kontroler rozděleného zobrazení, například když se kontroler rozbalí nebo sbalí.
Aplikace adaptivní fotky používá toto oznámení k aktualizaci stavu indikátoru zveřejnění při změně kontroleru zobrazení podrobností:
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
TableView.RegisterClassForCellReuse (typeof(UITableViewCell), AAPLListTableViewControllerCellIdentifier);
NSNotificationCenter.DefaultCenter.AddObserver (this, new Selector ("showDetailTargetDidChange:"),
UIViewController.ShowDetailTargetDidChangeNotification, null);
ClearsSelectionOnViewWillAppear = false;
}
Prohlédněte si podrobnější informace o aplikaci adaptivní fotky, abyste viděli všechny způsoby, kterými se dají třídy velikostí, kolekce vlastností a adaptivní řadiče zobrazení použít k snadnému vytvoření sjednocené aplikace v Xamarin. iOS.
Sjednocené scénáře
novinka ve scénářích iOS 8 umožňuje vývojářům vytvořit jeden sjednocený soubor scénáře, který se dá zobrazit na iPhone i iPad na zařízeních tím, že cílí na více tříd velikosti. Při použití sjednocených scénářů zapisuje vývojář méně kódu specifického pro uživatelské rozhraní a má pouze jeden návrh rozhraní pro vytvoření a údržbu.
Klíčové výhody sjednocených scénářů:
- pro iPhone a iPad použijte stejný soubor scénáře.
- Nasaďte zpět na iOS 6 a iOS 7.
- Náhled rozložení pro různá zařízení, orientace a verze operačních systémů
Povolení tříd velikosti
Ve výchozím nastavení budou všechny nové projekty Xamarin. iOS používat třídy velikostí. Chcete-li použít třídy velikostí a adaptivní přechody ve scénáři ze staršího projektu, musí být nejprve převedena do sjednoceného formátu scénáře Xcode 6 a v inspektoru souboru Xcode pro vaše scénáře je vybráno zaškrtávací políčko použít třídy velikosti.
Dynamické spouštěcí obrazovky
Soubor spouštěcí obrazovky se při spuštění aplikace pro iOS zobrazí jako úvodní obrazovka, která uživateli poskytne zpětnou vazbu pro uživatele, že se aplikace skutečně spouští. Před iOS 8 musel vývojář zahrnout Default.png pro každý typ zařízení, orientaci a rozlišení obrazovky, na kterém je aplikace spuštěná, víc prostředků imagí. Například,, Default@2x.png , Default-Landscape@2x~ipad.pngDefault-Portrait@2x~ipad.png atd.
faktoring v nových iPhone 6 a iPhone 6 Plus (a nadcházející Apple Watch) se všemi existujícími iPhone a iPadmi zařízeními představuje velké pole různých velikostí, orientace a rozlišení Default.png prostředků imagí spouštěcí obrazovky, které musí být vytvořeny a udržovány. Kromě toho můžou být tyto soubory poměrně velké a budou "dispozici determinističtější" sady prostředků pro dodávku, což zvyšuje dobu potřebnou ke stažení aplikace z obchodu iTunes App Store (může se stát, že se nebude moct doručovat přes mobilní síť) a zvýšit množství úložiště potřebného pro zařízení koncového uživatele.
Novinka v systému iOS 8 může vývojář vytvořit jeden izolovaný .xib soubor v Xcode, který používá automatické rozložení a velikost tříd k vytvoření .xib , která bude fungovat pro každé zařízení, rozlišení a orientaci. To nejen snižuje množství práce, které vývojář potřebuje k vytváření a údržbě všech potřebných prostředků imagí, ale významně snižuje velikost nainstalované sady prostředků aplikace.
Dynamické spouštěcí obrazovky mají následující omezení a požadavky:
- Používejte pouze
UIKittřídy. - Použijte jedno kořenové zobrazení, které je
UIViewUIViewControllerobjektem nebo. - Nevytvářejte žádná připojení k kódu aplikace (Nepřidávat Akce ani neumožňují).
- Nepřidávejte
UIWebViewobjekty. - Nepoužívejte žádné vlastní třídy.
- Nepoužívejte běhové atributy.
S výše uvedenými pokyny se podívejme na přidání dynamické spouštěcí obrazovky do existujícího projektu Xamarin iOS 8.
Postupujte následovně:
otevřete Visual Studio pro Mac a načtěte řešení , do kterého se přidá dynamická spouštěcí obrazovka.
V Průzkumník řešeníklikněte pravým tlačítkem na soubor a vyberte otevřít pomocíXcode Interface Builder:
V Xcode vyberte souborNovýsoubor...:
Vyberte spouštěcí obrazovku uživatelského rozhraní iOS a klikněte na tlačítko Další :
Pojmenujte soubor
LaunchScreen.xiba klikněte na tlačítkoLaunchScreen.xib:Upravte návrh spouštěcí obrazovky přidáním grafických prvků a pomocí omezení rozložení, aby je bylo možné umístit pro daná zařízení, orientace a velikosti obrazovky:
Uložte změny do
LaunchScreen.xib.Vyberte cíl aplikací a kartu Obecné :
Klikněte na tlačítko zvolit info. plist , vyberte pro aplikaci Xamarin a klikněte na tlačítko zvolit :
V části ikony aplikace a spouštěcí obrázky otevřete rozevírací seznam spouštěcí obrazovky a vyberte možnost Vytvořeno výše:
uložte změny do souboru a vraťte se do Visual Studio pro Mac.
počkejte, až Visual Studio pro Mac dokončí synchronizaci změn pomocí Xcode.
V Průzkumník řešeníklikněte pravým tlačítkem na složku prostředků a vyberte PřidatPřidat soubory...:
Vyberte soubor, který jste
LaunchScreen.xibvytvořili výše, a klikněte na tlačítkoLaunchScreen.xib:Sestavte aplikaci.
Testování dynamické spouštěcí obrazovky
v Visual Studio pro Mac vyberte simulátor iPhone 4 Retina a spusťte aplikaci. Dynamická spouštěcí obrazovka se zobrazí ve správném formátu a orientaci:
zastavte aplikaci v Visual Studio pro Mac a vyberte iPad zařízení se systémem iOS 8. Spusťte aplikaci a spouštěcí obrazovka bude pro toto zařízení a orientaci správně naformátovaná:
vraťte se do Visual Studio pro Mac a zastavte spuštění aplikace.
Práce s iOS 7
Aby se zajistila zpětná kompatibilita se systémem iOS 7, stačí Default.png do aplikace pro iOS 8 zahrnout běžné prostředky imagí jako normální. iOS se vrátí k předchozímu chování a při spuštění na zařízení se systémem iOS 7 se tyto soubory použijí jako úvodní obrazovka.
Pokud se chcete podívat na implementaci dynamické spouštěcí obrazovky v Xamarinu, podívejte se na ukázkovou aplikaci pro iOS 8 s dynamickými spouštěcími obrazovkami připojenou k tomuto dokumentu.
Souhrn
Tento článek se rychle podíval na třídy velikostí a na to, jak ovlivňují rozložení v iPhone a iPad zařízeních. Probrali jsme, jak vlastnosti, prostředí vlastností a kolekce vlastností pracují s třídami velikostí při vytváření sjednocených rozhraní. Krátce se podíval na adaptivní kontrolery zobrazení a na to, jak fungují s třídami velikostí uvnitř sjednocených rozhraní. Podíval se na kompletní implementaci tříd velikostí a sjednocených rozhraní z kódu jazyka C# v aplikaci Xamarin iOS 8.
Nakonec tento článek pokryl základy vytvoření jedné dynamické spouštěcí obrazovky, která se zobrazí jako úvodní obrazovka na každém zařízení s iOSem 8.






















