2015-11-13 19 views
5

Ana görünüm olarak stackview kullanmalıyım. Alt sıradaki daraltma ve şişirme etkisini elde etmek için 2 satırlık yığın görünümünü canlandırmaya çalışıyorum.stackview animasyonu - düzenlenen alt görünümlerin daraltılması

func showView() 
{ 
    if(!expand) 
    { UIView.animateWithDuration(0.5, animations:{ 
     self.expandableViewHeight.constant = 50 
     // Update layout of all subviews 
     self.parentViewController!.view.layoutIfNeeded()}) 
    } else { 
     UIView.animateWithDuration(0.5, animations:{ 
     self.expandableViewHeight.constant = 100 
     // Update layout of all subviews 
     self.parentViewController!.view.layoutIfNeeded()}) 
    } 
} 

Basit ve düzgün: Eğer subviews normal autolayouted görünüme Bu kodu uyguladığınızda Bunu söyleyebilen, benim yapmaya çalıştığım şey olsun aynı şeydir. Bu görünüme tıklamaya izin verdiğinizde, tüm alt görünümleriyle genişler veya daraltılır. Animasyonlar ilerledikçe alt görünümler kırpılır (yeniden boyutlandırılmaz/yeniden ölçeklendirilmez) ve son olarak orijinal görünümün yalnızca yarısını görebilirsiniz.

Basit bir şey gibi görünüyor, ancak yığın görünümünde tamamlanamıyorum. Stackview'e ikinci satır eklediğimde ve birkaç tane öğreticide olduğu gibi layoutIfNeeded() öğesini canlandırdığımda: - alt satırın şişirilmesi soldan sağa sola, - alt satırda daraltıldığında kaybolur (animasyon yok)) - sadece arka plan görünümü Ben yükseklik kısıtlamaları kullanıyorum zaman()

kodunu görmek düzgün animasyon ve daha sonra, alt satırda layoutIfNeeded() üzerinde animasyon yok: - alt sıra şişirme sırasında olçeklendirilmektedir Animasyon ile tam boyda kaldığında - daraltıldığında - Animasyon

Alt Satır 0 olarak yeniden ölçeklendirildi. Herhangi bir ipucu takdir! :)

Bu benim stackview kodudur:

override func viewDidLoad(){ 
    super.viewDidLoad() 

    background = UIView(frame:CGRectMake(0, 0, frame.width,frame.height)) 
    background.backgroundColor = UIColor.whiteColor() 
    background.layer.cornerRadius = 5 
    background.layer.masksToBounds = true 

    self.addSubview(background) 

    vStack = UIStackView() 
    vStack.axis = .Vertical 
    vStack.alignment = .Fill 
    vStack.distribution = .Fill 
    vStack.spacing = 0 

    self.addArrangedSubview(vStack) 

    hStack = UIStackView() 
    hStack.axis = .Horizontal 
    hStack.alignment = .Center 
    hStack.distribution = .EqualSpacing 
    hStack.spacing = 10 

    hStack2 = UIStackView() 
    hStack2.axis = .Horizontal 
    hStack2.alignment = UIStackViewAlignment.Center 
    hStack2.distribution = UIStackViewDistribution.EqualCentering 
    hStack2.spacing = 10 

    lquestionStack = UIStackView() 
    questionStack.axis = .Horizontal 
    questionStack.alignment = .Center 
    questionStack.distribution = .EqualSpacing 
    questionStack.spacing = QUESTION_PADDING 


    let labelQuestionNumber = UIButton() 
    labelQuestionNumber.userInteractionEnabled = false 
    let numberImage = UIImage(named: "backgroundImage") 
    labelQuestionNumber.setBackgroundImage(numberImage, forState: .Normal) 

    questionStack.addArrangedSubview(labelQuestionNumber) 


    hStack.addArrangedSubview(questionStack) 
    vStack.addArrangedSubview(hStack) 

    hStack2.addArrangedSubview(questionStack) 
    vStack.addArrangedSubview(hStack2) 

} 
public func collapseInflateAction() { 
    if checkWidget.collapsed { 
     inflateWidget() 
    } else { 
     collapseWidget() 
    } 
    checkWidget.collapsed = !checkWidget.collapsed 
} 

private func collapseWidget(){ 
    vStack.removeArrangedSubview(self.hStack2) 
    self.hStack2.removeFromSuperview() 

    UIView.animateWithDuration(0.5, animations: {() -> Void in 
     self.background.frame.size.height = (self.background.frame.size.height)/2 
     self.layoutIfNeeded() 
     self.superview?.layoutIfNeeded() 
     }) 
} 

private func inflateWidget(){ 
    self.vStack.addArrangedSubview(self.hStack2) 

    UIView.animateWithDuration(0.5, animations: {() -> Void in 
     self.background.frame.size.height = self.background.frame.size.height*2 
     self.layoutIfNeeded() 
     self.superview?.layoutIfNeeded() 
    }) 

} 

Ve bu yerine layoutIfNeeded() animasyon kısıtlarını kullanan 2 son yöntemlerden çeşididir. Ve ayrıca kısıt değiştirilen: ama, çok uzun zaman önceydi

override func viewDidLoad(){ 
    super.viewDidLoad() 
(...) 
heightConstraint = NSLayoutConstraint(item: hStack2, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 0) 
    self.addConstraint(heightConstraint) 
} 
private func collapseWidget(){ 
    UIView.animateWithDuration(0.5, animations: {() -> Void in 
     self.background.frame.size.height = 44 
     self.heightConstraint.constant = 0 
     self.superview?.layoutIfNeeded() 
     }) 
} 

private func inflateWidget(){ 
    UIView.animateWithDuration(0.5, animations: {() -> Void in 
     self.background.frame.size.height = 88 
     self.heightConstraint.constant = 44 
     self.superview?.layoutIfNeeded() 
    }) 

} 
+2

Hiç bir çözüm buldu olup olmadığını merak oldu layouting önce self.layoutIfNeeded() eklemek yardımcı düşünüyorum Sorununuza, sorunun kaç yaşında olduğu göz önüne alındığında. Paylaşmak mı? –

cevap

0

Ben Superview

fileprivate func collapseWidget(){ 

    UIView.animate(withDuration: 0.25, animations: {() -> Void in 
     self.background.frame.size.height = self.heightCollapsed 
     self.heightConstraint.constant = self.heightCollapsed 
     self.layoutIfNeeded() 
     self.superview?.layoutIfNeeded() 
     }) 
} 

fileprivate func inflateWidget(){ 
    self.separatorView.isHidden = false 
    UIView.animate(withDuration: 0.25, animations: {() -> Void in 
     self.background.frame.size.height = self.heightInflated 
     self.heightConstraint.constant = self.heightInflated 
     self.layoutIfNeeded() 
     self.superview?.layoutIfNeeded() 
    }) 
}