SORU
16 Aralık 2013, PAZARTESİ


setNeedsUpdateConstraints ve layoutİfNeeded setNeedsLayout vs vs updateConstraintsİfNeeded

Otomatik düzen zincir temelde 3 farklı süreçte oluşur biliyorum.

  1. kısıtlamaları güncelleniyor
  2. düzen görünümü Kare hesaplama nereden aldığımızı burada ()
  3. ekran

Benim için çok net değil ne -setNeedsLayout -setNeedsUpdateConstraints iç arasındaki farktır.
Belgelere apple diyor ki:

İstediğiniz zaman uygulamanın ana iş parçacığı bu yöntemi çağırın bir view. subviews düzenini ayarlamak. Bu yöntem bir not yapar istemek ve hemen döner. Bu yöntem değil çünkü acil bir güncelleştirme zorlamak, ama bunun yerine bir sonraki güncelleme için bekliyor döngüsü, birden çok görünüm düzeni geçersiz kılmak için kullanabilirsiniz bu görüş daha önce hiç bir güncelleme. Bu davranış sağlar bir güncelleme döngüsü, düzeni güncellemeleri tüm birleştirmek performans için genellikle daha iyi.

İlk için

Özel bir özellik etkileyecek şekilde değişmesi görüntüleyin kısıtlamalar, bu yöntem kısıtlamaları belirtmek için arayabilirsiniz gelecekte bir noktada güncelleştirilmesi gerekmektedir. Sistem olacak normal düzen bir parçası olarak updateConstraints iletin. Güncelleme kısıtlamaları gerektiğinde önce her seferinde seni sağlar birden çok değişiklik olduğunda gereksiz kısıtlamalar yeniden hesaplama yok düzeni arasında geçiş görünümü için yapılmış.

ikinci için.

Bir kısıtlama değiştirdikten sonra bir görünüm animasyon ve değişiklikleri animasyon istediğimde genelde örneğin çağrı:

[UIView animateWithDuration:1.0f delay:0.0f usingSpringWithDamping:0.5f initialSpringVelocity:1 options:UIViewAnimationOptionCurveEaseInOut animations:^{
        [self.modifConstrView setNeedsUpdateConstraints];
        [self.modifConstrView layoutIfNeeded];
    } completion:NULL];

Eğer beklendiği gibi -setNeedsLayout -setNeedsUpdateConstraints yerine her kullanırsam, ama eğer değiştirirsem -updateConstraintsIfNeeded animasyon -layoutIfNeeded olmayacağını öğrendim.
Kendi sonucum yapmaya çalıştım:

  • -updateConstraintsIfNeeded kısıtlamaları güncelleme ama orijinal çerçeveler hala korunur böylece düzeni sürecine girmeye zorlamak değil, sadece
  • -setNeedsLayout -updateContraints yöntem de çağırır

Zaman diğerinin yerine kullanmak için tamam mı? ve düzen yöntemleri hakkında, üst görünüm üzerinde bir kısıtlama veya değiştirmek üzere onları aramam gerekiyor mu?

CEVAP
4 Ocak 2014, CUMARTESİ


Sonuçlar doğru.Temel düzeni:

  • setNeedsUpdateConstraints updateConstraintsIfNeeded aramalar updateConstraints gelecek bir çağrı yapar.
  • setNeedsLayout layoutIfNeeded çağrı layoutSubviews gelecekteki bir çağrı yapar.

layoutSubviews çağrıldığında, ayrıca updateConstraintsIfNeeded manuel nadiren gereklidir arıyorum yani benim durumumda çağırır. Aslında, hiç düzenler ayıklarken bunun dışında aradım.

Güncelleme kısıtlamaları setNeedsUpdateConstraints kullanarak, objc.io–a must read about autolayouts–says çok çok çok nadirdir

Eğer bir şey kısıtlamaları geçersiz kılar daha sonra bir değişiklik olursa, kısıtlama derhal çıkarın ve setNeedsUpdateConstraints aramalısın.Aslında, bu tabloda bir güncelleme pas tetiklemek için gereken tek dava bu.

Ayrıca, benim deneyim, ben hiç geçersiz kısıtlamaları ve set setNeedsLayout sonraki satır kod, çünkü yeni kısıtlamalar çok sorduğun için yeni bir düzen.

Başparmak kuralları vardır:

  • Eğer kısıtlamaları direkt olarak işletilen setNeedsLayout Ara.
  • Bazı koşullar (uzaklık ya da bir şey anımsatıyor gibi) değiştirdiysenizsizin geçersiz kılınmış kısıtlamaları updateConstraints yöntem (kısıtlamalar, btw değiştirmek için önerilen bir yol), ondan sonra ** 23, ve çoğu zaman, setNeedsLayout çağrı değiştirin.
  • Eğer bu eylemler derhal etkisi; yukarıdaki zaman herhangi bir ihtiyacın olursa bir düzen sonra yeni çerçeve boyu geçiş ekleme layoutIfNeeded ile öğrenmek gerekir.

Ayrıca, animasyon kodu, inanıyorum setNeedsUpdateConstraints gereksiz beri kısıtlamaları bulunmaktadır önce el ile animasyon ve animasyon Sadece re-sergiliyor-out görünümü temel farklılıklar arasında eski ve yeni olanlar.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Fuse

    Fuse

    21 Kasım 2005
  • jeffisthecoolguy

    jeffisthecoo

    17 HAZİRAN 2013
  • ŠĩŗĜŕôŵåɭȍҭҭ

    ŠĩŗĜŕô

    29 Kasım 2009

İLGİLİ SORU / CEVAPLAR