斯威夫特||从Superview动画和删除子视图时出错

时间:2017-10-19 23:44:58

标签: ios swift

我做了DropDown菜单以选择Action,如下面的 GIF

因此我制作了一个子视图并将其设为动画。 当动画Subview时,它看起来很奇怪。

特别是问题是它看起来像一个空白的小条而不像菜单。

有谁知道问题可能在哪里?

我正在制作Subview的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

    })

}

BUG的GIF:

enter image description here

  

我做得这么慢,所以你可以更好地看到它

2 个答案:

答案 0 :(得分:0)

您还没有为我们提供足够的信息来了解正在发生的事情。什么是tvxblackViewself?什么是self.h变量? (从动画看起来,您可以在开始动画代码之前更改"菜单"视图的高度更短。)

你是否有一个使用embed segue包含在另一个视图控制器中的视图控制器?

如果是这样,您可能应该为容器视图上的约束设置动画,而不是子视图控制器的视图。

正如Glenn和D. Greg在评论中所说的那样,你应该真正为你的观点添加限制,勾勒那些限制因素,以及动画改变约束的常数,而不是操纵你的观点' s帧直接。当您使用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
  }
)

答案 1 :(得分:-1)

<强>更新 最后我找到了解决方案。

问题是我在子视图控制器上设置的约束。通常情况下,你将它们设置在所有方面,在我的情况下,非常奇怪我只能将它们设置在底部和侧面。如果我把一些设置到顶部,它总是会做这个错误。