2017-10-19 83 views
1

Im made和DropDown Menu選擇動作,如下面的GIFSwift ||從Superview動畫和刪除子視圖時出現Bug

所以我做了一個子視圖和動畫吧。 當動畫子視圖了,它看起來非常怪異。

特別是問題是,它看起來像一個空白的小酒吧,而不是菜單。

有誰知道問題出在哪裏?

我做的子視圖ViewController是一個簡單的ViewController裏面有一個TableView和一個原型單元格。

代碼:

let blackView = UIView() 
var tvx: OptionsVC = OptionsVC() 
var h: CGFloat! 

func optionsClicked() { 

self.h = CGFloat(70 + (52 * (OptionsVC().arrayFunctionCellNames.count))) 

    navigationController?.hidesBarsOnTap = false 

     tvx = self.storyboard?.instantiateViewController(withIdentifier: "options") as! OptionsVC 


    if let window = UIApplication.shared.keyWindow { 

     blackView.backgroundColor = UIColor(white: 0, alpha: 0.5) 

     blackView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleDismiss))) 


     view.addSubview(blackView) 

     view.addSubview(tvx.view) 


     let y = (self.navigationController?.navigationBar.frame.size.height)! + UIApplication.shared.statusBarFrame.height 

     tvx.view.frame = CGRect(x: 0, y: (y - self.h), width: view.frame.width, height: h) 

     blackView.frame = CGRect(x: 0, y: y, width: view.frame.width, height: view.frame.height) 
     blackView.alpha = 0 


     UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: { 
      self.blackView.alpha = 1 
      self.tvx.view.frame = CGRect(x: 0, y: y, width: self.view.frame.width, height: self.h) 
      self.blackView.frame = CGRect(x: 0, y: (y + self.h), width: self.view.frame.width, height: self.view.frame.height) 


     }, completion: nil) 

    } 

} 

func handleDismiss() { 

    UIView.animate(withDuration: 5.5, animations: { 
     let y = (self.navigationController?.navigationBar.frame.size.height)! + UIApplication.shared.statusBarFrame.height 

     self.blackView.alpha = 0 

     if let window = UIApplication.shared.keyWindow { 
      self.blackView.frame = CGRect(x: 0, y: y, width: self.view.frame.width, height: self.view.frame.height) 
      self.tvx.view.frame = CGRect(x: 0, y: (y - self.h), width: self.view.frame.width, height: self.h) 

     } 

    }, completion: {(finished:Bool) in 


     self.blackView.removeFromSuperview() 
     self.tvx.view.removeFromSuperview() 

     self.navigationController?.hidesBarsOnTap = true 

    }) 

} 

GIF的BUG:

enter image description here

我把它這麼慢,所以你可以更好地看到它

+1

只是一個評論通過。如果我要這樣做,我只能使用約束,並將所述約束動畫化爲屏幕內外的動畫,不能從超級視圖中刪除或更改幀。 – Glenn

+0

我會同意@Glenn。你可以得到這個工作,但它不再是真正的標準。幾年前,我做了這樣的事情,它給了我同樣的問題。如果我可以挖掘代碼,我會與你分享。 –

回答

0

UPDATE: 最後,我找到了解決辦法。

問題是我在我的子視圖控制器上設置的約束。通常情況下,你把它們設置到所有的邊,在我的情況下,非常奇怪,我不得不將它們設置到底部和兩側。如果我設置一些頂部,它總是會做這個錯誤。

0

你真的沒有提供足夠的信息我們瞭解發生了什麼。 tvxblackViewself是什麼?什麼是self.h變量? (從動畫,它看起來像你改變你的「菜單」視圖的高度開始動畫代碼之前要短得多。)

你有內部包含使用嵌入賽格瑞另一個視圖控制器?

如果是這樣,您應該在容器視圖上設置動畫約束,而不是子視圖控制器的視圖。

正如Glenn和D. Greg在他們的評論中所說的那樣,您應該真的在您的視圖中添加約束條件,將銷售點連接到這些約束條件,並動態更改約束的常量,而不是直接操縱視圖的框架。當您使用AutoLayout時,對視圖框架的動畫更改不可靠,因爲AutoLayout可以更改您的視圖的大小並將其放在動畫代碼的下方。該代碼看起來是這樣的,(從廣義上講,沒有具體到你的代碼)

myViewAConstraint.constant = someNewValue 
myViewBConstraint.constant = someOtherValue 
UIView.animate(withDuration: 5.5, 
    animations: { 
    someView.alpha = 0 //If you want the view to fade as it animates 
    self.view.layoutIfNeeded() 
    }, 
    completion: { (finished:Bool) in 
    } 
)