2015-11-13 3 views
5

Мне нужно использовать stackview как родительский вид. Я пытаюсь оживить stackview с двумя строками, чтобы получить эффект свертывания и раздувания нижней строки. Вы можете сказать, что то, что я пытаюсь сделать, это то же самое, что вы получаете, когда вы применяете этот код в обычный autolayouted зрения с подвидов:stackview animation - сбой организованных подпунктов

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()}) 
    } 
} 

Простой и аккуратный. Когда вы скажете, что нажимаете на это представление, оно расширяется или сворачивается со всеми его подзонами. Подвижности обрезаются (не изменяются/масштабируются), когда анимация идет, и, наконец, вы видите только половину исходного вида.

Это похоже на простую вещь, но я не могу сделать это с помощью stackview. Когда я добавляю вторую строку в стеке, а затем анимацию layoutIfNeeded(), как в нескольких учебниках, то: - при раздувании нижнего ряда происходит слева от его положения, - при свертывании нижней строки просто исчезает (без анимации) - только фон вид анимированный правильно (см код)

когда я использую ограничение высоты и не анимировать на layoutIfNeeded() в нижнем ряде, а затем: - при завышении нижней строки перемасштабирована до полной высоты по мере того, как анимация идет - при свертывании - нижняя строка масштабируется до 0, когда анимация идет

Невозможно сделать снимок нижним рядом! Любые советы оценены! :)

Это мой stackview код:

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() 
    }) 

} 

И это изменение 2 последних методов, которые используют ограничения вместо layoutIfNeeded() анимация. А также ограничение модифицируется:

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

Было интересно ли когда-либо вы нашли решение к вашей проблеме, учитывая, насколько старый ваш вопрос. Разделить это? –

ответ

0

Это было давным-давно, но я думаю, что это помогло добавить self.layoutIfNeeded() перед 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() 
    }) 
} 
Смежные вопросы