2015-11-08 37 views
6

storyboard ve autolayout kullanıyorum ve IB'deki kısıtlamaları ilgili görünüm denetleyicisinde IBOutlet olarak ayarlıyorum. ,Cihaz yönlendirmesi değiştiğinde kısıtlamaları programlı olarak güncellemek için doğru yolu?

  1. ben -viewWillTransitionToSize:withTransitionCoordinator: yönteminde yeni sınırlamalar ayarlayabilirsiniz olmalı: Ben portre ve manzara farklı olmak kısıtlamaları güncelleştirme ilgili çeşitli mesajları okuyorum ama hala bunu nasıl emin değilim veya updateViewConstraints yönteminde?
  2. Yeni kısıtlamalar ayarlandığında, [self.view setNeedsUpdateConstraints]; veya layoutIfNeeded veya setNeedsLayout mu arayayım?
  3. Ben, örneğin, belli bir kısıtlama sürekli güncellemek gerektiğini nasıl

    self.myConstraint.constant = 30.0

veya yapıyor:

[self.view removeConstraint:self.passwordViewHeight]; 

self.passwordViewHeight = [NSLayoutConstraint constraintWithItem:self.passwordView 
                 attribute:NSLayoutAttributeHeight 
                 relatedBy:NSLayoutRelationEqual 
                 toItem:nil 
                 attribute:NSLayoutAttributeNotAnAttribute 
                multiplier:1.0 
                 constant:34.0]; 

[self.view addConstraint:self.passwordViewHeight]; 

peşin

cevap

0

iyi Kısıtlama ve rekreasyon kaldırmak yerine sabit değiştirmek için olurdu tekrar dene. Uzun vadede sabitden sadece ekleme veya çıkarma işlemi çok daha hızlıdır.

[self.view layoutIfNeeded]; 
self.myConstraint.constant = 30.0; 
[self.view layoutIfNeeded]; 

Daha önce layoutIfNeeded çağrı önerilir ve sonra siz de sabit değiştirin: Ne yapmak isteyeyim gibi bir şeydir. Bunun nedeni, henüz yapılmayan ve daha fazla kısıtlamayı değiştirmeden önce yapacağınız bazı kısıtlamalara sahip olmanız olabilir.

+0

Teşekkür ederiz. Bunu hangi yöntemden aramalıyım? – AppsDev

+0

Bunu yapmak için kendi yönteminizi yapabilirsiniz, aygıt yönlendirme değişikliği için bir bildirim oluşturduysanız, bu yöntemden çağırabilirsiniz. Bunu kurmadıysanız, aşağıdaki kodu ile bunu yapmak istiyorum kesinlikle olacaktır: '[[NSNotificationCenter defaultCenter] addObserver: self seçici: @selector (yourMethodHere) adı: UIDeviceOrientationDidChangeNotification nesnesi: nil];' – Tyler

+0

olurdu ' viewWillTransitionToSize' yöntemi de iyi bir yer mi? – AppsDev

0

Otorotasyon değişikliğini sağlamak için en iyi fikir, Interface Builder'da Size Classes kullanılacaktır.

https://www.codefellows.org/blog/size-classes-with-xcode-6-one-storyboard-for-all-sizes

+0

Teşekkürler. IPhone cihazlar için iOS 7'yi ve yukarısını desteklemem gerekiyor ve sadece “autolayout” etkinleştirilmiş bir 'storyboard'um var. Bu senaryoda yaklaşık 32 sahneyim var ... Bu noktada boyut sınıflarına geçmeye değer, ve iOS 7'yi desteklemem gerektiğini hesaba katıyor muyum? – AppsDev

1

yön değiştirme yöntemi viewWillTransitionToSize kullanılarak saptanabilir. Cihaz oryantasyonu değişmek üzere olduğunda bu yöntem çağrılacaktır.

-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator (id<UIViewControllerTransitionCoordinator>)coordinator{ 
     //change constraints 
} 

Alternatif olarak, oryantasyon değişikliklerden sonra kısıtlamaları değiştirmek viewWillTransitionToSize yönteminde koordinatör nesnenin animateAlongsideTransition yöntemi kullanmak istiyorum.

-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator{ 
    [coordinator animateAlongsideTransition:nil completion:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) { 
     //change constraints 
    }]; 
}