5

Otomatik yayınlama etkinleştirilmiş bir hikaye panosunda ortaya konan bir görünüm denetleyicim var ve görünümümün yatay olarak dönmesine ve ekrandaki düğmeleri yeniden düzenlemesine izin vermek için kısıtlamaları değiştirmenin bir yolunu arıyorum. Aşağıdaki kodu denediğimde, gerçekten deşifre edemediğim "kısıtları tatmin edemeyen, kısıtlamayan ..." iki düzine kadar aldım.UIStoryboard, kısıtlılıkları programlı olarak nasıl değiştirilir?

Programatik olarak belirttiğim kısıtlamaları olan bir hikaye tahtasındaki kısıtlamaları dinamik olarak değiştirmenin bir yolu var mı? Hikaye panosunda tanımladığım düğmelerin düzenini tamamen geçersiz kılmak istiyorum. Rob cevap Güncelleme

-(void)updateViewConstraints 
{ 
    [super updateViewConstraints]; 

    self.loginButton.translatesAutoresizingMaskIntoConstraints = NO; 
    self.getStartedButton.translatesAutoresizingMaskIntoConstraints = NO; 
    self.takeTourButton.translatesAutoresizingMaskIntoConstraints = NO; 



    [self.loginButton removeConstraints:self.loginButton.constraints]; 
    [self.getStartedButton removeConstraints:self.getStartedButton.constraints]; 
    [self.takeTourButton removeConstraints:self.takeTourButton.constraints]; 


    one = self.loginButton; 
    two = self.getStartedButton; 
    three = self.takeTourButton; 


    NSDictionary *metrics = @{@"height":@50.0,@"width":@100.0,@"leftSpacing":@110.0}; 
    NSDictionary *views = NSDictionaryOfVariableBindings(one,two,three); 

    [self.view removeConstraints:activeTestLabelConstraints]; 
    [activeTestLabelConstraints removeAllObjects]; 

    if(isRotatingToLandscape) 
    { 

     [self registerConstraintsWithVisualFormat:@"|-[one(two)]-[two(three)]-[three]-|" options:NSLayoutFormatAlignAllTop | NSLayoutFormatAlignAllBottom metrics:metrics views:views]; 
     [self registerConstraintsWithVisualFormat:@"V:[one(height)]-|" options:0 metrics:metrics views:views]; 

    }else 
    { 

     [self registerConstraintsWithVisualFormat:@"|-leftSpacing-[one(width)]" options:0 metrics:metrics views:views]; 
     [self registerConstraintsWithVisualFormat:@"[two(width)]" options:0 metrics:metrics views:views]; 
     [self registerConstraintsWithVisualFormat:@"[three(width)]" options:0 metrics:metrics views:views]; 
     [self registerConstraintsWithVisualFormat:@"V:[one(height)]-[two(75)]-[three(100)]-|" options:NSLayoutFormatAlignAllCenterX metrics:metrics views:views]; 
    } 


} 

, burada sadece bir görünümde tüm kısıtlamaları kaldırmak istediğiniz gibi geliyor ben

-(void)removeConstraintForView:(UIView*)viewToModify 
{ 

    UIView* temp = viewToModify; 
    [temp removeFromSuperview]; 
    [self.view addSubview:temp]; 

} 

cevap

10

kullanmak kısıtlamaları kaldırmak için bir yöntem. Bir görünüm üzerindeki kısıtlar genellikle görüşün bir atası tarafından tutulduğundan, tüm kısıtlamaların nasıl kolayca kaldırılacağı açık değildir. Ama aslında oldukça kolay.

Görünüm hiyerarşisindeki bir görünümün kaldırılması, görünüm ve bunun dışındaki diğer görünümlerle ilgili kısıtlamaları kaldırır.

// Remove constraints betwixt someView and non-descendants of someView. 
UIView *superview = someView.superview; 
[someView removeFromSuperview]; 
[superview addSubview:someView]; 

orada herhangi arada kısıtlamaları ve onun soyundan, bu kısıtlamalar (kendisi yapılabileceği öne ama herhangi torunları tarafından düzenlenen edilemiyorsa: Dolayısıyla, sadece geri eklemek daha sonra Superview adresinin görünümünü kaldırmak ve). Bu kısıtlamaları da kaldırmak isterseniz, bunu doğrudan yapabilirsiniz:

// Remove any remaining constraints betwixt someView and its descendants. 
[someView removeConstraints:[someView constraints]]; 
+0

Teşekkürler, işe yaradı! –

+0

Alt görünümün süper görüntüden kaldırılmasının o alt görünüm için belirlenen kısıtlamalar için işe yaramadığını fark ettim (tutturulmuş yükseklik ve genişlik gibi) –

+0

Yanıtın ikinci kısmı genişlik ve yükseklik kısıtlamalarını kaldıracaktır. –