Xamarin. iOS içindeki Birleşik film şeritleri

iOS 8; Birleşik film şeridi için Kullanıcı arabirimi oluşturmaya yönelik yeni, daha basit bir mekanizma içerir. Farklı donanım ekran boyutlarının tümünü kapsayan tek bir görsel taslağa sahip olan hızlı ve hızlı hale getirme görünümleri "tasarım-bir kez, kullanım-çok" stilde oluşturulabilir.

geliştiricinin artık iPhone ve iPad cihazları için ayrı ve özel bir görsel taslak oluşturması gerekmediği için, ortak bir arabirimle uygulama tasarlama esnekliği vardır ve bu arabirimi farklı boyut sınıfları için özelleştirebilirsiniz. Bu şekilde, bir uygulama her form faktörünün güçlerine uyarlanabilirler ve her bir kullanıcı arabirimi en iyi deneyimi sağlamak üzere ayarlanabilir.

Boyut sınıfları

iOS 8 ' den önceki bir geliştirici, UIInterfaceOrientationUIInterfaceIdiom dikey ve yatay modlarını ve iPhone ile iPad cihazları arasında ayrım yapmak için kullanılır. İOS8 ' 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 (örneğin, iPad) veya büyük boyutlu izlenimi veren bir araç (örneğin,
  • Compact : Bu daha küçük cihazlara (örneğin, iPhone) yöneliktir. Bu boyut, cihazın yönüne göre hesaba girer.

İki kavram birlikte kullanılırsa, sonuç aşağıdaki diyagramda görüldüğü gibi, her iki farklı yönde kullanılabilecek farklı boyutları tanımlayan 2 x 2 ızgaradır:

Düzenli ve kompakt yönte kullanılabilen farklı boyutları tanımlayan 2 x 2 kılavuz

Geliştirici, farklı düzenlerine (yukarıdaki grafiklerde görüldüğü gibi) neden olacak dört olasılıktan herhangi birini kullanan bir görünüm denetleyicisi oluşturabilir.

iPad boyut sınıfları

boyut nedeniyle iPad her iki yönde için normal sınıf boyutu vardır.

iPad boyut sınıfları

iPhone boyut sınıfları

iPhone, cihazın yönüne göre farklı boyut sınıflarına sahiptir:

iPhone boyut sınıfları

  • Cihaz dikey moddayken, ekranda yatay ve normal dikey bir Compact sınıfı vardır
  • Cihaz yatay moddayken, ekran sınıfları dikey moddan ters çevrilir.

iPhone 6 Plus boyut sınıfları

Boyutlar, dikey yönlendirmeyle, ancak yatay olarak farklılık yaparken, önceki IPhone ile aynıdır:

iPhone 6 Plus boyut sınıfları

iPhone 6 Plus, yeterince büyük bir ekran içerdiğinden, yatay modda düzenli bir genişlik boyutu sınıfına sahip olabilir.

Yeni ekran ölçeği desteği

iPhone 6 Plus, ekran ölçeği faktörü 3,0 olan yeni bir Retina HD ekran kullanır (özgün iPhone ekran çözünürlüğünden üç kez). Bu cihazlarda mümkün olan en iyi deneyimi sağlamak için, bu ekran ölçeğinde tasarlanan yeni resmi dahil edin. Xcode 6 ve üzeri sürümlerde, varlık katalogları 1x, 2x ve 3x boyutlarında görüntüler içerebilir; yeni görüntü varlıklarını eklemeniz yeterlidir ve iOS iPhone 6 Plus üzerinde çalışırken doğru varlıkları seçer.

İOS 'daki görüntü yükleme davranışı, @3x görüntü dosyalarındaki bir soneki de tanır. Örneğin, geliştirici uygulamanın paketinde aşağıdaki dosya adlarıyla bir görüntü varlığı (farklı çözünürlükte) içeriyorsa: MonkeyIcon.png , MonkeyIcon@2x.png ve MonkeyIcon@3x.png . iPhone 6 ' da, MonkeyIcon@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ı, bir iOS uygulaması, uygulamanın gerçekten başladığı kullanıcıya geri bildirim sağlamak için başlatılırken bir giriş ekranı olarak görüntülenir. İOS 8 ' den önce geliştirici, Default.png uygulamanın üzerinde çalıştığı her cihaz türü, Yönlendirme ve ekran çözünürlüğü için birden çok görüntü varlığı içermelidir.

İOS 8 ' de yeni olan geliştirici, .xib her cihaz, çözüm ve yönlendirme için çalışacak .xib oluşturmak için otomatik düzen ve boyut sınıfları kullanan Xcode 'da tek bir atomik dosya oluşturabilir. Bu, tüm gerekli görüntü varlıklarını oluşturmak ve sürdürmek için geliştiricinin gerektirdiği çalışma miktarını azaltır, ancak uygulamanın yüklü paket boyutunu azaltır.

Lerdir

Nitelikleri, bir düzenin ortamı değiştiğinde nasıl değiştiği tespit etmek için kullanılabilen özelliklerdir. Bunlar, bir dizi Özellik ( HorizontalSizeClass ve VerticalSizeClass temel UIUserInterfaceSizeClass ) ve arabirim IOM ( UIUserInterfaceIdiom ) ve görüntüleme ölçeğini içerir.

Yukarıdaki tüm durumlar, Apple 'ın nitelik Collection () olarak başvurduğu bir kapsayıcıda ( UITraitCollection ), yalnızca özellikleri değil, ancak değerlerini de içermez.

Nitelik ortamı

Nitelik ortamları iOS 8 ' de yeni bir arabirimdir ve aşağıdaki nesneler için bir nitelik koleksiyonu döndürebiliyor:

  • Ekranlar ( UIScreens ).
  • Windows ( UIWindows ).
  • Görüntüleme denetleyicileri ( UIViewController ).
  • Görünümler ( UIView ).
  • Sunum denetleyicisi ( UIPresentationController ).

Geliştirici bir kullanıcı arabiriminin nasıl yerleştirileceğini anlamak için bir nitelik ortamı tarafından döndürülen nitelik koleksiyonunu kullanır.

Tüm nitelik ortamları, aşağıdaki diyagramda görüldüğü gibi bir hiyerarşi yapar:

Nitelik ortamları hiyerarşi diyagramı

Yukarıdaki nitelik ortamlarının her birinin nitelik koleksiyonu, varsayılan olarak üst öğeden alt ortama akacaktır.

Nitelik ortamı, geçerli nitelik koleksiyonunu almaya ek olarak, TraitCollectionDidChange görünüm veya Görünüm denetleyicisi alt sınıflarında geçersiz kılınabilen bir yöntemi vardır. Geliştirici, bu nitelikleri değiştirildiğinde nitelikleri temel alan kullanıcı arabirimi öğelerinden herhangi birini değiştirmek için bu yöntemi kullanabilir.

Tipik nitelik koleksiyonları

Bu bölümde, kullanıcının iOS 8 ile çalışırken deneyilecekleri nitelik koleksiyonların tipik türleri ele alınacaktır.

Aşağıda, geliştiricinin bir iPhone görebileceği tipik bir nitelik koleksiyonu verilmiştir:

Özellik Değer
HorizontalSizeClass Sıkıştırabilirsiniz
VerticalSizeClass Düzenli
UserInterfaceIdom Telefon
DisplayScale 2.0

Yukarıdaki küme, tüm nitelik özellikleri için değerler içerdiğinden, tam nitelikli bir nitelik koleksiyonunu temsil eder.

Bazı değerleri eksik olan bir nitelik koleksiyonu (Apple tarafından belirtilmemişolarak ifade edilir) olması da mümkündür:

Özellik Değer
HorizontalSizeClass Sıkıştırabilirsiniz
VerticalSizeClass Belirtilmemiş
UserInterfaceIdom Belirtilmemiş
DisplayScale Belirtilmemiş

Ancak, geliştirici nitelik ortamında nitelik koleksiyonu istediğinde, yukarıdaki örnekte görüldüğü gibi tam nitelikli bir koleksiyon döndürür.

Bir nitelik ortamı (bir 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 nitelik özelliği için belirtilmeyen değerleri geri alabilir.

Geliştirici, UITraitCollection.FromHorizontalSizeClass Yeni bir koleksiyon oluşturmak için gibi Apple tarafından sunulan oluşturma yöntemlerinden birini kullandıklarında kısmen nitelenmiş bir nitelik koleksiyonu da alır.

Birden çok nitelik koleksiyonunda gerçekleştirilebilecek bir işlem, bir tane varsa bir nitelik koleksiyonu isteyip istemediğinizi içeren birbirleriyle kıyaslanmasını sağlar. Kapsama göre amaçlanan, ikinci koleksiyonda belirtilen tüm nitelik için, değerin ilk koleksiyondaki değerle tam olarak eşleşmesi gerekir.

İki nitelikleri test etmek için, test ContainsUITraitCollection edilecek nitelik değerini geçen yöntemi kullanın.

Geliştirici, görünümleri veya görünüm denetleyicilerini nasıl düzenleyeceğini belirleyebilmek üzere kodda el ile karşılaştırmaları gerçekleştirebilir. Ancak, UIKit Bu yöntemi, görünüm proxy 'sinde olduğu gibi, bazı işlevlerini sağlamak için dahili olarak kullanır.

Görünüm ara sunucusu

Görünüm ara sunucusu, geliştiricilerin görünümlerinin özelliklerini özelleştirmesini sağlamak için iOS 'un önceki sürümlerinde tanıtılmıştır. İOS 8 ' de nitelik koleksiyonlarını destekleyecek şekilde genişletilmiştir.

Artık görünüm proxy 'Leri, AppearanceForTraitCollection verilen nitelik koleksiyonu için yeni bir görünüm ara sunucusu döndüren yeni bir yöntemi içerir. Geliştiricinin o görünüm proxy üzerinde gerçekleştirdiği tüm özelleştirmeler yalnızca belirtilen nitelik koleksiyonuna uyan görünümlerde etkili olur.

Genellikle geliştirici, kısmen belirtilen bir nitelik koleksiyonunu AppearanceForTraitCollection yöntemine (örneğin, yatay boyutta bir sıkıştırma sınıfı belirttikleri gibi), böylece yatay olarak sıkıştırılmış uygulamadaki herhangi bir görünümü özelleştirebilecekleri şekilde geçer.

Uıımage

Apple 'ın nitelik koleksiyonu eklediği başka bir sınıf UIImage . Geçmişte, geliştiricinin uygulamaya dahil ettikleri herhangi bir bit eşlemli grafik varlığının @1X ve @2x sürümünü belirtmesi gerekiyordu (örneğin, bir simge).

iOS 8, geliştiricinin bir nitelik koleksiyonunu temel alan bir görüntü kataloğuna bir görüntünün birden çok sürümünü eklemesine olanak tanımak için genişletilmiştir. Örneğin, geliştirici Compact nitelik sınıfıyla çalışmaya yönelik daha küçük bir görüntü ve başka bir koleksiyon için tam boyutlu bir görüntü içerebilir.

Bir sınıfın içinde görüntülerden biri kullanıldığında UIImageView , görüntü görünümü nitelik koleksiyonu için otomatik olarak görüntünün doğru sürümünü görüntüler. Nitelik ortamı değişirse (cihazı dikeyden yataya değiştiren kullanıcı gibi), görüntü görünümü yeni nitelik koleksiyonuyla eşleşecek 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.

Uıımagevarlık

Apple UIImageAsset , geliştiricilerin görüntü seçimi üzerinde daha fazla denetim sağlamak için adlı iOS 8 ' e yeni bir sınıf ekledi.

Görüntü varlığı bir görüntünün tüm farklı sürümlerini kaydırır ve geliştiricinin geçirilmiş bir nitelik koleksiyonuyla eşleşen belirli bir görüntüyü sormasını sağlar. Görüntüler, bir Görüntü Varlığı'nın bir an önce eklenebilir veya kaldırılabilir.

Görüntü Varlıkları hakkında daha fazla bilgi için Apple'ın UIImageAsset belgelerine bakın.

Nitelik Koleksiyonlarını Birleştirme

Bir geliştiricinin Nitelik Koleksiyonları üzerinde gerçekleştire bir diğer işlevi, birleştirilmiş koleksiyonla sonuçlanacak iki işlev eklemektir. Burada bir koleksiyondan belirtilmeyen değerler, ikinci koleksiyonda belirtilen değerlerle değiştirilir. Bu, sınıfının FromTraitsFromCollections yöntemi kullanılarak UITraitCollection yapılır.

Yukarıda belirtildiği gibi, niteliklerden herhangi biri Nitelik Koleksiyonlarından biri belirtilmemişse ve başka birsinde belirtilirse, değer belirtilen sürüme ayarlanır. Ancak, belirtilen bir değerin birden çok sürümü varsa, son Nitelik Koleksiyonu'dan gelen değer kullanılan değer olur.

Uyarlamalı Görünüm Denetleyicileri

Bu bölüm, iOS Görünüm ve Görünüm Denetleyicilerinin, geliştirici uygulamalarında otomatik olarak daha uyarlamalı olmak için Nitelikler ve Boyut Sınıfları kavramlarını nasıl benimsemiş olduğuyla ilgili ayrıntıları içerir.

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 UISplitViewController sınıfıdır. Geçmişte geliştirici genellikle uygulamanın iPad sürümünde Bölünmüş Görünüm Denetleyicisi kullanırdı ve ardından uygulamanın iPhone sürümü için görünüm hiyerarşisinin tamamen farklı bir iPhone sağlamak zorunda kaldı.

iOS 8'de sınıfı her iki platformda (iPad ve iPhone) kullanılabilir ve bu sayede geliştirici hem iPhone hem de iPad UISplitViewController için çalışır.

Bir iPhone Yatay olduğunda, Bölünmüş Görünüm Denetleyicisi Görünümlerini bir bölmede görüntülendiğinde olduğu gibi yan yana iPad.

Özellikleri Geçersiz Kılma

Nitelik Ortamları, yatay yöndeki bir bölmede bölünmüş Görünüm Denetleyicisini gösteren aşağıdaki grafikte olduğu gibi üst kapsayıcıdan alt kapsayıcılara iPad basamaklanmıştır:

Yatay yöndeki bir iPad Bölme Görünümü Denetleyicisi

Bölme iPad yatay ve dikey yönlerde Normal Boyut Sınıfına sahip olduğu için Bölünmüş Görünüm hem ana hem de ayrıntı görünümlerini görüntüler.

Her iPhone Boyut Sınıfı'nın sıkıştırılmış olduğu bir bölmede, Bölünmüş Görünüm Denetleyicisi aşağıda görülen şekilde yalnızca ayrıntı görünümünü görüntüler:

Bölünmüş Görünüm Denetleyicisi yalnızca ayrıntı görünümünü görüntüler

Geliştiricinin hem ana hem de ayrıntı görünümünü yatay yönlendirmede bir iPhone 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 Nitelik Koleksiyonu'iPhone geçersiz kılması gerekir. Aşağıdaki grafikte de olduğu gibi:

Geliştiricinin Bölünmüş Görünüm Denetleyicisi için bir üst kapsayıcı eklemesi ve Nitelik Koleksiyonunu geçersiz kılması gerekir

, Bölünmüş Görünüm Denetleyicisi'nin üst öğesi olarak ayarlanır ve yöntem yeni bir Nitelik Koleksiyonu geçirme ve Bölünmüş Görünüm Denetleyicisi'nin hedefini hedefleme görünümünde UIViewSetOverrideTraitCollection çağrılır. Yeni Nitelik Koleksiyonu, bölme görünümü denetleyicisinin yatay yöndeki bir görünümde hem ana hem de ayrıntı görünümlerini görüntülemesi için iPhone HorizontalSizeClassRegular geçersiz kılar.

yeni Nitelik Koleksiyonunun üst öğede Nitelik Koleksiyonuna eklenmiştir ve bunun sonucunda alt Bölme Görünümü Denetleyicisi için bir elde VerticalSizeClassunspecifiedCompact VerticalSizeClass edersiniz.

Nitelik Değişiklikleri

Bu bölümde, Nitelik Ortamı değişirken Nitelik Koleksiyonlarının nasıl geçiş yaptığınıza ayrıntılı olarak göz atacağız. Örneğin, cihaz dikeyden yataya döndürülmüşse.

Yatay Nitelik Değişikliklerine dikey bakış

İlk olarak, iOS 8 geçişi yapmak için hazırlık yapar. Ardından, sistem geçiş durumuna animasyonlar sağlar. Son olarak iOS 8, geçiş sırasında gerekli olan geçici durumları temizler.

iOS 8, geliştiricinin nitelik değişikliğine katılmak için aşağıdaki tabloda görülen çeşitli geri çağırmalar sağlar:

Aşama Geri Description
Kurulum
  • WillTransitionToTraitCollection
  • TraitCollectionDidChange
  • Bu yöntem, Bir Nitelik Koleksiyonu yeni değerine ayarlanmadan önce Bir Nitelik Değişikliğinin başlangıcında çağrılır.
  • Nitelik Koleksiyonu'nın değeri değiştiriken ancak herhangi bir animasyon olmadan önce yöntemi çağrılır.
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 AnimateAlongside bir özelliğe sahip.
Temizleme WillTransitionToTraitCollection Geçiş gerçekleştikten sonra geliştiricilerin kendi temizleme kodunu dahil etmek için bir yöntem sağlar.

Yöntemi, WillTransitionToTraitCollection Nitelik Koleksiyonu değişiklikleriyle birlikte Görünüm Denetleyicilerine animasyonu yapmak için harikadır. yöntemi WillTransitionToTraitCollection yalnızca Görünüm Denetleyicilerinde ( ) kullanılabilir ve UIViewController gibi diğer Nitelik Ortamlarında UIViews kullanılamaz.

TraitCollectionDidChange, geliştiricinin nitelikler UIView değişirken kullanıcı arabirimini güncelleştirmek istediği sınıfıyla çalışmak için harikadır.

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ılmışsa ne olacağını 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ölme Görünümü Denetleyicisi, daraltıldıktan sonra görünüm olarak birincil görünüm denetleyicisini kullanır. Geliştirici, yöntemini geçersiz karak ve daraltılmış durumda görüntülemek istediğiniz herhangi bir Görünüm Denetleyicisi sağlayarak GetPrimaryViewControllerForCollapsingSplitViewControllerUISplitViewControllerDelegate bu davranışı geçersiz kılmış olabilir.
  • İkincil Görünüm Denetleyicisinin Birincil Görünüm Denetleyicisi ile birleştirilmiş olmalıdır. Genellikle geliştiricinin bu adım için herhangi bir işlem yapmak zorunda değildir; 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şim kurmak istemesi gereken bazı özel durumlar olabilir. yönteminin CollapseSecondViewControllerUISplitViewControllerDelegate çağrılarak ana görünüm denetleyicisinin daraltılmış durumdayken ayrıntılar görünümü yerine görüntülenebilir.

Bölünmüş Görünüm Denetleyicisini Genişletme

Şimdi Bölünmüş Görünüm Denetleyicisi daraltılmış durumdan genişletilirse ne olacağını 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 Denetleyicisini 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 Denetleyicisini otomatik olarak kullanır. Yine, geliştirici yöntemini kullanarak bu davranışı GetPrimaryViewControllerForExpandingSplitViewController geçersiz UISplitViewControllerDelegate kabilirsiniz.
  • Birincil Görünüm Denetleyicisi seçildikten sonra İkincil Görünüm Denetleyicisinin yeniden oluşturulması gerekir. Burada da Bölünmüş Görünüm Denetleyicisi, donanım cihazına göre bu aşamanın otomatik olarak işlenmesini içerir. Geliştirici, yöntemini çağırarak bu davranışı SeparateSecondaryViewController geçersiz UISplitViewControllerDelegate kabilirsiniz.

Bölünmüş Görünüm Denetleyicisinde Birincil Görünüm Denetleyicisi, ve yöntemlerini kullanarak görünümlerin genişletilmesi ve daraltilmesinde bir CollapseSecondViewControllerSeparateSecondaryViewController rol UISplitViewControllerDelegate oynar. UINavigationController , İkincil Görünüm denetleyicisini otomatik olarak itip doldurmak için bu yöntemleri kullanır.

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 Denetleyicilerini görüntülemesidir. Geçmişte, uygulamanın Yaprak Görünüm Denetleyicisi (Tablo Görünümü Denetleyicisi gibi) varsa ve geliştirici farklı bir denetleyici (örneğin, bir hücreye dokunan kullanıcıya yanıt olarak) gösterse, uygulama denetleyici hiyerarşisi üzerinden Gezinti Görünümü Denetleyicisi'ne geri ulaşacak ve yeni görünümü görüntülemek için yöntemini PushViewController çağıracak.

Bu, Gezinti Denetleyicisi ile içinde çalıştırmış olduğu ortam arasında çok sıkı bir eşleşme sağlanmıştır. iOS 8'de Apple iki yeni yöntem sağlayarak bu yöntemin ayrımlarını yaptı:

  • ShowViewController – Yeni görünüm denetleyicisini ortamına göre görüntülemek için uyarlar. Örneğin, bir UINavigationController içinde yalnızca yeni görünümü yığına iter. Bölünmüş Görünüm Denetleyicisinde, yeni Görünüm Denetleyicisi sol tarafta yeni Birincil Görünüm Denetleyicisi olarak sunulacak. 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 benzer şekilde çalışır, ancak ayrıntılar görünümünü geçirilen yeni Görünüm Denetleyicisi ile değiştirmek için Bölünmüş Görünüm ShowViewController Denetleyicisi'ne uygulanır. Bölünmüş Görünüm Denetleyicisi daraltılmışsa (iPhone Uygulamasında görülebilir), çağrı yöntemine yeniden yönlendirildi ve yeni görünüm Birincil Görünüm Denetleyicisi ShowViewController 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şlayarak çalışır ve 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şisini adım adım gösterir.

Geliştiriciler kendi özel ShowViewControllerShowDetailViewController Görünüm Denetleyicilerinde ve'leri uygulayarak ve ile tarafından aynı otomatik işlevselliği UINavigationController elde etmek için UISplitViewController kullanılabilir.

Nasıl çalışır?

Bu bölümde, bu yöntemlerin iOS 8'de nasıl uygulandığını göz atacak. İlk olarak yeni yöntemine GetTargetForAction bakalım:

Yeni GetTargetForAction yöntemi

Bu yöntem, doğru kapsayıcı görünümü denetleyicisi bulunana kadar hiyerarşi zincirinde yol gösterir. Örnek:

  1. Bir yöntem çağrılırsa, bu yöntemi uygulayan zincirde ilk Görünüm Denetleyicisi Gezinti Denetleyicisi'dir, bu nedenle yeni görünümün ShowViewController üst öğesi olarak kullanılır.
  2. Bunun yerine bir yöntem çağrıldı ise, Bölünmüş Görünüm Denetleyicisi bunu uygulayan ilk ShowDetailViewController Görünüm Denetleyicisidir, bu nedenle üst öğe olarak kullanılır.

yöntemi, verilen eylemi uygulayan bir Görünüm Denetleyicisi bularak ve ardından bu eylemi almak istiyorsa GetTargetForAction Görünüm Denetleyicisi'ne sorarak çalışır. Bu yöntem genel olduğu için, geliştiriciler yerleşik ve yöntemleri gibi çalışan kendi özel yöntemlerini ShowViewControllerShowDetailViewController oluşturabilir.

Uyarlamalı Sunu

iOS 8'de Apple, Açılır Sunuları ( UIPopoverPresentationController ) uyarlamalı olarak da yaptı. Bu nedenle, Bir Açılır Sunu Görünümü Denetleyicisi Normal Boyut Sınıfında otomatik olarak normal bir Açılır Görünüm sunacaktır, ancak bunu yatay olarak sıkıştırılmış bir Boyut Sınıfında (örneğin, bir iPhone) görüntüler.

Birleşik görüntü sistemi içindeki değişiklikleri karşılamak için, sunulan Görünüm Denetleyicilerini ( ) yönetmek için yeni bir denetleyici nesnesi UIPresentationController oluşturulmuştur. Bu denetleyici, Görünüm Denetleyicisi'nin görüntüden çıkarılana kadar oluşturularak oluşturulur. Bir yönetim sınıfı olduğu için, Görünüm Denetleyicisi'nin (yönlendirme gibi) etkileyen cihaz değişikliklerine yanıt olarak Görünüm Denetleyicisi üzerinde bir süper sınıf olarak kabul edilir ve bu da Daha sonra Presentation Controller denetimlerinin Görünüm Denetleyicisi'ne geri beslenir.

Geliştirici yöntemini kullanarak bir Görünüm Denetleyicisi PresentViewController sunsa, sunu işleminin yönetimine teslim UIKit eder. UIKit, oluşturulacak stil için doğru denetleyiciyi işler (diğer şeylerin yanında), tek istisna, Görünüm Denetleyicisi'nin stili olarak ayarlanmış UIModalPresentationCustom olmasıdır. Burada uygulama, denetleyiciyi kullanmak yerine kendi PresentationController'ını UIKit sağlar.

Özel sunu stilleri

Özel sunu stiliyle, geliştiriciler özel bir sunu denetleyicisi kullanma seçeneğine sahiptir. Bu özel denetleyici, bu görünümün, Allied 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ıyla çalışma

bu makalede yer alan uyarlamalı fotoğraflar Xamarin Project, bir iOS 8 birleşik arabirim uygulamasında boyut sınıfları ve uyarlamalı görünüm denetleyicilerini kullanmaya yönelik bir örnek sağlar.

Uygulama kullanıcı arabirimini koddan tamamen oluşturduğunda, Xcode 'un Interface Builder kullanarak Birleşik film şeridi oluşturma işleminin aksine aynı teknikler de geçerlidir.

Şimdi Uyarlamalı fotoğraflar projesinin, bir uyarlamalı uygulama oluşturmak için iOS 8 ' deki boyut sınıfı özelliklerinden birkaçını nasıl uyguladığı konusunda daha yakından bakalım.

Nitelik ortam değişikliklerine uyarlatma

uyarlamalı fotoğraflar uygulamasını bir iPhone ç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:

Bölünmüş görünüm denetleyicisi, burada görüldüğü gibi hem ana hem de Ayrıntılar görünümünü görüntüler

Bu, UpdateConstraintsForTraitCollection Görünüm denetleyicisinin yöntemi geçersiz kılınarak ve ' nin değerine göre kısıtlamaların ayarlanması ile gerçekleştirilir VerticalSizeClass . Örnek:

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ılmadan genişletilmeye geçtiğinde, görünüm denetleyicisinin yöntemi geçersiz kılınarak animasyonlar varsayılan animasyonlara eklenir WillTransitionToTraitCollection . Örnek:

public override void WillTransitionToTraitCollection (UITraitCollection traitCollection, IUIViewControllerTransitionCoordinator coordinator)
{
    base.WillTransitionToTraitCollection (traitCollection, coordinator);
    coordinator.AnimateAlongsideTransition ((UIViewControllerTransitionCoordinatorContext) => {
        UpdateConstraintsForTraitCollection (traitCollection);
        View.SetNeedsLayout ();
    }, (UIViewControllerTransitionCoordinatorContext) => {
    });
}

Nitelik ortamını geçersiz kılma

yukarıda gösterildiği gibi, uyarlamalı fotoğraflar uygulaması, iPhone cihaz yatay görünümdeyse, bölünmüş görünüm denetleyicisini hem ayrıntıları hem de ana görünümleri görüntüleyecek şekilde zorlar.

Bu, görünüm denetleyicisinde aşağıdaki kod kullanılarak gerçekleştirildi:

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

Daha sonra, bölünmüş görünüm denetleyicisinin genişletme ve daraltma davranışının Xamarin 'te nasıl uygulandığını incelim. İçinde, AppDelegate 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 ();
    }
}

SeparateSecondaryViewControllerYöntemi, bir fotoğrafın görüntülenip görüntülenmediğini ve bu duruma göre eylem alıp almamakta olup olmadığını sınar. Hiç fotoğraf gösterilmediğinde, ana görünüm denetleyicisinin görüntülenmesi için Ikincil görünüm denetleyicisini daraltır.

CollapseSecondViewControllerYöntemi, yığın üzerinde herhangi bir fotoğrafın mevcut olup olmadığını görmek için, bu görünüme geri doğru bir şekilde daraldıysanız kullanılır.

Görünüm denetleyicileri arasında dolaşma

Daha sonra, uyarlamalı Fotoğraflar uygulamasının görünüm denetleyicileri arasında nasıl taşındığını göz atalım. AAPLConversationViewControllerKullanıcı tablodan bir hücre seçtiğinde sınıfında, ShowDetailViewController 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, açıklama göstergelerinin gizli olduğu veya nitelik ortamındaki değişikliklere göre 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, GetTargetViewControllerForAction Yukarıdaki ayrıntılarla açıklanan yöntemi kullanılarak uygulanır.

Bir tablo görünümü denetleyicisi verileri görüntülediğinde, bir gönderinin olup olmayacağını ve açıklama göstergesinin uygun şekilde görüntülenip görüntülenmeyeceğini ve 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 içindeki boyut sınıflarıyla ve nitelik ortamlarıyla çalışmak için yeni bir bildirim türü ekledi ShowDetailTargetDidChangeNotification . Bu bildirim, denetleyicinin ne zaman genişlemesine veya daraltılacağını gibi bölünmüş görünüm denetleyicisi için hedef ayrıntı görünümü her değiştiğinde 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;
}

Boyut sınıfları, nitelik koleksiyonları ve Uyarlamalı görünüm denetleyicilerinin, Xamarin. iOS içinde kolayca birleştirilmiş bir uygulama oluşturmak için kullanılabilecek tüm yolları görmek için uyarlamalı Fotoğraflar uygulamasına daha yakından göz atın.

Birleşik Görsel Taslaklar

iOS 8 ' den yeni, birleşik film şeritleri, geliştiricilerin birden çok boyut sınıfını hedefleyerek hem iPhone hem de iPad cihazlarda görüntülenebilen bir, birleştirilmiş görsel taslak dosyası oluşturmasına imkan tanır. Geliştirici, Birleşik film şeritleri kullanarak daha az Kullanıcı arabirimine özel kod yazar ve oluşturmak ve sürdürmek için yalnızca bir arabirim tasarımına sahiptir.

Birleşik film şeritleri için önemli yararlar şunlardır:

  • iPhone ve iPad için aynı film şeridi dosyasını kullanın.
  • İOS 6 ve iOS 7 ' ye geriye doğru dağıtın.
  • Farklı cihazlar, yönler ve işletim sistemi sürümlerinin yerleşimini önizleyin.

Boyut sınıflarını etkinleştirme

Varsayılan olarak, tüm yeni Xamarin. iOS projeleri boyut sınıflarını kullanır. Daha eski bir projeden bir film şeridi içindeki boyut sınıflarını ve Uyarlamalı segues 'yi kullanmak için, ilk olarak Xcode 6 Birleşik film şeridi biçimine dönüştürülmesi gerekir ve film şeritleriniz için Xcode dosya denetçisi içinde boyut sınıflarını kullan onay kutusu seçilidir.

Dinamik başlatma ekranları

Başlatma ekranı dosyası, bir iOS uygulaması, uygulamanın gerçekten başladığı kullanıcıya geri bildirim sağlamak için başlatılırken bir giriş ekranı olarak görüntülenir. İOS 8 ' den önce geliştirici, Default.png uygulamanın üzerinde çalıştığı her cihaz türü, Yönlendirme ve ekran çözünürlüğü için birden çok görüntü varlığı içermelidir. Örneğin,, Default@2x.png , Default-Landscape@2x~ipad.pngDefault-Portrait@2x~ipad.png vb.

yeni iPhone 6 ve iPhone 6 Plus cihazlarda (ve yaklaşan Apple Watch), tüm mevcut iPhone ve iPad cihazlara sahip olan, bu, Default.png oluşturulması ve saklanması gereken başlangıç ekranı görüntü varlıklarının büyük bir dizisini, yönünü ve çözümlerini temsil eder. Ayrıca, bu dosyalar çok büyük olabilir ve teslim edilebilir uygulama paketi ' ni "bloat" olarak, uygulamayı iTunes App Store 'dan indirmek için gereken süreyi artırır (büyük olasılıkla bir hücresel ağ üzerinden teslim edilmeden) ve son kullanıcının cihazında gereken depolama alanı miktarını artırır.

İOS 8 ' de yeni olan geliştirici, .xib her cihaz, çözüm ve yönlendirme için çalışacak .xib oluşturmak için otomatik düzen ve boyut sınıfları kullanan Xcode 'da tek bir atomik dosya oluşturabilir. Bu, tüm gerekli görüntü varlıklarını oluşturmak ve sürdürmek için geliştiricinin gerektirdiği çalışma miktarını azaltır, ancak uygulamanın yüklü paket boyutunu büyük ölçüde azaltır.

Dinamik başlatma ekranları aşağıdaki sınırlamalara ve noktalara sahiptir:

  • Yalnızca UIKit sınıfları kullanın.
  • Veya nesnesi olan tek bir kök görünümü kullanın UIViewUIViewController .
  • Uygulamanın koduna herhangi bir bağlantı yapmayın ( eylem ekleme veya aykırı izinverme).
  • Nesne eklemeyin UIWebView .
  • Herhangi bir özel sınıf kullanmayın.
  • Çalışma zamanı özniteliklerini kullanmayın.

Yukarıdaki yönergeleri göz önünde bulundurarak, var olan bir Xamarin iOS 8 projesine dinamik başlatma ekranı ekleme bölümüne bakalım.

Şunları yapın:

  1. Mac için Visual Studio açın ve dinamik başlatma ekranını eklemek için çözümü yükleyin.

  2. Çözüm Gezgini, dosyaya sağ tıklayın ve Xcode Interface Builderaç ' ı seçin:

    Xcode Interface Builder açın

  3. Xcode 'da DosyaYenidosya...öğesini seçin:

    Dosya/yeni seçin

  4. İOSKullanıcı arabirimibaşlatma ekranını seçin ve İleri düğmesine tıklayın:

    İOS/Kullanıcı arabirimi/başlatma ekranını seçin

  5. Dosyayı adlandırın LaunchScreen.xib ve LaunchScreen.xib düğmesine tıklayın:

    Dosyayı LaunchScreen. XIB olarak adlandırın

  6. Grafik öğeleri ekleyerek ve bunları verilen cihazlar, yönler ve ekran boyutları için konumlandırmak üzere Düzen kısıtlamalarını kullanarak başlatma ekranının tasarımını düzenleyin:

    Başlatma ekranının tasarımını Düzenle

  7. Değişiklikleri kaydedin LaunchScreen.xib .

  8. Uygulamalar hedefini ve genel sekmesini seçin:

    Uygulamalar hedefini ve Genel sekmesini seçin

  9. Info. plist Seç düğmesine tıklayın, Xamarin uygulaması için öğesini seçin ve Seç düğmesine tıklayın:

    Xamarin uygulaması için Info. plist ' i seçin

  10. Uygulama simgeleri ve başlatma görüntüleri bölümünde, ekran dosyası açılır menüsünü açın ve yukarıda oluşturulan öğesini seçin:

    LaunchScreen. XIB 'yi seçin

  11. değişiklikleri dosyaya kaydedin ve Mac için Visual Studio geri dönün.

  12. Mac için Visual Studio değişikliklerin xcode ile eşitlenmesini tamamlamasını bekleyin.

  13. Çözüm Gezgini, kaynak klasörüne sağ tıklayın ve Dosya Ekle...öğesini seçin:

    Dosya Ekle/Ekle seçeneğini belirleyin...

  14. LaunchScreen.xibYukarıda oluşturulan dosyayı seçin ve LaunchScreen.xib düğmesine tıklayın:

    LaunchScreen. XIB dosyasını seçin

  15. Uygulamayı derleyin.

Dinamik başlatma ekranını test etme

Mac için Visual Studio, iPhone 4 Retina simülatör ' ı seçin ve uygulamayı çalıştırın. Dinamik başlatma ekranı, doğru biçimde ve yönlendirmede görüntülenir:

Dikey yönde görünen dinamik başlatma ekranı

Mac için Visual Studio 'da uygulamayı durdurun ve bir iPad iOS 8 cihazı seçin. Uygulamayı çalıştırın ve başlatma ekranı bu cihaz ve yönlendirme için doğru şekilde biçimlendirilir:

Yatay yönde görünen dinamik başlatma ekranı

Mac için Visual Studio dönün ve uygulamanın çalışmasını durdurun.

İOS 7 ile çalışma

İOS 7 ile geriye dönük uyumluluğu sürdürmek için, normal Default.png görüntü varlıklarını iOS 8 uygulamasına normal olarak eklemeniz yeterlidir. iOS, önceki davranışa döner ve iOS 7 cihazında çalışırken başlangıç ekranı olarak bu dosyaları kullanır.

Xamarin'de Dinamik Başlatma Ekranı uygulamasını görmek için bu belgeye eklenmiş olan Dinamik Başlatma Ekranları örnek iOS 8 uygulamasına bakın.

Özet

Bu makalede Boyut Sınıfları ve bunların cihaz ve cihaz iPhone iPad göz atlanmıştır. Nitelikler, Nitelik Ortamları ve Nitelik Koleksiyonlarının Birleşik Arabirimler oluşturmak için Boyut Sınıfları ile nasıl birlikte çalışmalarına yer verilmektedir. Uyarlamalı Görünüm Denetleyicileri'ne ve Bunların Birleşik Arabirimler içindeki Boyut Sınıfları ile nasıl çalışmalarına kısa bir bakış. Boyut Sınıflarını ve Birleşik Arabirimleri bir Xamarin iOS 8 uygulamasının içindeki C# kodundan tamamen 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şturmanın temelleri ele yer almaktadır.