UIView'ın structs düzeninin altında bulunan iOS 6/7 Delta özelliğini fark ettim.
Bu ne için ve bu neden AutoLayout'ta eksik?
UIView'ın structs düzeninin altında bulunan iOS 6/7 Delta özelliğini fark ettim.
Bu ne için ve bu neden AutoLayout'ta eksik?
Yanıtlar:
Bu aslında iOS6'dan iOS7'ye yerleşim konumu arasındaki Delta'yı ifade eder.
İOS7'de, bazı görünümler durum çubuğunu gizleyebilir veya şeffaf hale getirebilir ve aslında görünümünüzün üzerine yerleştirilir. Dolayısıyla, iOS6'da (0.0, 0.0) değerine bir UI öğesi koyarsanız, durum çubuğunun altında görünecek, ancak iOS7'de durum çubuğunun altında kısmen kapalı görünecektir. Bu durumda, düzenin iOS6 ve iOS7'de aynı görünmesi için durum çubuğu yüksekliğiyle (20,0 puan) eşleşen bir delta olmasını istersiniz.
Otomatik düzen kullanırsanız buna gerek olmadığına inanıyorum, ancak elbette, o zaman çoğumuz bu noktada kabul etmek istemediğimiz iPad1 desteğini kaybedersiniz.
Not: Bu soruyu bir süre önce fark ettim, ancak cevabımı yalnızca NDA kaldırıldığı için gönderiyorum
Fark etmiş olabileceğiniz gibi, iOS 7 yepyeni bir görünüm getiriyor. Kullanıcı arayüzü öğelerinin görünümü değişti, ancak aynı zamanda bazı boyutları (veya genel olarak metrikleri) de değişti. Bu, arayüz tasarımını hem iOS 7'yi hem de öncüllerini biraz zorlaştıracak şekilde yapabilir.
Apple'ın resmi çizgisi, bunu çözmek için Otomatik Yerleşim'i kullanmaktır; bu, sizin için UI öğelerini yerleştirme konusunda çok fazla güçlük çekecektir. Bazen bunu dahil etmek kolay yapılmaz, özellikle de ticari nedenlerle iOS 5'i desteklemeniz gerekiyorsa veya arabirimleriniz AutoLayout uygulamasını zorlaştıracak şekilde yönetiliyorsa. Bu nedenle, Apple bu niş kategoriye girerseniz işinizi biraz daha kolaylaştırmanın bir yolunu sağlamış gibi görünüyor ve bunu iOS 6/7 Deltas olarak adlandırdılar.
Arayüz Oluşturucu'daki etiket, bu bağlamda 'Delta'nın ne anlama geldiğine dair biraz belirsiz olsa da, .xib dosyasında bu özelliğe karşılık gelen kod biraz daha açıktır:
<inset key="insetFor6xAndEarlier" minX="-50" minY="-100" maxX="-50" maxY="300"/>
Anahtar adı, insetFor6xAndEarlier
bunun ne yaptığını açıkça belirtir; iOS 7'nin önceki sürümlerinde çalıştırıldığında UI öğeleri için alternatif eklemeler sağlayabilirsiniz. Örneğin, yukarıdaki delta değişikliğini tanımlar:
x: 50
y: 100
width: -100
height: 200
.Xib dosyasında saklanan değerler, alıntılanan değerlere doğrudan karşılık gelmese de, aralarında bir korelasyon vardır.
x: -minX
y: -minY
width: minX + maxX
height: minY + maxY
Aşağıdaki resimler bu değişikliği görsel olarak göstermektedir. Oldukça uç bir örnek, ancak yeteneğini göstermek için. Pratikte yalnızca birkaç piksellik delta değişikliklerinin olmasını beklerdim.
Değerlerin iOS 6 görünümü için ters olduğunu fark edebilirsiniz; bunun nedeni, deltaların üzerinde çalıştığınız görünümün türüne göre olmasıdır. İOS 6 için düzenleme yapıyorsanız, iOS 7 için öğeyi doğru şekilde dönüştürmek için deltalar vardır (yukarıdaki örneğin tersi).
Farklı stilleri görüntülemek için, üzerinde çalışacağı işletim sistemine göre Interface Builder'ın sunma şeklini değiştirebilirsiniz. Bu, Dosya Denetçisi-> Arayüz Oluşturucu Belgesinde (sağ çubuktaki 1. sekme) şu şekilde bulunur:
Doğrudan değil, ancak kodunuzdaki işletim sistemi sürümü üzerinde koşullu kontroller yaparak ve buna göre doğru konumu / boyutu ayarlayarak aynı etkiyi kolayca elde edebilirsiniz. Delta yeteneği, Arayüz Oluşturucu'da mevcuttur, çünkü bunu yapacak koda gerek kalmadan koşullu konumlandırmaya sahip olmanın doğrudan bir yolu yoktur ve Arayüz Oluşturucunun amacı, UI için mümkün olduğunca çok sayıda kodu yoldan çıkarmaktır.
Apple, Otomatik Yerleşimi kullanmanızı şiddetle tavsiye eder, çoğu durumda hayatınızı kolaylaştırır. Kullanamıyorsanız (yukarıda belirtilen nedenlerle) deltalar, kullanıcı arabirimi öğelerinizi kodda manuel olarak yeniden konumlandırmaya gerek kalmadan mevcut işletim sisteminin ölçümlerine göre uygun şekilde konumlandırma esnekliği sağlar. İyi bir örnek, durum çubuğunun eksikliğini ayarlamaktır, ancak birçok başka kullanım durumu vardır.
Doğal olarak, yalnızca iOS7 ve üzeri için geliştirme yapıyorsanız, bu özelliği bilmenize gerek yok / keşfetmeyeceksiniz. Yalnızca uygulamanızı iOS7 SDK ile derlendiğinde, otomatik düzen olmadan çalıştıran iOS6 cihazlarına ihtiyacınız varsa, deltalara ihtiyacınız var mı?
Yazım sırasında (21 Ağustos), bu özellikle ilgili herhangi bir belge veya WWDC materyalinde herhangi bir söz bulamıyorum. Etrafta bir oyun oynadım ve biraz araştırdıktan sonra keşfettiğim şey buydu.
Bunun zaten yanıtlandığını biliyorum, sadece küçük bir varyant ekleyerek, otomatik düzen kullanmayan ve yine de iOS 6.1 ve önceki sürümleri desteklemek isteyenlere yardımcı olabileceğini umuyorum.
Bu Apple'ın Geçiş Kılavuzunu okuyun - Önceki sürümü destekler
"Farklı Görüntüle" yi "iOS 7.0 ve Daha Sonra" olarak seçin
İOS 7 için Temel Kullanıcı Arayüzü. İOS 6 için uygun delta değerini verin. Bunun iOS 7 ve iOS 6 cihazında nasıl işleneceğini görmek için önizlemeyi kullanın.
Hızlı adımlar:
Kök görünümünün hemen alt öğelerinin her birini ayrı ayrı seçin ve "Y" değerine 20 piksel ekleyin.
Ardından, tüm yakın çocukları seçin ve delta Y'yi -20px olarak verin. Bunu toplu olarak veya tek tek de yapabilirsiniz.
Otomatik Yerleşim, en az iOS 6.0 gerektirir. İOS 5.0'ı desteklemek istiyorsanız, Otomatik Yerleşimi kullanamazsınız.
Ve bu deltalar, farklı iOS sürümlerinde (özellikle iOS 7 ve 7'den düşük iOS sürümü) görünüm konumunu ayarlamanıza yardımcı olmak için kullanılır.
Bu değeri, bu resmi beğenmeme yardımcı olmak için kullanıyorum.
İOS 6/7 Delta'yı çalışırken görmek için, hem iOS 6 hem de iOS 7 cihazlarında düzgün görünen bir SegmentedControl ile demo yapacağım.
Önce, Storyboard'da .Xib veya ViewController'ınızı seçin. İşaretini kaldırın Kullanım autoLayout ve "seçeneğini 7 ve iOS olarak görüntüle "
Arayüz Oluşturucu tuvalinde, SegmentedControl'unuzu origin.y 20 olacak şekilde yerleştirin. İOS 6/7 Delta'da DeltaY için -20'yi seçin.
Bu, SegmentedControl'ün hem iOS 6 hem de iOS 7 cihazlarında Durum Çubuğunun altına yerleştirilmesini sağlayacaktır.
Geliştirici Kılavuzundan iOS 7 Durum Çubuğu'na başka bir faydalı alıntı
Deltalar, her görünüm için ayrı ayrı ayarlanabilir ve beklediğiniz gibi çalışır. Film şeridiniz veya ucunuz iOS 6 olarak görüntülenecek şekilde ayarlandıysa, deltaları ayarlamak, iOS 7'de çalıştırıldığında bu görünümün ayarlanan delta miktarına göre kaydırılmasına ve / veya yeniden boyutlandırılmasına neden olur. Alternatif olarak, film şeridiniz veya ucunuz görüntülemeye ayarlanmışsa iOS 7'de, iOS 6'da çalıştırıldığında deltalar uygulanacaktır.
AutoLayout kullanıyorsanız, Delta kullanılamaz. Bunu deneyin (iOS6 çalıştıran iPhone 4s'de test edilmiştir):
- (void) viewWillLayoutSubviews {
//iOS 6 workaround offset
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 7) {
self.view.clipsToBounds = YES;
CGRect screenRect = [[UIScreen mainScreen] bounds];
CGFloat screenHeight = 0.0;
screenHeight = screenRect.size.width;
CGRect screenFrame = CGRectMake(0, -20, self.view.frame.size.width,self.view.frame.size.height+10);
self.view.frame = screenFrame;
}
}