我有第一ViewController
和第二ViewController
。从第二ViewController
返回第一ViewController
之后,我想在第一ViewController
中显示按钮。
要返回,我使用以下代码:
self.dismiss(animated: true, completion: nil)
此代码显示第一个ViewController
中的按钮
@IBOutlet weak var infoButton: UIButton!
@IBOutlet weak var nextButton: UIButton!
@IBOutlet weak var infoButtonTopConstraint: NSLayoutConstraint!
@IBOutlet weak var nextButtonBottomConstraint: NSLayoutConstraint!
@IBOutlet weak var infoButtonHeightConstraint: NSLayoutConstraint!
@IBOutlet weak var nextButtonHeightConstraint: NSLayoutConstraint!
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(true)
showButtonAnimation()
//animaton()
}
func showButtonAnimation() {
self.infoButtonTopConstraint.constant += self.infoButtonHeightConstraint.constant
self.nextButtonBottomConstraint.constant -= self.nextButtonHeightConstraint.constant
UIView.animate(withDuration: 1.0, delay: 0.0,
options: [], animations: {
self.view.layoutIfNeeded()
})
}
但是当我从第二个ViewController
返回时,按钮没有显示。
答案 0 :(得分:1)
替换此
func showButtonAnimation() {
self.view.layoutIfNeeded()
UIView.animate(withDuration: 1.0, delay: 0.0,
options: [], animations: {
self.infoButtonTopConstraint.constant += self.infoButtonHeightConstraint.constant
self.nextButtonBottomConstraint.constant -= self.nextButtonHeightConstraint.constant
self.view.layoutIfNeeded()
})
}
编辑1
viewWillAppear
未得到调用的原因:您将第二个viewController
表示为overCurrentContext
modalPresentationStyle
。
只需将overCurrentContext
替换为fullScreen
即可。
答案 1 :(得分:0)
每次调用viewWillAppear
时,请记住该视图未加载到主视图中,因此动画将无法正常工作。您应该使用viewDidAppear
。
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
showButtonAnimation()
}
并且在动画方法中进行如下更新,因为您更改了需要退出的动画块内的约束值。
func showButtonAnimation() {
self.infoButtonTopConstraint.constant += self.infoButtonHeightConstraint.constant
self.nextButtonBottomConstraint.constant -= self.nextButtonHeightConstraint.constant
UIView.animate(withDuration: 1.0, delay: 0.0,
options: [], animations: {
self.view.layoutIfNeeded()
})
}
答案 2 :(得分:0)
我已经尝试过您的代码,并且它是第一次工作,但是问题可能出在每次按钮约束的常量值增加时。
所以它们可能隐藏在您的主视图后面。
解决方案:-您可以标记并在动画完成后更改其值。
现在,当您从第二个控制器回来时,您必须在viewWillAppear中检查按钮是否可见,如果按钮可见,则不必调用 showButtonAnimation 方法。
单击
可以查看按钮在当前屏幕中的位置。按钮查看UI层次结构。
希望这可以解决您的问题。
答案 3 :(得分:-1)
您可以在second viewController
中添加一个委托。喜欢:
protocol SecondViewControllerDelegate {
func vcDismissed()
}
Class SecondViewController : UIViewController {
weak var delegate: SecondViewControllerDelegate
.....
//Where you are dismissing your viewController, call the delegate method in completion.
func someMethod() {
self.dismiss(animated: true, completion: {
self.delegate.vcDismissed()
})
}
}
现在在您的FirstViewController
中,遵循协议并实施如下方法:
extension FirstViewController: SecondViewControllerDelegate {
func vcDismissed() {
//Here call your showButton method
self.showButton()
}
}
在创建要显示它的secondViewController
实例时,请不要忘记设置委托。喜欢
objSecondViewController.delegate = self
希望这会有所帮助。对于任何查询,请随时发表评论。