2013-05-28 8 views
7

Tek bir özel görünüme sahip bir görünüm denetleyicim var; Özel görünüm Çekirdek Grafikler kullanarak bir oyun tahtası çizer. (Başka hiçbir alt görüĢme söz konusu değildir.)Niçin süper görüşmeyle görüşmem moda olarak sunulduğunda (Otomatik Düzenleme kullanılarak) küçülüyor?

Oyun tahtasının süper görünümünü doldurması için Otomatik Düzen kısıtlamalarını ayarlıyorum. Görünüm denetleyicisini kök görüntüleme denetleyicisi olarak ayarladığımda, oyun tahtası (ve süper görüntü) ekranımı doldurur; Ancak, görüntü denetleyicisini moda olarak sunduğumda, oyun tahtası (ve süper görüntü) hiçbir şey/minimum değere küçülür ve Otomatik Düzen izlemesi yerleşimin belirsiz olduğunu bildirir.

Soruyu açıklamak için basitleştirilmiş bir test vakası yazdım.

İşte yeşil arka plan ile üst düzey bir görünümü olan benim BoardViewController, ancak kırmızı bir arka plan ile tek bir geniş alt görünümü oluşturur. Bu görünüm denetleyicisi devraldığında ekranı tüm kırmızı görmek istiyorum:

- (void)loadView 
{ 
    UIView *mainView = [[UIView alloc] init]; 
    mainView.translatesAutoresizingMaskIntoConstraints = NO; 
    mainView.backgroundColor = [UIColor greenColor]; 

    UIView *subView = [[UIView alloc] init]; 
    subView.translatesAutoresizingMaskIntoConstraints = NO; 
    subView.backgroundColor = [UIColor redColor]; 

    [mainView addSubview:subView]; 
    self.view = mainView; 

    NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(subView); 
    NSArray *c1 = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[subView(>=10)]|" 
                 options:0 
                 metrics:nil 
                  views:viewsDictionary]; 
    NSArray *c2 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[subView(>=10)]|" 
                 options:0 
                 metrics:nil 
                  views:viewsDictionary]; 
    [self.view addConstraints:c1]; 
    [self.view addConstraints:c2]; 
} 

benim kök görünümü denetleyicisi olarak belirledi, sonra benim güzel kırmızı oyun tahtası ve ekranı kaplar bkz. Farklı Otomatik Düzen kuralları denemeye devam

- (void)loadView 
{ 
    UIView *rootView = [[UIView alloc] init]; 
    rootView.translatesAutoresizingMaskIntoConstraints = NO; 

    UIButton *presentButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    presentButton.translatesAutoresizingMaskIntoConstraints = NO; 
    [presentButton setTitle:@"Present" forState:UIControlStateNormal]; 
    [presentButton addTarget:self 
        action:@selector(present:) 
      forControlEvents:UIControlEventTouchUpInside]; 

    [rootView addSubview:presentButton]; 
    self.view = rootView; 

    [rootView addConstraint:[NSLayoutConstraint constraintWithItem:presentButton 
                 attribute:NSLayoutAttributeCenterX 
                 relatedBy:NSLayoutRelationEqual 
                  toItem:rootView 
                 attribute:NSLayoutAttributeCenterX 
                 multiplier:1.0 
                 constant:0.0]]; 
    [rootView addConstraint:[NSLayoutConstraint constraintWithItem:presentButton 
                 attribute:NSLayoutAttributeCenterY 
                 relatedBy:NSLayoutRelationEqual 
                  toItem:rootView 
                  attribute:NSLayoutAttributeCenterY 
                 multiplier:1.0 
                 constant:0.0]]; 
} 

- (void)present:(id)sender 
{ 
    BoardViewController *bvc = [[BoardViewController alloc] init]; 
    [self presentViewController:bvc animated:YES completion:NULL]; 
} 

, ancak hiçbir yaparsam yapayım, ben oyunu alamayan: Farklı RootViewController dan BoardViewController sunmak Ancak, oyun tahtası asgari 10x10 kare küçülür Görünüm denetleyicisi, moda sunulduğunda ekranı doldurmak için. (Aynı zamanda bu soruyu soruyorum, çalışma zamanını belirsiz olduğunu düşündüğüm şeyleri anlatmaya çalışıyorum. Ama bu hata ayıklama henüz çok iyi değilim, bu yüzden benim sorum burada.)

cevap

2

Kaldır: ilginç

mainView.translatesAutoresizingMaskIntoConstraints = NO;

çalıştığını söyledi. Bu görünüm presentViewController kullanarak modally sunulduğunda bunları ihtiyacı olmayan bir UIWindow ait rootViewController olarak ayarlandığında, görünüşe bazı araştırmadan sonra

+0

Parlak! Teşekkür ederim! Bu yüzden, açıklama: En üst düzey görüşümün düzeni ile yanlış bir şekilde uğraştım, ki bu da beni bana sunan kimsenin konusudur. Bu durumda, presentViewController: animate: completion: '(varsayalım), yayları ve struts kullanarak görünümlerini ekler, ben de kırdım. Bunu açıklamanın adil bir yolu mu? –

+0

Gördüğüm kadarıyla bir pencerenin rootViewController 'olmasının kısıtlamaları atlayan özel bir durum olduğu görünüyor.'MainView.translatesAutoresizingMaskIntoConstraints = NO;' içinde bırakırsanız ve el ile bazı kısıtlamalar eklemek için 'updateConstraints' öğesini uygularsanız ne olacağını deneyimlemek ilginç olacaktır ... –

+0

[self.view translatesAutoresizingMaskIntoConstraints] değerinin dökümünü denedim viewDidAppear'da: hem modal sunumu hem de root-view-controller olarak ayarlanmıştır. Her iki durumda da YES'i terk etti. Belki de, bir görünüm denetleyicisi sunarken, kök görünümü denetleyicisi olarak bir görünümü açıkça kendi çerçevesini ayarlar. –

2

... onun Superview ilişkilendirilerek kısıtlamaları olması bekleniyor, ancak ima Bir modal görünüm denetleyicisini tam ekrana bastığınızda ve animasyon tamamlandığında, görüntüleme görünümü denetleyicisi, görünümü ile birlikte görünüm hiyerarşisinden kaldırılır. Beklendiği gibi, görünüm kısıtlamaları kaldırılıyor. Modal view denetleyicisini reddettikten sonra, orijinal viewcontroller kendi bakış açısıyla tekrar gelir, ancak kısıtlar ortadan kalkar ve sistem tarafından kaydedilmez ve geri yüklenmez. Bu bir böcek. IOS7'de bile. NSAutoresizingConstraints işlevinin kullanılmasının nedeni, görüntüleme sisteminin kısıtlamaları kendi başlarına yeniden yapabilmesinin nedenidir.

Bir yan not olarak: iç içe geçmiş görünümlü bir kurulumunuz varsa (örn. Bir dış denetleyici bir gezinme denetleyicisi gömer), bunları alt görünüm denetleyicisi modeli kullanarak bağlayabilirsiniz. Bunu yaptıysanız, en üstteki viewController görünümü yukarıda anlattığım şekilde kaldırılıyor. Bu, NSAutoresizingConstraints yamasını en üstteki denetleyiciye (genellikle windows root viewcontroller) uygulamanız ve her yerde standart kısıtlamaları kullanmanız gerektiği anlamına gelir.

İlgili konular