执行自定义转场后UITextField成为第一响应者时键盘弹出两次
自定义Storyboard转场完整实现方案
看你已经写了自定义Segue的开头代码,应该是卡在转场动画的补全或者配置环节了吧?我来帮你把代码补全,再梳理清楚整个实现流程,这样就能实现点击源视图按钮后的自定义转场效果啦。
首先先修正你的类名(应该是FirstCustomSegue,你打错成Sugue啦),下面是完整的转场实现,以目标视图从屏幕底部滑入为例:
class FirstCustomSegue: UIStoryboardSegue { override func perform() { // 安全获取源、目标控制器的视图,避免空值崩溃 guard let initialView = source.view, let destinationView = destination.view else { super.perform() // 获取失败时执行系统默认转场 return } let screenBounds = UIScreen.main.bounds // 设置目标视图初始位置:在屏幕底部外侧 destinationView.frame = CGRect( x: 0, y: screenBounds.height, width: screenBounds.width, height: screenBounds.height ) // 先把目标视图添加到主窗口,才能看到动画 if let window = UIApplication.shared.keyWindow { window.addSubview(destinationView) } // 执行转场动画 UIView.animate(withDuration: 0.5, animations: { // 目标视图滑入屏幕 destinationView.frame = screenBounds // 给源视图加个半透明效果,增强过渡质感 initialView.alpha = 0.5 }) { _ in // 动画结束后正式完成跳转,恢复源视图状态 self.source.present(self.destination, animated: false) initialView.alpha = 1.0 } } }
接下来还要在Storyboard里做这几步配置:
- 给源控制器的按钮添加Segue,选择「Present Modally」或者你需要的跳转类型
- 选中这个Segue,在右侧Attributes Inspector面板里,把「Segue Class」设置为你写的
FirstCustomSegue - 确保目标控制器的Presentation设置为「Full Screen」(或者符合你需求的样式)
最后给你几个实用小提示:
- 如果要做其他转场效果,比如从右侧滑入、淡入淡出,只需要修改动画前的
destinationView.frame或者动画里的属性(比如alpha)就行 - 动画时长可以根据需求调整,0.3-0.8秒都是比较自然的区间
- 如果需要支持返回时的反向动画,可以在目标控制器里自定义
unwindSegue,逻辑和上面类似,只是动画方向反过来
内容的提问来源于stack exchange,提问作者Gregory Kovler
相关产品推荐
相关产品推荐

