2017-10-19 42 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 
    } 
)