SORU
29 EKİM 2014, ÇARŞAMBA


İPad portre ve Manzara Modları için boyutlandırma sınıfı

Ben temelde benim subviews farklı konumlandırılmış göre iPad yönünü (Dikey veya Yatay) bağlı olması Boyutlandırma Sınıfları Güncellemelerinden 6 tanıtıldı kullanarak istiyorum. Elimde bulunan çok sayıda öğreticiler açıklayan nasıl farklı boyutlandırma sınıfları için kullanılabilir İPhone dikey ve yatay üzerinde İB ama ancak orada galiba yok o kapak tek yatay veya dikey modları için iPad İB. Herkes yardımcı olabilir?

CEVAP
1 ŞUBAT 2015, Pazar


Görünüyor Apple'ın niyetine tedavi hem de iPad yönelimleri gibi ... ama gibi bir sayı bizi bulma, çok meşru tasarımı sebep istiyor değişir UI düzeni için iPad Portre vs iPad Manzara.

Ne yazık ki, geçerli işletim sistemi yok gibi gözüküyor sağlamak ve desteklemek için bu ayrım ... yani yine başa döndük manipüle otomatik düzeni kısıtlamaları kodu veya benzer çözümler elde etmek için ne yapmalıyız ideal olacaktır almak için ücretsiz kullanarak Adaptif UI.

Değil zarif bir çözüm.

Apple zaten İB ve UİKit yerleşik orada kaldıraç için bir yol sihirli boyutu bir sınıf kullanmak için değilbizim seçmebelirli bir yönlendirme mi?

~

Sorun hakkında düşünme, daha genel olarak, bu 'büyüklük sınıfları' sadece yol çalışma süresinde gerektiği gibi kullanılabilir, böylece İB saklanan, birden fazla düzenleri çözüm bulmak olduğunu fark ettim

Aslında, 'size sınıf gerçekten numaralandırma değerleri sadece bir çift vardır. Uİİnterface.h:

typedef NS_ENUM(NSInteger, UIUserInterfaceSizeClass) {
    UIUserInterfaceSizeClassUnspecified = 0,
    UIUserInterfaceSizeClassCompact     = 1,
    UIUserInterfaceSizeClassRegular     = 2,
} NS_ENUM_AVAILABLE_IOS(8_0);

Apple karar verdi ne olursa olsunadıbu farklı varyasyonlar, temelde, sadece bir tamsayı, İB içinde saklı bir düzen ayırmak için bir tür benzersiz bir tanımlayıcı olarak kullanılan bir çift onlar.

Şimdi, başka bir düzene (kullanılmamış büyüklükte bir sınıf kullanarak) İB .. demek oluşturduğumuz düşünürken, iPad Portre için ... cihazı kullanmak için bir yoldurbizim tercihimizzamanında gerektiği gibi boyutu sınıf (UI düzeni)?

Bu sorunun birkaç farklı (daha az) zarif yaklaşımlar denedikten sonra, varsayılan boyutu sınıf Program aracılığıyla geçersiz kılmak için bir yol olabilir diye şüphelendim. Ve orada (UİViewController.h):

// Call to modify the trait collection for child view controllers.
- (void)setOverrideTraitCollection:(UITraitCollection *)collection forChildViewController:(UIViewController *)childViewController NS_AVAILABLE_IOS(8_0);
- (UITraitCollection *)overrideTraitCollectionForChildViewController:(UIViewController *)childViewController NS_AVAILABLE_IOS(8_0);

Bu nedenle, eğer sen-ebilmek paketi görünümü denetleyicisi hiyerarşi olarak bir 'çocuk' görünümü denetleyicisi, ve eklemek için bir üst düzey üst görünüm denetleyicisi ... sonra koşullu olarak geçersiz kılma, çocuğun içine düşünce o farklı bir boyut sınıf daha etkin olduğu bir işletim sistemi.

İşte bu örnek bir uygulama, '' denetleyici görünüm: . üst

@interface RDTraitCollectionOverrideViewController : UIViewController {
    BOOL _willTransitionToPortrait;
    UITraitCollection *_traitCollection_CompactRegular;
    UITraitCollection *_traitCollection_AnyAny;
}
@end

@implementation RDTraitCollectionOverrideViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self setUpReferenceSizeClasses];
}

- (void)setUpReferenceSizeClasses {
    UITraitCollection *traitCollection_hCompact = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassCompact];
    UITraitCollection *traitCollection_vRegular = [UITraitCollection traitCollectionWithVerticalSizeClass:UIUserInterfaceSizeClassRegular];
    _traitCollection_CompactRegular = [UITraitCollection traitCollectionWithTraitsFromCollections:@[traitCollection_hCompact, traitCollection_vRegular]];

    UITraitCollection *traitCollection_hAny = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassUnspecified];
    UITraitCollection *traitCollection_vAny = [UITraitCollection traitCollectionWithVerticalSizeClass:UIUserInterfaceSizeClassUnspecified];
    _traitCollection_AnyAny = [UITraitCollection traitCollectionWithTraitsFromCollections:@[traitCollection_hAny, traitCollection_vAny]];
}

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    _willTransitionToPortrait = self.view.frame.size.height > self.view.frame.size.width;
}

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
    _willTransitionToPortrait = size.height > size.width;
}

-(UITraitCollection *)overrideTraitCollectionForChildViewController:(UIViewController *)childViewController {
    UITraitCollection *traitCollectionForOverride = _willTransitionToPortrait ? _traitCollection_CompactRegular : _traitCollection_AnyAny;
    return traitCollectionForOverride;
}
@end

İşe yaradı olup olmadığını görmek için hızlı bir demo, özel etiketler için özel olarak ekledim 'Normal/Normal' ve 'Kompakt/' İB çocuk denetleyici düzeni sürümleri: . Düzenli olarak

enter image description here enter image description here

Ve burada iPad iki yönleri olduğunda çalışıyor gibi görünüyor. enter image description here enter image description here

Voila! Özel çalışma zamanında sınıf yapılandırmaları boyutu.

Umarım Apple, bu işletim sisteminin bir sonraki sürümünde gereksiz hale getirecek. Bu arada, bu program aracılığıyla otomatik düzeni ile dalga kısıtlamaları veya kod diğer manipülasyonlar yapmaktan daha zarif ve ölçülebilir bir yaklaşım olabilir.

~

EDİT(6/4/15): örnek yukarıdaki kod aslında teknik göstermek için kavramının bir kanıtı olduğunu unutmayın Lütfen. Kendi özel uygulama için gerektiği gibi adapte etmeye çekinmeyin.

~

EDİT(7/24/15): yukarıdaki açıklama sorunu açıklığa işe yarıyor sevindirici. Test etmedim ederken, mohamede1945 kod [aşağıda] pratik amaçlar için yararlı bir optimizasyon gibi görünüyor. Bunu test etmek için çekinmeyin ve bize ne düşündüğünüzü bildirin. (Tamlık faiz,-yukarıdaki örnek kod bırakıyorum.)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 30GB

    30GB

    14 AĞUSTOS 2006
  • FOSDEM

    FOSDEM

    13 Ocak 2009
  • Kat Krazy

    Kat Krazy

    12 Kasım 2010