You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行自定义转场后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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:05:28