Swift中隐藏UIView在Segue时短暂显示问题求助
解决滑动菜单Segue前短暂显示的问题
我来帮你捋一捋这个问题~ 你遇到的情况应该是动画完成的回调和Segue执行的时机没有完全同步,导致菜单还没彻底隐藏就开始页面跳转,所以出现了短暂的显示。下面给你几个可行的解决方案:
方案1:动画结束后强制隐藏侧视图再执行Segue
在动画完成的闭包里,先把侧视图设置为完全隐藏(比如直接设isHidden或者强制更新frame到目标位置),再调用Segue,确保视图状态已经到位:
@IBAction func socialMediaButton(_ sender: UIButton) { sideview.animator.move(x: -320).easeInOutSine.animate(t: 1.0) { // 先强制把侧视图移到不可见区域,同时隐藏 self.sideview.frame.origin.x = -320 self.sideview.isHidden = true self.performSegue(withIdentifier: "gotoSocialMedia", sender: self) } collapseButton.animator.rotate(angle: -90).easeInOutSine.animate(t: 0.5) }
方案2:延迟一点点执行Segue
有时候动画的回调可能会稍微提前触发(比如动画的最后一帧还没渲染完成),这时候可以给Segue加个极短的延迟,让视图彻底完成渲染:
@IBAction func socialMediaButton(_ sender: UIButton) { sideview.animator.move(x: -320).easeInOutSine.animate(t: 1.0) { self.sideview.alpha = 0 // 延迟0.1秒执行Segue,给视图渲染留时间 DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { self.performSegue(withIdentifier: "gotoSocialMedia", sender: self) } } collapseButton.animator.rotate(angle: -90).easeInOutSine.animate(t: 0.5) }
方案3:在Segue准备阶段强制隐藏侧视图
你之前尝试的viewWillDisappear可能因为调用时机问题没生效,可以试试在prepare(for:sender:)里设置侧视图状态,这个方法会在Segue执行前被调用:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "gotoSocialMedia" { sideview.alpha = 0 sideview.isHidden = true // 也可以直接设置frame确保位置正确 sideview.frame.origin.x = -320 } }
额外小提示
如果ChainableAnimations的动画回调时机不太可靠,你也可以换成原生的UIView.animate方法,它的completion回调时机更稳定:
@IBAction func socialMediaButton(_ sender: UIButton) { UIView.animate(withDuration: 1.0, delay: 0, options: .curveEaseInOut) { self.sideview.frame.origin.x = -320 } completion: { _ in self.sideview.isHidden = true self.performSegue(withIdentifier: "gotoSocialMedia", sender: self) } UIView.animate(withDuration: 0.5, delay: 0, options: .curveEaseInOut) { self.collapseButton.transform = CGAffineTransform(rotationAngle: -CGFloat.pi/2) } }
内容的提问来源于stack exchange,提问作者askaale
相关产品推荐
相关产品推荐

