2017-08-08 153 views
0

我以编程方式创建了一个UIStackView,它由两个垂直堆叠的UICollectionView组成。其中一个是菜单栏,其中一个是显示媒体内容的网格。UIView动画从屏幕下方滑动到屏幕底部

let contentStack = UIStackView() 
contentStack.addArrangedSubview(menuBar) 
contentStack.addArrangedSubview(grid) 
self.view.addSubview(contentStack) 

我希望UIStackView出现在屏幕的底部,一旦按钮被窃听。但是,当它出现时,我希望它做一个动画,所以它从屏幕下方向上滑动。我已经看过旧的解决方案,以职位与我相似,但我无法找到任何有用的,因为我手动设置这样的限制:

contentStack.translatesAutoresizingMaskIntoConstraints = false 
contentStackBotAnchor = contentStack.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0) 
contentStackBotAnchor!.isActive = true 
contentStack.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true 
contentStack.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true 
contentStack.axis = .vertical 
contentStack.spacing = 0 

我试图解决方案,如这样的:

UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseIn, animations: { 
      self.contentStack.frame = CGRect.init(x: 0, y: self.view.frame.height - self.contentStack.frame.height, width: self.contentStack.frame.width, height: self.contentStack.frame.height) 
     }, completion: nil) 

这没有为我工作。

+0

如果您使用约束,那么您必须使用约束进行动画制作 –

回答

1

由于Reinier说明,你可以动画你的约束。另一种选择可能是使用CGAffineTransform。当视图加载,只需像更改UIStackView的y值:

contentStack.transform = CGAffineTransform(translationX: 0, y: view.frame.height) 

然后当你想制作动画,使用您选择的动画:

UIView.animate(withDuration: 0.5, animations: { 
    contentStack.transform = .identity 
}) 

这是什么我喜欢在这种情况下,希望它有帮助。

1

如果您使用的约束,那么你必须动画使用限制,这种尝试,我不知道的值,但必须是这样的

self.view.layoutIfNeeded() 
UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseIn, animations: { 
      contentStackBotAnchor.constant = (self.contentStack.bounds.size.height * -1) 
      self.view.layoutIfNeeded() 
     }, completion: nil) 

希望这有助于

相关问题