2014-10-29 21 views
14

Düğmeleri görünümde yerleştirmek için Autolayout'u kullanarak iOS 8 için bir klavye üzerinde çalışıyorum.
Mizanpajları kullanarak düzeni değiştirdiğimde, ekranda her şey doğru görünüyor, ancak görünümün çerçeve boyutunu bilmek istediğimde, doğru boyutu alamıyorum.iOS Autolayout - Çerçeve boyutu görünümünde ayarlanmadıDidLayoutSubviews

Örneğin: Bir tuşa bastığımda, klavye düzeni değişiklikleri kısıtlarıma göre değiştirir ve düzenler. - O zaman ekranda herhangi düğmesinin boyutunu bilmek istiyorum ben "viewDidLayoutSubviews" ve konsolunda bu sonucu elde bunu:

2014-10-29 12:27:09.088 Keyboard[2193:60674] view did layout subviews 
2014-10-29 12:27:09.088 Keyboard[2193:60674] {{inf, inf}, {0, 0}} 

düğme doğru boyutu ve doğru pozisyon, ancak çalışıyor vardır çerçevesini olsun boyutu ayarlanmamış olsun.

Kodumu viewDidLayoutSubviews içinde çalışmıyorken nereye koymalıyım?

Yığınlama akışı ve diğer web sitesiyle ilgili birçok soru buldum, ancak bunların hiçbiri sorumu yanıtlamadı.

cevap

7

Evet! Bu sorunu kendim çözdüm. Ben doğru sahipsek

Emin değilim, ama ben böyle düşünüyorum:

  • viewDidLayoutSubviews düzeni
  • viewDidLayoutSubviews arasında 's aradığında direkt subviews olsun değişiyor zaman en her zamandenilen olsun Benim görüşüm düzeni yaptı, ancak o alt görünümlerin alt görünümleri o anda düzen değildi, bu yüzden onların boyutunu alamıyorsunuz.

Çözümümün şimdi elle benim klavyenin tüm tuşlarını içerir) (tüm görünümlerde.layoutSubviews aramak oldu. Bundan sonra, istediğim tüm düğmelerin boyutlarını alırım.

Yanılıyorsam lütfen beni düzeltin.

+1

benim için çalıştı, ancak bunun doğru olup olmadığını bilmiyorum. – JohnHanr

31

Çok benzer bir sorunla karşılaştı (en çok sorulan soru) ve doğru yönde işaret etmek için beeef's answer bulundu. Davam mySubView içinde, Bilginize

override func viewDidLayoutSubviews() { 
    // self.view's direct subviews are laid out. 
    // force my subview to layout its subviews: 
    self.mySubView.setNeedsLayout() 
    self.mySubView.layoutIfNeeded() 

    // here we can get the frame of subviews of mySubView 
    // and do useful things with that... 
} 

bir UIScrollView ve: Apple'ın belgelerine aşağıdaki gibi (mySubView self.view doğrudan Subview olduğu) layoutSubviews() doğrudan, bunun yerine yaptığı aramaya değil diyor düşünüldüğünde Görünümlerinden önce içerikOfsetini buna göre ayarlayabilmem için alt görünümlerinden birinin çerçevesini almam gerekiyor. ViewDidLayoutSubviews() öğesinin bunu yapmanın en iyi yolu olup olmadığından emin değilim, ancak mySubView'ın kullanıma sunulmasını sağlar.

0

DispatchQueue.asyncAfter() yöntemine başvururken her zaman biraz kirli hissediyorum, ancak bu durumda, görünüm hiyerarşisindeki tüm AutoLayout ayarlamaları gerçekleşmeden önce viewDidLayoutSubviews çağrıldığından bu durumun garanti edildiğini hissediyor. Ekstra, senkron bir düzeni zorlamayı tercih ederim.

İlgili konular