2017-08-08 186 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) 

希望這有助於

相關問題