2017-08-25 20 views
5

Ben ayarlarsanız: Bu yığın görünümü (tüm subviews içeren bir görünüm yüklerken iOS 11 UIStackView doldurmak orantılı dağılımı neden garip görünümü yükleme animasyonu

stackView.distributon = .fillProportionally 

Sonra iOS 11 ben çok garip animasyon olsun - sadece yığın görünümü - ekranın üstünden veya altından uçuyor). IOS sürümünde her şey iyi çalışıyor. Yığın görünümünün dağıtımını başka bir şeye ayarlarsanız her şey iyi çalışır.

Bu sorunun nedeninin ne olabileceği hakkında bir fikri olan var mı?

Teşekkür ederiz.

+1

Bunun için bir çözüm buldunuz mu? Yığın görünümü 'Doldur' dağılımı (varsayılan) olarak ayarlanmış olsa da, ekranın üst kısmından uçan görünümler ile benzer bir sorun yaşıyorum. Xcode 9 GM tohum ve iOS 11 GM tohumunu kullanarak. –

+1

'stackview.distributon = .fillProportionally' ayarlanmadan hemen önce' self.view.layoutIfNeeded() 'işlevini çağırdı. – kiwisip

+0

@MattCline Aynı sorunu yaşıyorum ... :(Herhangi Bir Fikir nasıl düzeltilir? – kmithi

cevap

8

Sanırım bir düzeltme buldum - numarasını animations satırında arayın.

import UIKit 

class ViewController: UIViewController { 

    var showB = true 

    weak var viewB: UIView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let viewA = UIView() 
     viewA.backgroundColor = UIColor.green 

     let toggleViewBButtonAnimated = UIButton(frame: CGRect(x: 50, y: 150, width: 200, height: 40)) 
     toggleViewBButtonAnimated.backgroundColor = UIColor.cyan 
     toggleViewBButtonAnimated.setTitle("Toggle B (animated)", for: .normal) 
     viewA.addSubview(toggleViewBButtonAnimated) 
     toggleViewBButtonAnimated.addTarget(self, action: #selector(toggleBButtonTappedAnimated), for: .touchUpInside) 


     let viewB = UIView() 
     viewB.backgroundColor = UIColor.orange 
     let viewBHeightConstraint = viewB.heightAnchor.constraint(equalToConstant: 200) 
     viewBHeightConstraint.priority = 999 
     viewBHeightConstraint.isActive = true 
     self.viewB = viewB 


     let stackView = UIStackView(arrangedSubviews: [viewA, viewB]) 
     stackView.axis = .vertical 
     stackView.alignment = .fill 
     stackView.distribution = .fill 
     stackView.translatesAutoresizingMaskIntoConstraints = false 

     self.view.addSubview(stackView) 

     stackView.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true 
     stackView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true 
     stackView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor).isActive = true 
     stackView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor).isActive = true 
    } 

    @IBAction func toggleBButtonTappedAnimated() { 
     self.showB = !self.showB 
     UIView.animate(withDuration: 0.3, 
         animations: { self.viewB.isHidden = !self.showB; self.view.layoutIfNeeded() } 
     ) 
    } 
} 

Bu kontrolör kurar iki dikey manzarası, yeşil bir (A) ve turuncu bir (B) sahip bir UIStackView:

İşte benim üreme var. Ben değilanimations blokta self.view.layoutIfNeeded() var yaparsanız düğme gizler delik/unhides B.

görüntülemek görünümü B gösteriliyor zaman, o zaman, bu ekranın üstünden uçar. (B görünüşü, gizli olan, normal olarak gizler - ekranın alt kısmına aşağı hareket). I animations bloğuna self.view.layoutIfNeeded() ilave

, B görünüşü, beklendiği gibi gösterir - ekranın altından gelir .

Bana bu yönde işaret ettiğin için @ g3rv4 cevabı sayesinde!

+0

Harika! '' Stack.deg = '' '' 'ayarlanmadan hemen önce '' self.view.layoutIfNeeded() 'çağrısı = .fillProportionally' Teşekkür ederim. – kiwisip

+0

iOS'ta bir hata olduğu için animasyon bloğundaki 'UIStackView'' alt ekranının gizli özelliğini değiştirmemelisiniz <= 10 ve bazı durumlarda iOS 11’de animasyon garip görünecektir. –

+0

Animasyon bloğunun sonuna self.view.layoutIfNeeded() ekleme, benim için düzeltildi. Yığın görünümü daha önce ekranın üst kısmından animasyonluydu, ancak uygun noktadan animasyon yapmıyordu. Teşekkürler! – vikzilla

1

Bu sabah GM tohumunu kullanarak aynı sorunla karşılaştım. Şu anda animasyonların istenmediği herhangi bir UIStackView değişiklik yapmak için UIView.performWithoutAnimation { bloğunu kullanarak bittim.

0

Benim için sorun, iOS 11'de tanıtılan bir davranış gerilemesiydi ve UIStackView dağıtım türüyle hiçbir ilgisi yoktu. Bir kaç tane kod tabanlı çözümü hiçbir işe yaramadı: ilk olarak, kapsayıcı hiyerarşisinde layoutIfNeeded öğesini çağırmak; İkincisi, ('benzer bir soruyu başka bir cevapta görüldüğü gibi)' viewMode içeriği değiştirerek.

My hacky çözüm, aşağıdaki: Animasyon yanlış ekranın kenarından öğeleri getiren burada

UIStackView tarafında yeni, sıfır genişliği UIView tutucu ekleyin.