2013-07-10 11 views
14

Orada bu sınıflar UIKit uygulanmışsa beri UITableView s gibi unsurlar iOS 7'deiOS 7, UI öğelerini, hangi SDK ile derlediğinize bağlı olarak farklı görmeleri için nasıl uygular?

Bu stil çalışma zamanında belirlenir üzerinde farklı bir tarza sahip UINavigationBar s, vardır ve UIKit zamanında dinamik olarak uygulama ile bağlantılıdır statik olarak derleme zamanında değil.

Dolayısıyla, iOS 7'de çalıştırılan tüm uygulamaların bu öğeler iOS 7'de nasıl göründüğüne bakacağını düşünürdüm. Ancak, iOS 7 ile derlenene kadar iOS 6'da kullandıkları aynı stili kullanmaya devam ediyorlar. SDK. Bazıları hariç bu Benim tek açıklama Onlar böyle tür bir şey yapmak olduğunu

(UIAlertView veya UIMenuController gibi): bunlar muhafaza tutmak için gereken nedeni

#define SDKApplicationWasLinkedAgainst ... 
if (SDKApplicationWasLinkedAgainst < 7.0) 
    ... 
else 
    ... 

Bu, tabii ki gerçekten hantal eski kod çok. Yani merak ediyorum, bu gerçekten kaputun altında neler oluyor? Neyi kaçırıyorum?

+5

@Unicorn: Doğru, ancak NDA tarafından kapsanan iOS 7'ye özgü herhangi bir şey sormuyor. Bu soru, ** iOS'un ** iki sürümü için geçerli olabilir. – lnafziger

+2

Ne yazık ki, Apple'da bir kod yazıcısı değilseniz, gerçekten Apple ™ 'ın nasıl yaptığı sorusunu cevaplayamazsınız. Biraz fikir edinebilirsin * bir yol * diye sorduğunda ** sen yapabilsin diye soruyu cevaplayabilirsin. – lnafziger

+2

Bu, Apple'da çalışmıyor olsanız bile yanıtlanabilir ve bu bir fikir olmaz: bir kolej, nasıl bir şekilde sökme yaptığını öğrendiler. –

cevap

9

, sadece evet, onlar şu çağrısından sonucun kapalı tabanlı görünümünü ve davranışını conditionalizing açıkça belirtmeniz istiyorum sırayla, bağlı UIKit'in sürümüne bağlı olarak bir sonuç döndürdüğümü varsaydığım GSApplicationUsesLegacyUI() numaralı telefonu arar.

Bu, evet, onlar UIKit'in mirası için bölümlerini koşullandıran anlamına gelir. Bunun iyi bir şey olduğundan emin değiliz, ama yapmaya karar verdikleri şey buydu.

-1

Emin olamam ama bu nasıl yapıldığına dair bir tahmin. Uygulamanızın hangi SDK sürümüne bağlı olduğunu bildiğinden, iOS 7 cihazlarındaki çerçeveyi çıkarırlar. Yani dosya sisteminde /.../iPhoneOS6.1.sdk/.../Frameworks/UIKit satırlarında bir hiyerarşi var. Ardından, uygulamanızı yüklediğinde, uygulamanızın bağlantılı olduğu SDK'yı işaret edecek kütüphaneler için arama yolunu ayarlayabilirler.

Xcode şu anda bunu nasıl yapıyor? Xcode paketinin içindeki Geliştirici dizininin içinde bir SDK dizini bulunur; bu da buna karşılık olarak bağlanacak tüm farklı SDK'ları içerir.

+0

Bu olası bir fikir gibi geliyor, ancak farklı görünmesi gereken bazı şeyler olduğundan dolayı olamaz. "UIActionSheet", "UIAlertView", "UIMenuController" gibi ... –

+0

Bu durumda, iOS 7 cihazları önceki SDK'ların görünümünü güncelleyebilir. İşletim sistemi sürümünün eski SDK'ları hiçbir şekilde güncelleyemediğini belirten hiçbir şey yok. Bu, işletim sisteminin SDK'nın daha yeni sürümleriyle yeniden ilişkilendirilmesini gerektirmeden, SDK'nın küçük sürümler (6.0.1, 6.0.2, vb.) Için nasıl güncellenebileceğidir. SDK'nın (6.1 gibi) yeni sürümlerini güncellemenin tek nedeni, bu sürümde tanıtılan yeni malzemelerin kullanılması olacaktır. – Streeter

+0

Gerçekten yaptıklarımdan şüphe ettim: P Eski SDK'yı yeniden derlemek? İstedikleri şey, mantıklı olmayan eski uygulamaları bozmamak için geriye dönük uyumluluk. –

4

Bahisim, framework compatibility versions kullanıyor.

Uygulamanızı her derlediğinizde, uygulamanız uyumluluk sürümü ve geçerli sürümü ile belirli bir çerçeveye göre bağlanır. otool -L YourApp.app/YourApp çalıştırırsanız bu sayıları görebilirsiniz. Örneğin, bir süre önce derlenmiş bir uygulama için bu elde:

/System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 751.58.0) 
/System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 1500.0.0) 

Eğer UIKit çerçevesinin tam yolu sürümleri bir çift boyunca, Mach-O ikili saklanır (ve özel olarak bir de görebileceğiniz gibi o anda derlediğim versiyon).

IOS 7'nin UIKit sürümünün her ikisine de sahip olacağını varsayalım: iOS6'dan ilgili sürümle işaretlenmiş ve 1.0.0'dan itibaren uyumluluk ve iOS7'den de 1500.0.0'dan daha yüksek bir şeyle uyumlu olarak işaretlenmiş olan iOS 6.1.3 için bu sayı olup olmadığını bilmiyorum, ama siz fikir edin).

sizin iOS6 ikili yüklendiğinde, onun kütüphane bağımlılıkları dyld tarafından okunur ve current version 1500.0.0 diyerek derlenmiş çünkü, çözülmüş, ve iOS 7 için kitaplık

iOS 6 için kütüphaneye karşı bağlantılı olacak, compatibility version 1501.0.0 diyor

Bir çerçeve aynı zamanda bir paket olduğu için, tüm kaynaklar mükemmel bir şekilde içerilir ve yalnızca doğru sürüm tarafından kullanılır ve iOS 6 SDK veya iOS 7 SDK'sine karşı derleme yaptığınızda farklı görsel öğelerin farklı görünmesi bu şekilde olur.

Yanılıyor olabilirim, ama umarim ki önerdiğiniz kod tekniğini kullanmıyorlar, çünkü bu, sürdürülecek berbat bir kod tabanı olacaktır.,

_UIApplicationUsesLegacyUI() 

Bu fonksiyon: Çok fazla NDA'd topraklarına girmeden

+0

iOS'un aynı çerçevenin birden çok sürümü ile geldiğini düşünmüyorum. Örneğinizde, 1501.0.0 sürümü, 1500.0.0 sürümüyle geriye dönük olarak uyumludur. Ancak doğru şekilde söylediğiniz gibi, uygulamanın bağlı olduğu sürüm numarası ikiliye kaydedilir, böylece çalışma zamanında kontrol edilebilir. –

+0

Bu, bazı sınıfların neden yeni görünüme sahip olduğunu (örneğin, "UIAlertView") –

+0

@MartinR: çalışma zamanında kontrol etmenin hala mümkün olmadığını açıklamayacaktır, ancak ikili ikili dosyaların kolayca ele alınabileceğini düşünüyorum. Apple'ın geçiş dönemlerinde yapması gerekenleri yapmak zorunda kalsaydım, bu kontrolleri çalışma zamanında yapmamayı seçerim. – yonosoytu

İlgili konular