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()
})
}
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ı? –