Xamarin.iOS'ta Birleşik Görsel Taslaklar
iOS 8, kullanıcı arabirimini (birleşik görsel taslak) oluşturmak için yeni, daha basit bir kullanım mekanizması içerir. Farklı donanım ekran boyutlarının tümünü kapsayan tek bir görsel taslak ile hızlı ve duyarlı görünümler "bir kez tasarla, çok kullan" stilinde oluşturulabilir.
Geliştiricinin artık i Telefon ve iPad cihazları için ayrı ve belirli bir görsel taslak oluşturması gerekmeyen bu kullanıcıların ortak bir arabirimle uygulama tasarlama ve ardından bu arabirimi farklı boyut sınıfları için özelleştirme esnekliği vardır. Bu şekilde, bir uygulama her form faktörünün güçlü yönlerine uyarlanabilir ve her kullanıcı arabirimi en iyi deneyimi sağlayacak şekilde ayarlanabilir.
Boyut Sınıfları
iOS 8'in öncesinde geliştirici, dikey ve UIInterfaceIdiom
yatay modlar ile i Telefon ve iPad cihazları arasında ayrım yapmak için ve kullandıUIInterfaceOrientation
. iOS8'de yönlendirme ve cihaz Boyut Sınıfları kullanılarak belirlenir.
Cihazlar hem dikey hem de yatay eksenlerde Boyut Sınıfları tarafından tanımlanır ve iOS 8'de iki tür boyut sınıfı vardır:
- Normal – Bu, büyük bir ekran boyutu (iPad gibi) veya büyük bir boyut (örneğin,
UIScrollView
- Compact : Bu, daha küçük cihazlara (i Telefon gibi) yöneliktir. Bu boyut, cihazın yönünü dikkate alır.
İki kavram birlikte kullanılırsa, sonuç aşağıdaki diyagramda görüldüğü gibi her iki farklı yönlendirmede de kullanılabilecek farklı olası boyutları tanımlayan 2 x 2 kılavuzdur:
Geliştirici, farklı düzenlere (yukarıdaki grafiklerde görüldüğü gibi) neden olabilecek dört olasılığın herhangi birini kullanan bir Görünüm Denetleyicisi oluşturabilir.
iPad Boyut Sınıfları
iPad, boyutu nedeniyle her iki yön için de normal bir sınıf boyutuna sahiptir.
i Telefon Boyut Sınıfları
i Telefon, cihazın yönlendirmesine göre farklı boyut sınıflarına sahiptir:
- Cihaz dikey moddayken, ekranın yatay ve düzenli olarak dikey olarak kompakt bir sınıfı vardır
- Cihaz yatay moddayken ekran sınıfları dikey moddan ters çevrilir.
i Telefon 6 Artı Boyut Sınıfları
Boyutlar, dikey yöndeyken Telefon öncekilerle aynıdır, ancak yatay olarak farklıdır:
i Telefon 6 Plus yeterince büyük bir ekrana sahip olduğundan, Yatay modda Normal Genişlik Boyutu Sınıfına sahip olabilir.
Yeni Ekran Ölçeği desteği
i Telefon 6 Plus, 3,0 ekran ölçek faktörüne (orijinal i Telefon ekran çözünürlüğünün üç katı) sahip yeni bir Retina HD ekran kullanır. Bu cihazlarda mümkün olan en iyi deneyimi sağlamak için bu ekran ölçeği için tasarlanmış yeni resimler ekleyin. Xcode 6 ve üzerinde varlık katalogları 1x, 2x ve 3x boyutlu görüntüler içerebilir; i Telefon 6 Plus üzerinde çalışırken yeni görüntü varlıklarını eklediğinizde iOS doğru varlıkları seçer.
iOS'taki görüntü yükleme davranışı, görüntü dosyalarındaki bir @3x
son eki de tanır. Örneğin, geliştirici uygulamanın paketinde şu dosya adlarına sahip bir görüntü varlığı (farklı çözünürlüklerde) içeriyorsa: MonkeyIcon.png
, MonkeyIcon@2x.png
ve MonkeyIcon@3x.png
. i Telefon 6 Plus'taMonkeyIcon@3x.png
, geliştirici aşağıdaki kodu kullanarak bir görüntü yüklerse görüntü otomatik olarak kullanılır:
UIImage icon = UIImage.FromFile("MonkeyImage.png");
Dinamik Başlatma Ekranları
Başlatma ekranı dosyası, kullanıcıya uygulamanın gerçekten başlatıldığına ilişkin geri bildirim sağlamak için bir iOS uygulaması başlatılırken giriş ekranı olarak görüntülenir. iOS 8'in öncesinde, geliştiricinin her cihaz türü, yönlendirmesi ve uygulamanın üzerinde çalıştıracağı ekran çözünürlüğü için birden çok Default.png
görüntü varlığı içermesi gerekirdi.
iOS 8'de yeni olan geliştirici, Xcode'da Otomatik Düzen ve Boyut Sınıflarını kullanarak her cihaz, çözünürlük ve yönlendirme için çalışacak bir Dinamik Başlatma Ekranı oluşturan tek bir atomik .xib
dosya oluşturabilir. Bu, geliştiricinin gerekli tüm görüntü varlıklarını oluşturup bakımını yapmak için gereken çalışma miktarını azaltmakla kalmaz, aynı zamanda uygulamanın yüklü paketinin boyutunu da azaltır.
Özellik
Özellikler, ortamı değiştikçe düzenin nasıl değiştiğini belirlemek için kullanılabilecek özelliklerdir. Bunlar bir özellik kümesinden ( HorizontalSizeClass
ve VerticalSizeClass
tabanlı UIUserInterfaceSizeClass
) ve arabirim deyiminden ( UIUserInterfaceIdiom
) ve görüntü ölçeğinden oluşur.
Yukarıdaki durumların tümü, Apple'ın yalnızca özellikleri değil, değerlerini de içeren Bir Özellik Koleksiyonu ( UITraitCollection
) olarak başvurduğu bir kapsayıcıya sarmalanmıştır.
Özellik Ortamı
Özellik Ortamları iOS 8'de yeni bir arabirimdir ve aşağıdaki nesneler için Bir Özellik Koleksiyonu döndürebilir:
- Ekranlar (
UIScreens
). - Windows (
UIWindows
). - Görünüm Denetleyicileri (
UIViewController
). - Görünümler (
UIView
). - Sunu Denetleyicisi (
UIPresentationController
).
Geliştirici, kullanıcı arabiriminin nasıl düzenleneceğini belirlemek için Bir Özellik Ortamı tarafından döndürülen Özellik Koleksiyonu'nu kullanır.
Tüm Özellik Ortamları, aşağıdaki diyagramda görüldüğü gibi bir hiyerarşi oluşturur:
Yukarıdaki Özellik Ortamlarının her birinin sahip olduğu Özellik Koleksiyonu varsayılan olarak üst öğeden alt ortama akacaktır.
Özellik Ortamı, geçerli Özellik Koleksiyonunu almaya ek olarak Görünüm veya Görünüm Denetleyicisi alt sınıflarında geçersiz kılınabilen bir TraitCollectionDidChange
yönteme sahiptir. Geliştirici, bu özellikler değiştiğinde özelliklere bağlı kullanıcı arabirimi öğelerini değiştirmek için bu yöntemi kullanabilir.
Tipik Özellik Koleksiyonları
Bu bölümde, kullanıcının iOS 8 ile çalışırken karşılaşacağı tipik özellik koleksiyonları türleri ele alınacaktır.
Aşağıda, geliştiricinin i Telefon üzerinde görebileceği tipik bir Özellik Koleksiyonu verilmiştir:
Özellik | Değer |
---|---|
HorizontalSizeClass |
Compact |
VerticalSizeClass |
Normal |
UserInterfaceIdom |
Phone |
DisplayScale |
2.0 |
Yukarıdaki küme, tüm özellik özellikleri için değerlere sahip olduğu için Tam Nitelenmiş Özellik Koleksiyonunu temsil eder.
Bazı değerlerini (Apple'ın belirtilmemiş olarak ifade ettiği) eksik bir Özellik Koleksiyonuna sahip olmak da mümkündür:
Özellik | Değer |
---|---|
HorizontalSizeClass |
Compact |
VerticalSizeClass |
Belirtilme -miş |
UserInterfaceIdom |
Belirtilme -miş |
DisplayScale |
Belirtilme -miş |
Ancak genellikle geliştirici, Özellik Ortamı'na Özellik Koleksiyonunu sorduğunda, yukarıdaki örnekte görüldüğü gibi tam bir koleksiyon döndürür.
Özellik Ortamı (Görünüm veya Görünüm Denetleyicisi gibi) geçerli görünüm hiyerarşisinin içinde değilse, geliştirici bir veya daha fazla özellik özelliği için belirtilmemiş değerleri geri alabilir.
Geliştirici, yeni bir koleksiyon oluşturmak için Apple tarafından sağlanan oluşturma yöntemlerinden birini (örneğin UITraitCollection.FromHorizontalSizeClass
, ) kullanırsa kısmen nitelenmiş bir Özellik Koleksiyonu da alır.
Birden çok Özellik Koleksiyonunda gerçekleştirilebilecek işlemlerden biri, bunları birbiriyle karşılaştırmaktır. Bu işlem, bir Trait Collection'ın başka bir tane içerip içermediğini sormayı içerir. Kapsama'nın amacı, ikinci koleksiyonda belirtilen herhangi bir özellik için değerin ilk koleksiyondaki değerle tam olarak eşleşmesi gerektiğidir.
İki özelliği test etmek için test edilecek özelliğin değerini geçirme yöntemini UITraitCollection
kullanınContains
.
Geliştirici, Görünümlerin nasıl düzenleneceğini veya Denetleyicileri Görüntülemenin nasıl yapılacağını belirlemek için kodda karşılaştırmaları el ile gerçekleştirebilir. Ancak, UIKit
örneğin Görünüm Ara Sunucusu'nda olduğu gibi işlevlerinin bir kısmını sağlamak için bu yöntemi dahili olarak kullanır.
Görünüm Ara Sunucusu
Görünüm Ara Sunucusu, geliştiricilerin Görünümlerinin özelliklerini özelleştirmesine izin vermek için iOS'un önceki sürümlerinde tanıtıldı. Özellik Koleksiyonlarını desteklemek için iOS 8'de genişletilmiştir.
Görünüm Proxy'leri artık geçirilen belirli Bir Özellik Koleksiyonu için yeni bir Görünüm Ara Sunucusu döndüren yeni bir yöntemi AppearanceForTraitCollection
içerir. Geliştiricinin bu Görünüm Ara Sunucusu üzerinde gerçekleştirdiği tüm özelleştirmeler yalnızca belirtilen Özellik Koleksiyonuna uygun Görünümler üzerinde geçerli olur.
Genellikle geliştirici, uygulamadaki yatay olarak sıkıştırılmış herhangi bir görünümü özelleştirebilmesi için AppearanceForTraitCollection
yalnızca Yatay Boyut Sınıfını belirten bir Özellik Koleksiyonu gibi kısmen belirtilen bir Özellik Koleksiyonu'nu yöntemine geçirir.
UIImage
Apple'ın Özellik Koleksiyonu'nu eklediği bir diğer sınıf ise ' dir UIImage
. Geçmişte geliştiricinin uygulamaya dahil edecekleri bit eşlemli grafik varlığının (simge gibi) @1X ve @2x sürümünü belirtmesi gerekiyordu.
iOS 8, geliştiricinin Bir Görüntü Kataloğu'nda Bir Özellik Koleksiyonuna dayalı olarak görüntünün birden çok sürümünü eklemesine olanak tanıyacak şekilde genişletildi. Örneğin geliştirici, Compact Trait Sınıfı ile çalışmak için daha küçük bir görüntü ve diğer koleksiyonlar için tam boyutlu bir görüntü içerebilir.
Görüntülerden biri bir UIImageView
sınıfın içinde kullanıldığında, Görüntü Görünümü otomatik olarak görüntünün Nitelik Koleksiyonu için doğru sürümünü görüntüler. Özellik Ortamı değişirse (örneğin, kullanıcı cihazı dikeyden yataya değiştirirse), Görüntü Görünümü yeni Özellik Koleksiyonu ile eşleşecek şekilde yeni görüntü boyutunu otomatik olarak seçer ve boyutunu görüntülenen görüntünün geçerli sürümüyle eşleşecek şekilde değiştirir.
UIImageAsset
Apple, geliştiriciye görüntü seçimi üzerinde daha fazla denetim sağlamak için iOS 8'e adlı UIImageAsset
yeni bir sınıf ekledi.
Görüntü Varlığı, görüntünün tüm farklı sürümlerini sarmalar ve geliştiricinin geçirilen Bir Özellik Koleksiyonu ile eşleşen belirli bir görüntüyü istemesine olanak tanır. Görüntü Varlığından anlık olarak resimler eklenebilir veya kaldırılabilir.
Görüntü Varlıkları hakkında daha fazla bilgi için Apple'ın UIImageAsset belgelerine bakın.
Özellik Koleksiyonlarını Birleştirme
Bir geliştiricinin Özellik Koleksiyonları üzerinde gerçekleştirebileceği bir diğer işlev de, bir koleksiyondaki belirtilmeyen değerlerin ikinci bir koleksiyondaki belirtilen değerlerle değiştirildiği birleştirilmiş koleksiyonla sonuçlanacak iki işlev eklemektir. Bu, sınıfının yöntemi UITraitCollection
kullanılarak FromTraitsFromCollections
yapılır.
Yukarıda belirtildiği gibi, niteliklerden herhangi biri Özellik Koleksiyonlarından birinde belirtilmezse ve başka bir koleksiyonda belirtilirse, değer belirtilen sürüme ayarlanır. Ancak, belirtilen bir değerin birden çok sürümü varsa, son Özellik Koleksiyonundaki değer kullanılan değer olacaktır.
Uyarlamalı Görünüm Denetleyicileri
Bu bölümde, geliştirici uygulamalarında otomatik olarak daha uyarlamalı olmak için iOS Görünüm ve Görünüm Denetleyicilerinin Özellikler ve Boyut Sınıfları kavramlarını nasıl benimsediği ayrıntıları ele alınacaktır.
Bölünmüş Görünüm Denetleyicisi
iOS 8'de en çok değişen Görünüm Denetleyicisi sınıflarından biri sınıfıdır UISplitViewController
. Geçmişte geliştirici genellikle uygulamanın iPad sürümünde Bölünmüş Görünüm Denetleyicisi kullanır ve ardından uygulamanın i Telefon sürümü için görünüm hiyerarşisinin tamamen farklı bir sürümünü sağlaması gerekirdi.
iOS 8'de, UISplitViewController
sınıfı her iki platformda da (iPad ve i Telefon) kullanılabilir. Bu, geliştiricinin hem i Telefon hem de iPad için çalışacak bir Görünüm Denetleyicisi hiyerarşisi oluşturmasına olanak tanır.
i Telefon Yatay'dayken Bölünmüş Görünüm Denetleyicisi, Görünümlerini iPad'de gösterildiği gibi yan yana gösterir.
Özellikleri Geçersiz Kılma
Özellik Ortamları, iPad'deki Bölünmüş Görünüm Denetleyicisini yatay yönde gösteren aşağıdaki grafikte olduğu gibi üst kapsayıcıdan alt kapsayıcılara doğru art arda gelir:
iPad'in hem yatay hem de dikey yönlendirmelerinde Normal Boyut Sınıfı olduğundan Bölünmüş Görünüm hem ana hem de ayrıntı görünümlerini görüntüler.
Boyut Sınıfı'nın her iki yönde de sıkıştırıldığı i Telefon, Bölünmüş Görünüm Denetleyicisi aşağıda gösterildiği gibi yalnızca ayrıntı görünümünü görüntüler:
Geliştiricinin i Telefon üzerinde hem ana hem de ayrıntı görünümünü yatay yönde görüntülemek istediği bir uygulamada, geliştiricinin Bölünmüş Görünüm Denetleyicisi için bir üst kapsayıcı eklemesi ve Özellik Koleksiyonunu geçersiz kılması gerekir. Aşağıdaki grafikte görüldüğü gibi:
A UIView
, Bölünmüş Görünüm Denetleyicisi'nin üst öğesi olarak ayarlanır ve SetOverrideTraitCollection
yeni bir Özellik Koleksiyonu geçirip Bölünmüş Görünüm Denetleyicisi'ni hedefleyen görünümde yöntemi çağrılır. Yeni Özellik Koleksiyonu, öğesini olarak ayarlayarakRegular
, Bölünmüş Görünüm Denetleyicisi'nin i Telefon yatay yönde hem ana hem de ayrıntı görünümlerini görüntülemesini sağlarHorizontalSizeClass
.
öğesinin VerticalSizeClass
olarak ayarlandığını unspecified
ve bu sayede yeni Trait Collection'ın üst öğedeki Trait Collection'a eklenmesini sağladığını ve bunun sonucunda alt Bölünmüş Görünüm Denetleyicisi için bir Compact VerticalSizeClass
oluşturulduğuna dikkat edin.
Özellik Değişiklikleri
Bu bölüm, Özellik Ortamı değiştiğinde Özellik Koleksiyonlarının nasıl geçiş yapacağına ayrıntılı olarak göz atacaktır. Örneğin, cihaz dikeyden yataya döndürüldüğünde.
İlk olarak, iOS 8 geçişin gerçekleşmesine hazırlanmak için bazı kurulumlar yapar. Ardından, sistem geçiş durumuna animasyon ekler. Son olarak, iOS 8 geçiş sırasında gereken geçici durumları temizler.
iOS 8, geliştiricinin aşağıdaki tabloda görüldüğü gibi Özellik Değişikliğine katılmak için kullanabileceği birkaç geri çağırma sağlar:
Aşama | Geri Arama | Açıklama |
---|---|---|
Ayarlama |
|
|
Animasyon | WillTransitionToTraitCollection |
Bu yönteme geçirilen Geçiş Düzenleyicisi, geliştiricinin varsayılan animasyonlarla birlikte yürütülecek animasyonlar eklemesini sağlayan bir AnimateAlongside özelliğe sahiptir. |
Temizleme | WillTransitionToTraitCollection |
Geçiş gerçekleştikten sonra geliştiricilerin kendi temizleme kodlarını eklemesi için bir yöntem sağlar. |
Yöntemi, WillTransitionToTraitCollection
Özellik Koleksiyonu değişiklikleriyle birlikte Görünüm Denetleyicilerinin animasyonunu da oluşturur. WillTransitionToTraitCollection
yöntemi, gibi UIViews
diğer Özellik Ortamlarında değil yalnızca Görünüm Denetleyicilerinde ( UIViewController
) kullanılabilir.
TraitCollectionDidChange
, geliştiricinin UIView
özellikler değiştikçe kullanıcı arabirimini güncelleştirmek istediği sınıfla çalışmak için mükemmeldir.
Bölünmüş Görünüm Denetleyicilerini Daraltma
Şimdi Bölünmüş Görünüm Denetleyicisi iki sütundan bir sütun görünümüne daraltıldığında ne olacağına daha yakından bakalım. Bu değişikliğin bir parçası olarak gerçekleşmesi gereken iki işlem vardır:
- Varsayılan olarak Bölünmüş Görünüm Denetleyicisi, daraltma gerçekleştikten sonra görünüm olarak birincil görünüm denetleyicisini kullanır. Geliştirici, yöntemini
UISplitViewControllerDelegate
geçersiz kılarakGetPrimaryViewControllerForCollapsingSplitViewController
ve daraltılmış durumda görüntülemek istediği herhangi bir Görünüm Denetleyicisi sağlayarak bu davranışı geçersiz kılabilir. - İkincil Görünüm Denetleyicisi'nin Birincil Görünüm Denetleyicisi ile birleştirilmesi gerekir. Genellikle geliştiricinin bu adım için herhangi bir işlem gerçekleştirmesi gerekmez; Bölünmüş Görünüm Denetleyicisi, donanım cihazına göre bu aşamanın otomatik olarak işlenmesini içerir. Ancak, geliştiricinin bu değişiklikle etkileşime geçmek isteyeceği bazı özel durumlar olabilir. yöntemini çağırmak
CollapseSecondViewController
UISplitViewControllerDelegate
, ayrıntılar görünümü yerine, daraltma gerçekleştiğinde ana görünüm denetleyicisinin görüntülenmesini sağlar.
Bölünmüş Görünüm Denetleyicisini Genişletme
Şimdi Bölünmüş Görünüm Denetleyicisi daraltılmış durumdan genişletildiğinde ne olduğuna daha yakından bakalım. Bir kez daha, gerçekleşmesi gereken iki aşama vardır:
- İlk olarak yeni Birincil Görünüm Denetleyicisi'ni tanımlayın. Varsayılan olarak Bölünmüş Görünüm Denetleyicisi, daraltılmış görünümden Birincil Görünüm Denetleyicisi'ni otomatik olarak kullanır. Geliştirici yine yöntemini
UISplitViewControllerDelegate
kullanarakGetPrimaryViewControllerForExpandingSplitViewController
bu davranışı geçersiz kılabilir. - Birincil Görünüm Denetleyicisi seçildikten sonra İkincil Görünüm Denetleyicisi yeniden oluşturulmalıdır. Bölünmüş Görünüm Denetleyicisi de donanım cihazına göre bu aşamanın otomatik olarak işlenmesini içerir. Geliştirici, yöntemini
UISplitViewControllerDelegate
çağırarakSeparateSecondaryViewController
bu davranışı geçersiz kılabilir.
Bölünmüş Görünüm Denetleyicisi'nde Birincil Görünüm Denetleyicisi, ve yöntemlerini UISplitViewControllerDelegate
uygulayarak görünümlerin genişletilmesinde ve SeparateSecondaryViewController
daraltılmasında CollapseSecondViewController
bir rol oynar. UINavigationController
İkincil Görünüm denetleyicisini otomatik olarak göndermek ve açmak için bu yöntemleri uygular.
Görünüm Denetleyicilerini Gösterme
Apple'ın iOS 8'de yaptığı bir diğer değişiklik de geliştiricinin Görünüm Denetleyicileri'ni göstermesidir. Geçmişte, uygulamanın Yaprak Görünüm Denetleyicisi (Tablo Görünümü Denetleyicisi gibi) varsa ve geliştirici farklı bir görünüm göstermişse (örneğin, bir hücreye dokunan kullanıcıya yanıt olarak), uygulama denetleyici hiyerarşisi üzerinden Gezinti Görünümü Denetleyicisi'ne geri ulaşır ve yeni görünümü görüntülemek için yöntemi buna karşı çağırırdı PushViewController
.
Bu, Gezinti Denetleyicisi ile içinde çalıştığı ortam arasında çok sıkı bir bağlantı sundu. iOS 8'de Apple, iki yeni yöntem sağlayarak bunu ayrılmıştır:
ShowViewController
– Yeni görünüm denetleyicisini ortamına göre görüntüleyecek şekilde uyarlar. Örneğin, içindeUINavigationController
yalnızca yeni görünümü yığına iter. Bölünmüş Görünüm Denetleyicisi'nde, yeni Görünüm Denetleyicisi yeni Birincil Görünüm Denetleyicisi olarak sol tarafta gösterilir. Kapsayıcı görünümü denetleyicisi yoksa, yeni görünüm Kalıcı Görünüm Denetleyicisi olarak görüntülenir.ShowDetailViewController
– ile benzerShowViewController
şekilde çalışır, ancak ayrıntılar görünümünü geçirilmekte olan yeni Görünüm Denetleyicisi ile değiştirmek için Bölünmüş Görünüm Denetleyicisi'nde uygulanır. Bölünmüş Görünüm Denetleyicisi daraltılırsa (i Telefon Uygulamasında görülebileceği gibi), çağrı yöntemineShowViewController
yönlendirilir ve yeni görünüm Birincil Görünüm Denetleyicisi olarak gösterilir. Yine, kapsayıcı görünümü denetleyicisi yoksa, yeni görünüm Kalıcı Görünüm Denetleyicisi olarak görüntülenir.
Bu yöntemler Yaprak Görünüm Denetleyicisi'nde başlayıp yeni görünümün görünümünü işlemek için doğru kapsayıcı görünümü denetleyicisini bulana kadar görünüm hiyerarşisinde ilerletilerek çalışır.
Geliştiriciler kendi özel Görünüm Denetleyicilerinde ve uygulayarak ShowViewController
ve UISplitViewController
ile sunulan otomatik işlevlerin UINavigationController
aynısını elde edebilir.ShowDetailViewController
Nasıl çalışır?
Bu bölümde, bu yöntemlerin iOS 8'de nasıl uygulandığına göz atacağız. İlk olarak yeni GetTargetForAction
yönteme bakalım:
Bu yöntem, doğru kapsayıcı görünümü denetleyicisi bulunana kadar hiyerarşi zincirini gösterir. Örneğin:
- Bir
ShowViewController
yöntem çağrılırsa, bu yöntemi uygulayan zincirdeki ilk Görünüm Denetleyicisi Gezinti Denetleyicisi'dir, bu nedenle yeni görünümün üst öğesi olarak kullanılır. - Bunun yerine bir
ShowDetailViewController
yöntem çağrıldıysa, Bunu uygulayan ilk Görünüm Denetleyicisi Bölünmüş Görünüm Denetleyicisi olduğundan üst öğe olarak kullanılır.
yöntemi, GetTargetForAction
belirli bir Eylem uygulayan bir Görünüm Denetleyicisi bularak ve ardından bu Görünüm Denetleyicisi'ne bu eylemi almak isteyip istemediğini sorarak çalışır. Bu yöntem genel olduğundan, geliştiriciler yerleşik ve ShowDetailViewController
yöntemleri gibi ShowViewController
işlev gösteren kendi özel yöntemlerini oluşturabilir.
Uyarlamalı Sunu
iOS 8'de Apple, Popover Presentations'ı ( UIPopoverPresentationController
) da uyarlamalı hale getirmiştir. Bu nedenle, Bir Popover Sunu Görünümü Denetleyicisi normal bir Popover Görünümünü Normal Boyut Sınıfında otomatik olarak sunar, ancak yatay olarak kompakt bir Boyut Sınıfında (i Telefon gibi) tam ekran olarak görüntüler.
Birleşik görsel taslak sistemindeki değişikliklere uyum sağlamak için, sunulan Görünüm Denetleyicilerini yönetmek için yeni bir denetleyici nesnesi oluşturulmuştur— UIPresentationController
. Bu denetleyici, Görünüm Denetleyicisi'nin sunulduğu zamandan kapatılana kadar oluşturulur. Bir yönetim sınıfı olduğundan, Görünüm Denetleyicisi'ni etkileyen cihaz değişikliklerine (yönlendirme gibi) yanıt verdiği ve ardından Görünüm Denetleyicisi'ne Sunu Denetleyicisi denetimlerine geri beslenen bir süper sınıf olarak kabul edilebilir.
Geliştirici yöntemini kullanarak bir Görünüm Denetleyicisi sunduğunda PresentViewController
, sunu işleminin yönetimi öğesine UIKit
devredilir. UIKit, oluşturulan stil için doğru denetleyiciyi (diğer şeylerin yanında) işler ve tek istisna, Görünüm Denetleyicisi'nin stili olarak UIModalPresentationCustom
ayarlanmış olmasıdır. Burada uygulama, denetleyiciyi kullanmak yerine kendi PresentationController'ını UIKit
sağlayabilir.
Özel Sunu Stilleri
Özel bir sunu stiliyle, geliştiriciler özel bir Sunu Denetleyicisi kullanma seçeneğine sahiptir. Bu özel denetleyici, müttefik olduğu Görünümün görünümünü ve davranışını değiştirmek için kullanılabilir.
Boyut Sınıfları ile Çalışma
Bu makaleye dahil edilen Uyarlamalı Fotoğraflar Xamarin Projesi, iOS 8 Birleşik Arabirim uygulamasında Boyut Sınıflarını ve Uyarlamalı Görünüm Denetleyicilerini kullanmanın çalışma örneğini verir.
Uygulama kullanıcı arabirimini tamamen koddan oluştururken, Xcode'un Arabirim Oluşturucusu'nu kullanarak Birleşik Görsel Taslak oluşturmanın aksine, aynı teknikler geçerlidir.
Şimdi Uyarlamalı Fotoğraflar projesinin Uyarlamalı Uygulama oluşturmak için iOS 8'deki Boyut Sınıfı özelliklerinden birkaçını nasıl uyguladığına daha yakından bakalım.
Özellik Ortamı Değişikliklerine Uyum Sağlama
Uyarlamalı Fotoğraflar uygulamasını i Telefon üzerinde çalıştırırken, kullanıcı cihazı dikeyden yataya döndürdüğünde Bölünmüş Görünüm Denetleyicisi hem ana hem de ayrıntılar görünümünü görüntüler:
Bu, Görünüm Denetleyicisi'nin yöntemini geçersiz kılarak UpdateConstraintsForTraitCollection
ve kısıtlamaları değerini VerticalSizeClass
temel alarak ayarlayarak gerçekleştirilir. Örneğin:
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 ());
}
Geçiş Animasyonları Ekleme
Uyarlamalı Fotoğraflar uygulamasındaki Bölünmüş Görünüm Denetleyicisi daraltılmıştan genişletilmişe geçtiğinde, görünüm denetleyicisinin yöntemi geçersiz kılınarak WillTransitionToTraitCollection
animasyonlar varsayılan animasyonlara eklenir. Örneğin:
public override void WillTransitionToTraitCollection (UITraitCollection traitCollection, IUIViewControllerTransitionCoordinator coordinator)
{
base.WillTransitionToTraitCollection (traitCollection, coordinator);
coordinator.AnimateAlongsideTransition ((UIViewControllerTransitionCoordinatorContext) => {
UpdateConstraintsForTraitCollection (traitCollection);
View.SetNeedsLayout ();
}, (UIViewControllerTransitionCoordinatorContext) => {
});
}
Özellik Ortamını Geçersiz Kılma
Yukarıda gösterildiği gibi Uyarlamalı Fotoğraflar uygulaması, i Telefon cihazı yatay görünümde olduğunda Bölünmüş Görünüm Denetleyicisi'ni hem ayrıntıları hem de ana görünümleri görüntülemeye zorlar.
Bu, Görünüm Denetleyicisi'nde aşağıdaki kod kullanılarak gerçekleştirilir:
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);
}
Bölünmüş Görünüm Denetleyicisini Genişletme ve Daraltma
Şimdi Bölünmüş Görünüm Denetleyicisi'nin genişletme ve daraltma davranışının Xamarin'de nasıl uygulandığını inceleyelim. AppDelegate
içinde Bölünmüş Görünüm Denetleyicisi oluşturulduğunda, bu değişiklikleri işlemek için temsilcisi atanır:
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 ();
}
}
Yöntem, SeparateSecondaryViewController
bir fotoğrafın görüntülenip görüntülenmediğini test eder ve bu duruma göre işlem uygular. Hiçbir fotoğraf gösterilmiyorsa, İkincil Görünüm Denetleyicisi'ni daraltarak Ana Görünüm Denetleyicisi'nin görüntülenmesini sağlar.
Bu CollapseSecondViewController
yöntem, yığında herhangi bir fotoğraf olup olmadığını görmek için Bölünmüş Görünüm Denetleyicisi genişletilirken kullanılır ve bu durumda bu görünüme geri daraltılır.
Görünüm Denetleyicileri Arasında Geçiş
Şimdi Uyarlamalı Fotoğraflar uygulamasının görünüm denetleyicileri arasında nasıl hareket etmesine göz atalım. AAPLConversationViewController
sınıfında, kullanıcı tablodan bir hücre seçtiğindeShowDetailViewController
, ayrıntılar görünümünü görüntülemek için yöntemi çağrılır:
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);
}
Açıklama Göstergelerini Görüntüleme
Uyarlamalı Fotoğraf uygulamasında, Özellik Ortamındaki değişikliklere göre Açıklama Göstergelerinin gizlendiği veya gösterildiği birkaç yer vardır. Bu, aşağıdaki kodla işlenir:
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;
}
}
Bunlar, yukarıda ayrıntılı olarak açıklanan yöntem kullanılarak GetTargetViewControllerForAction
uygulanır.
Tablo Görünümü Denetleyicisi verileri görüntülerken, bir gönderimin gerçekleşip gerçekleşmeyeceğini ve Açıklama Göstergesinin uygun şekilde görüntülenip görüntülenmeyeceğini veya gizlenmeyeceğini görmek için yukarıda uygulanan yöntemleri kullanır:
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;
}
Yeni ShowDetailTargetDidChangeNotification
Tür
Apple, Bölünmüş Görünüm Denetleyicisi ShowDetailTargetDidChangeNotification
içinden Boyut Sınıfları ve Özellik Ortamları ile çalışmak için yeni bir bildirim türü ekledi. Bölünmüş Görünüm Denetleyicisi için hedef Ayrıntı Görünümü değiştiğinde (örneğin, denetleyici genişletildiğinde veya daraltıldığında) bu bildirim gönderilir.
Uyarlamalı Fotoğraflar uygulaması, Ayrıntı Görünümü Denetleyicisi değiştiğinde Açıklama Göstergesinin durumunu güncelleştirmek için bu bildirimi kullanır:
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
TableView.RegisterClassForCellReuse (typeof(UITableViewCell), AAPLListTableViewControllerCellIdentifier);
NSNotificationCenter.DefaultCenter.AddObserver (this, new Selector ("showDetailTargetDidChange:"),
UIViewController.ShowDetailTargetDidChangeNotification, null);
ClearsSelectionOnViewWillAppear = false;
}
Xamarin.iOS'ta Kolayca Birleşik Uygulama oluşturmak için Boyut Sınıfları, Özellik Koleksiyonları ve Uyarlamalı Görünüm Denetleyicilerinin kullanılabilmesinin tüm yollarını görmek için Uyarlamalı Fotoğraflar uygulamasına daha yakından bakın.
Birleşik Görsel Taslaklar
iOS 8'de yeni eklenen Birleşik Görsel Taslaklar, geliştiricinin birden çok Boyut Sınıfını hedefleyerek hem i Telefon hem de iPad cihazlarında görüntülenebilen tek bir birleşik görsel taslak dosyası oluşturmasına olanak tanır. Geliştirici, Birleşik Görsel Taslakları kullanarak daha az kullanıcı arabirimine özgü kod yazar ve oluşturmak ve korumak için yalnızca bir arabirim tasarımına sahiptir.
Birleşik Görsel Taslaklarının başlıca avantajları şunlardır:
- i Telefon ve iPad için aynı görsel taslak dosyasını kullanın.
- iOS 6 ve iOS 7'ye geriye doğru dağıtın.
- Farklı cihazlar, yönlendirmeler ve işletim sistemi sürümleri için düzenin önizlemesini görüntüleme.
Boyut Sınıflarını Etkinleştirme
Varsayılan olarak, tüm yeni Xamarin.iOS projeleri boyut sınıflarını kullanır. Eski bir projedeki görsel taslak içinde Boyut Sınıflarını ve Uyarlamalı Segue'leri kullanmak için, önce Xcode 6 Birleşik Görsel Taslak biçimine dönüştürülmelidir ve görsel taslaklarınız için Xcode Dosya Denetçisi'nin içinde Boyut Sınıflarını Kullan onay kutusu seçilidir.
Dinamik Başlatma Ekranları
Başlatma ekranı dosyası, kullanıcıya uygulamanın gerçekten başlatıldığına ilişkin geri bildirim sağlamak için bir iOS uygulaması başlatılırken giriş ekranı olarak görüntülenir. iOS 8'in öncesinde, geliştiricinin her cihaz türü, yönlendirmesi ve uygulamanın üzerinde çalıştıracağı ekran çözünürlüğü için birden çok Default.png
görüntü varlığı içermesi gerekirdi. Örneğin, Default@2x.png
, Default-Landscape@2x~ipad.png
, Default-Portrait@2x~ipad.png
vb.
Yeni i Telefon 6 ve i Telefon 6 Plus cihazları (ve yaklaşan Apple Watch) tüm mevcut i Telefon ve iPad cihazlarıyla dikkate alan bu, oluşturulması ve korunması gereken başlangıç ekranı görüntü varlıklarının çeşitli boyut, yönlendirme ve çözünürlüklerinden oluşan Default.png
geniş bir diziyi temsil eder. Buna ek olarak, bu dosyalar oldukça büyük olabilir ve teslim edilebilir uygulama paketini "şişirir", uygulamayı iTunes App Store'dan indirmek için gereken süreyi artırır (muhtemelen hücresel ağ üzerinden teslim edilebilmesini engeller) ve son kullanıcının cihazında gereken depolama miktarını artırır.
iOS 8'de yeni olan geliştirici, Xcode'da Otomatik Düzen ve Boyut Sınıflarını kullanarak her cihaz, çözünürlük ve yönlendirme için çalışacak bir Dinamik Başlatma Ekranı oluşturan tek bir atomik .xib
dosya oluşturabilir. Bu, geliştiricinin gerekli tüm görüntü varlıklarını oluşturup bakımını yapmak için gereken çalışma miktarını azaltmakla kalmaz, aynı zamanda uygulamanın yüklü paketinin boyutunu da büyük ölçüde azaltır.
Dinamik Başlatma Ekranları aşağıdaki sınırlamalara ve dikkat edilmesi gereken noktalara sahiptir:
- Yalnızca
UIKit
sınıfları kullanın. - veya
UIViewController
nesnesi olan tek birUIView
kök görünüm kullanın. - Uygulamanın koduna bağlantı yapmayın (Eylemler veya Çıkışlar eklemeyin).
- Nesne eklemeyin
UIWebView
. - Özel sınıf kullanmayın.
- Çalışma zamanı özniteliklerini kullanmayın.
Yukarıdaki yönergeleri göz önünde bulundurarak mevcut bir Xamarin iOS 8 projesine Dinamik Başlatma Ekranı eklemeye göz atalım.
Aşağıdakileri yapın:
Mac için Visual Studio açın ve Dinamik Başlatma Ekranı'nı eklemek için Çözümü yükleyin.
Çözüm Gezgini dosyaya
MainStoryboard.storyboard
sağ tıklayın ve Xcode Arabirim Oluşturucusu ile>Aç'ı seçin:Xcode'da Dosya Yeni>Dosya>... seçeneğini belirleyin:
iOS>Kullanıcı Arabirimi>Başlatma Ekranı'nıseçin ve İleri düğmesine tıklayın:
Dosyayı
LaunchScreen.xib
adlandırın ve Oluştur düğmesine tıklayın:Grafik öğeleri ekleyerek ve bunları belirli cihazlar, yönlendirmeler ve ekran boyutları için konumlandırmak için Düzen Kısıtlamaları'nı kullanarak başlatma ekranının tasarımını düzenleyin:
değişiklikleri olarak
LaunchScreen.xib
kaydedin.Uygulamalar Hedefi'nive Genel sekmesini seçin:
Info.plist Seç düğmesine tıklayın, Xamarin uygulaması için öğesini seçin
Info.plist
ve Seç düğmesine tıklayın:Uygulama Simgeleri ve Görüntüleri Başlat bölümünde Ekran Dosyasını Başlat açılan listesini açın ve yukarıda oluşturulanı
LaunchScreen.xib
seçin:Dosyadaki değişiklikleri kaydedin ve Mac için Visual Studio dönün.
Mac için Visual Studio Xcode ile değişiklikleri eşitlemeyi tamamlanmasını bekleyin.
Çözüm Gezgini Kaynak klasörüne sağ tıklayın ve Dosya Ekle...'yi>seçin:
LaunchScreen.xib
Yukarıda oluşturulan dosyayı seçin ve Aç düğmesine tıklayın:Uygulamayı oluşturun.
Dinamik Başlatma Ekranını Test Etme
Mac için Visual Studio'da i Telefon 4 Retina simülatörünü seçin ve uygulamayı çalıştırın. Dinamik Başlatma Ekranı doğru biçimde ve yönde görüntülenir:
uygulamayı Mac için Visual Studio'da durdurun ve bir iPad iOS 8 cihazı seçin. Uygulamayı çalıştırdığınızda başlatma ekranı bu cihaz ve yönlendirme için doğru biçimlendirilir:
Mac için Visual Studio dönün ve uygulamanın çalışmasını durdurun.
iOS 7 ile çalışma
iOS 7 ile geriye dönük uyumluluğu korumak için, iOS 8 uygulamasında normal Default.png
görüntü varlıklarını normal şekilde dahil edin. iOS, bir iOS 7 cihazında çalışırken önceki davranışa döner ve bu dosyaları başlangıç ekranı olarak kullanır.
Özet
Bu makale, Boyut Sınıfları'na ve i Telefon ve iPad cihazlarında düzeni nasıl etkilediklerine hızlı bir bakış attı. Birleştirilmiş Arabirimler oluşturmak için Özellik, Özellik Ortamları ve Özellik Koleksiyonlarının Boyut Sınıfları ile nasıl çalıştığı anlatıldı. Uyarlamalı Görünüm Denetleyicilerine ve Birleşik Arabirimlerin içindeki Boyut Sınıfları ile nasıl çalıştıklarına kısaca göz attı. Xamarin iOS 8 uygulamasının içindeki C# kodundan Boyut Sınıflarını ve Birleşik Arabirimleri uygulamayı inceledi.
Son olarak, bu makalede her iOS 8 cihazında başlangıç ekranı olarak görüntülenecek tek bir Dinamik Başlatma Ekranı oluşturmayla ilgili temel bilgiler ele alınmıştır.