我做了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:
我做得这么慢,所以你可以更好地看到它
答案 0 :(得分:0)
您还没有为我们提供足够的信息来了解正在发生的事情。什么是tvx
,blackView
和self
?什么是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)
<强>更新强> 最后我找到了解决方案。
问题是我在子视图控制器上设置的约束。通常情况下,你将它们设置在所有方面,在我的情况下,非常奇怪我只能将它们设置在底部和侧面。如果我把一些设置到顶部,它总是会做这个错误。