网罗开发(小红书、快手、视频号同名)

  大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG

我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。

展菲:您的前沿技术领航员
👋 大家好,我是展菲!
📱 全网搜索“展菲”,即可纵览我在各大平台的知识足迹。
📣 公众号“Swift社区”,每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。
💬 微信端添加好友“fzhanfei”,与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。
📅 最新动态:2025 年 3 月 17 日
快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!


文章目录

    • 前言
    • 问题的根源:SystemInputAssistantView
    • 实际场景中的痛点
    • 三种解决方法
      • 彻底移除工具栏(推荐且最干净)
      • 关闭预测与自动更正
      • 延迟注册键盘监听
    • 综合优化方案示例
    • 经验总结

前言

在开发 SwiftUI 登录页面时,你可能遇到过这样一个尴尬的场景:

用户点击邮箱或密码输入框,页面突然轻微卡顿,输入框还被键盘顶上去一部分,甚至直接消失在可视区域之外。与此同时,Xcode 控制台刷出一大段红色的警告:

Unable to simultaneously satisfy constraints
SystemInputAssistantView.height == 72
...

看起来很吓人,像是哪里写错了 Auto Layout 约束。其实,这并不是你布局代码的锅,而是 iOS 自带的输入法工具栏在布局过程中和键盘的动画发生了冲突。

问题的根源:SystemInputAssistantView

SystemInputAssistantView 是什么?

它就是 iOS 键盘顶部的“快捷工具栏”,比如:

  • QuickType 预测文字栏
  • 自动更正建议
  • 快捷操作按钮(复制/粘贴等)

当用户点进输入框时,这个工具栏会出现在键盘上方,占据固定的高度(通常是 72pt)。
在大多数 UIKit 场景中,它工作得很正常。但在 SwiftUI 中,如果你的布局带有 ScrollView、键盘监听或者动画,系统会给它加上一组比较“强”的约束,同时键盘弹出时会重新计算高度,就会出现两个约束互相冲突的情况。

实际场景中的痛点

我在项目中就遇到过这个问题,尤其是在做一个标准的邮箱 + 密码登录页时,体验很不友好:

  1. 控制台全是红色警告
    虽然不影响编译,但调试时很烦,真正的日志被淹没了。

  2. 第一次点击输入框会卡顿
    由于冲突,系统需要打断约束并重新布局,这个过程会让动画卡一下。

  3. 输入框位置错乱
    有时会被顶到屏幕外,尤其是密码输入框,用户得手动滚动页面才能看到。

  4. 滚动体验不稳定
    当你用 ScrollView 做布局时,这个冲突会让滚动位置出现异常跳动。

三种解决方法

彻底移除工具栏(推荐且最干净)

如果你的输入框不需要键盘上方的快捷操作栏,可以直接移除 SystemInputAssistantView。这样它就不会参与布局,自然也不会冲突。

import UIKitextension UITextField {open override var inputAssistantItem: UITextInputAssistantItem {let item = super.inputAssistantItemitem.leadingBarButtonGroups = []item.trailingBarButtonGroups = []return item}
}

放到一个 UIKitExtensions.swift 文件里即可,所有 TextField / SecureField 都会自动应用。

优点:

  • 根治约束冲突
  • 让键盘更简洁
  • 适合大多数表单输入场景

缺点:

  • 快捷操作栏消失(如果用户需要复制/粘贴按钮,就不适用)

关闭预测与自动更正

有时冲突是预测栏引起的,直接关闭预测和首字母大写,可以减少冲突概率,同时让输入体验更可控。

TextField("请输入邮箱", text: $email).textFieldStyle(RoundedBorderTextFieldStyle()).keyboardType(.emailAddress).textInputAutocapitalization(.never) // 禁用自动首字母大写.disableAutocorrection(true)         // 禁用自动更正

这种方式不会移除工具栏,只是减少它的内容,从而减少布局压力。

延迟注册键盘监听

如果你在 .onAppear 中立刻注册键盘事件监听(比如调整 ScrollView 的偏移量),很可能和系统键盘动画冲突。
延迟几十毫秒再注册,可以让布局先稳定下来。

.onAppear {DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {addKeyboardObservers()}
}

综合优化方案示例

我给你一个结合三种思路的优化版 SwiftUI 登录页代码:

import SwiftUI
import UIKit// 移除键盘工具栏
extension UITextField {open override var inputAssistantItem: UITextInputAssistantItem {let item = super.inputAssistantItemitem.leadingBarButtonGroups = []item.trailingBarButtonGroups = []return item}
}struct LoginView: View {@State private var email = ""@State private var password = ""@State private var offset: CGFloat = 0var body: some View {ScrollView {VStack(spacing: 20) {// 邮箱输入VStack(alignment: .leading) {Text("邮箱").font(.headline)TextField("请输入邮箱", text: $email).textFieldStyle(RoundedBorderTextFieldStyle()).keyboardType(.emailAddress).textInputAutocapitalization(.never).disableAutocorrection(true)}// 密码输入VStack(alignment: .leading) {Text("密码").font(.headline)SecureField("请输入密码", text: $password).textFieldStyle(RoundedBorderTextFieldStyle())}// 登录按钮Button("登录") {print("Login tapped")}.frame(maxWidth: .infinity).frame(height: 50).background(Color.blue).foregroundColor(.white).cornerRadius(25)Spacer()}.padding().offset(y: -offset) // 让输入框随键盘上移}.onAppear {DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {addKeyboardObservers()}}}func addKeyboardObservers() {NotificationCenter.default.addObserver(forName: UIResponder.keyboardWillShowNotification,object: nil,queue: .main) { notif inif let frame = notif.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect {offset = frame.height / 2}}NotificationCenter.default.addObserver(forName: UIResponder.keyboardWillHideNotification,object: nil,queue: .main) { _ inoffset = 0}}
}

特点:

  • 不卡顿:延迟监听键盘
  • 不冲突:移除工具栏
  • 可滚动:使用 ScrollView 包裹
  • 自适应键盘:输入框永远不会被遮挡

经验总结

  • SwiftUI 在处理键盘和输入框时,底层还是依赖 UIKit,所以有些问题需要用 UIKit 方法来解决。
  • 如果你的表单输入场景很简单,直接移除 SystemInputAssistantView 是最高效的办法。
  • 任何和键盘动画相关的监听,都建议延迟一点时间注册,避免抢占布局阶段。
  • 测试时要多用不同机型(尤其是刘海屏和非刘海屏),键盘高度和动画时间略有差异。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/92703.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/92703.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/92703.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

建筑物实例分割数据集-9,700 张图片 城市规划与发展 灾害评估与应急响应 房地产市场分析 智慧城市管理 地理信息系统(GIS) 环境影响评估

建筑物实例分割数据集-9,700 张图片📦 已发布目标检测数据集合集(持续更新)🏢 建筑物实例分割数据集介绍📌 数据集概览包含类别🎯 应用场景🖼 数据样本展示使用建议🌟 数据集特色&am…

LeetCode 刷题【36. 有效的数独】

36. 有效的数独 自己做 解&#xff1a;多层for class Solution { public:bool isValidSudoku(vector<vector<char>>& board) {int hight board.size(); //长if (hight 0)return true;int wide board[0].size(); //宽//判断一行是否出现重复bool…

Java 日志从入门到精通:告别日志混乱

作为一名 Java 开发者&#xff0c;你是否曾在生产环境故障排查时面对过这样的困境&#xff1a;系统报错却找不到关键日志&#xff0c;日志文件大到无法打开&#xff0c;或者日志内容杂乱无章根本无法定位问题&#xff1f;日志作为系统运行的 “黑匣子”&#xff0c;其重要性不言…

系统开发 Day1

前端开发 目的&#xff1a; 开发一个平台&#xff08;网站&#xff09; - 前端开发&#xff1a;HTML CSS JavaScript - web框架&#xff1a;接受请求和处理 - MySQL数据库&#xff1a;存储数据的地方快速上手&#xff1a;基于Flask Web框架快速搭建一个网站 深度学习&#xff…

机器视觉任务(目标检测、实例分割、姿态估计、多目标跟踪、单目标跟踪、图像分类、单目深度估计)常用算法及公开数据集分享

本文按目标检测、实例分割、姿态估计、多目标跟踪、单目标跟踪、图像分类、单目深度估计七个任务分类&#xff0c;融合数据集介绍、评价指标及推荐算法&#xff0c;方便查阅&#xff1a; 一、目标检测 目标检测任务需定位图像中目标的边界框&#xff08;bounding box&#xff0…

MongoTemplate中setOnInsert与set方法的深度解析

MongoTemplate中setOnInsert与set方法的深度解析 在Spring Data MongoDB的MongoTemplate中&#xff0c;setOnInsert和set方法都是在更新文档时使用的&#xff0c;但它们在处理upsert操作&#xff08;即&#xff0c;如果文档不存在则插入&#xff0c;存在则更新&#xff09;时扮…

利用OJ判题的多语言优雅解耦方法深入体会模板方法模式、策略模式、工厂模式的妙用

在线评测系统&#xff08;Online Judge, OJ&#xff09;的核心是判题引擎&#xff0c;其关键挑战在于如何高效、安全且可扩展地支持多种编程语言。在博主的项目练习过程中&#xff0c;借鉴了相关设计模式实现一种架构设计方案&#xff0c;即通过组合运用模板方法、策略、工厂等…

[FOC电机控制]霍尔传感器于角度问题

如果电机有1对极(p1&#xff0c;那么每旋转一圈的机械角度&#xff0c;电气角度会转动一圈&#xff08;360&#xff09;。如果电机有2对极(p2&#xff0c;那么每旋转一圈的机械角度&#xff0c;电气角度会转动两圈&#xff08;720&#xff09;。

阿里云 Flink

阿里云 Flink 是阿里云基于Apache Flink打造的企业级实时计算平台&#xff0c;旨在为用户提供高效、稳定、易用的流处理与批处理能力&#xff0c;帮助企业快速构建实时数据处理链路&#xff0c;支撑实时业务决策。核心特性流批一体计算继承 Apache Flink “流批一体” 的核心优…

企业级高性能web服务器

1 web服务基础 1.1 正常情况的单次web服务访问流程&#xff1a; 正常情况下&#xff0c;单次 Web 服务访问流程从用户在客户端发起请求开始&#xff0c;到最终在客户端展示内容结束&#xff0c;涉及客户端、网络传输、服务器端等多个环节&#xff0c;以下是详细过程&#xff…

免费PDF编辑软件 pdf24-creator 及其安装包

最近发现了一款还算是不错的PDF编辑和阅读软件 pdf24-creator&#xff0c;官方下载网站为&#xff1a;https://tools.pdf24.org/zh/creator&#xff0c;但是官方下载如果没有魔法的话&#xff0c;下载速度很慢&#xff0c;比百度网盘下载还满&#xff0c;因此我把它分享到网盘。…

openvela之ADB

ADB&#xff08;Android Debug Bridge&#xff09;是一款功能丰富的命令行工具&#xff0c;旨在实现开发工作站与设备&#xff08;如模拟器、实体设备&#xff09;之间的通信。通过 ADB&#xff0c;开发者可以便捷地在设备上执行命令、传输文件、调试应用等。本文将详细介绍 AD…

如何控制需求交付节奏

有效控制需求的交付节奏&#xff0c;其核心在于将产品开发过程从一个不可预测的、时快时慢的混乱状态&#xff0c;转变为一套产出稳定、流程顺畅、步调可持续的系统化交付机制。要成功构建这套机制&#xff0c;实现有节奏的价值交付&#xff0c;必须综合运用五大关键策略&#…

汇编中常用寄存器介绍

X86-32位寄存器 4个数据寄存器&#xff1a;EAX、EBX、ECX和EDX; 2个变址和指针寄存器&#xff1a;ESI和EDI; 2个指针寄存器&#xff1a;ESP和EBP; 1个指令指针寄存器&#xff1a;EIP; 6个段寄存器&#xff1a;ES、CS、SS、DS、FS和GS; 1个标志寄存器&#xff1a;EFlags。 在X8…

SOMGAN:用自组织映射改善GAN的模式探索能力

论文信息 论文题目:Improving mode exploring capability ofgenerative adversarial nets by self-organizing map(利用自组织映射提高生成对抗网络的模式探索能力) 期刊:Neurocomputing 摘要:生成对抗网络(GANs)的出现将生成模型的研究推向了一个新的高潮。支持这一进步…

《汇编语言:基于X86处理器》第12章 复习题和练习

本篇记录了《汇编语言&#xff1a;基于X86处理器》第12章 复习题和练习的笔记。12.6复习题和练习12.6.1 简答题1.假设有二进制浮点数1101.01101&#xff0c;如何将其表示为十进制分数之和?答&#xff1a;1101.01101(1x)(1x)(0x)(1x)(0x)(1x)(1x)(1x)(1x) 13.406252.为什么十进…

ApacheCon Asia 2025 中国开源年度报告:Apache Doris 国内第一

上周刚落下帷幕的 ApacheCon Asia 2025 中&#xff0c;一个数据让所有人都为之震撼&#xff1a;全球 Apache 基金会项目 OpenRank 排行榜中&#xff0c;Apache Doris 位居第二&#xff0c;在中国 Apache 项目中更是稳居第一。 这个排名意味着什么&#xff1f;在 Apache 基金会管…

Pytest中实现自动生成测试用例脚本代码

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快在Python的测试框架中&#xff0c;我们通常会针对某个系统进行测试用例的维护&#xff0c;在对庞大系统进行用例维护时&#xff0c;往往会发现很多测试用例是差不多…

一周学会Matplotlib3 Python 数据可视化-标注 (Annotations)

锋哥原创的Matplotlib3 Python数据可视化视频教程&#xff1a; 2026版 Matplotlib3 Python 数据可视化 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 课程介绍 本课程讲解利用python进行数据可视化 科研绘图-Matplotlib&#xff0c;学习Matplotlib图形参数基本设置&…

安全合规1--实验:ARP欺骗、mac洪水攻击、ICMP攻击、TCP SYN Flood攻击

一、实验环境 (思科的云实验平台)攻击机&#xff1a;Kali Linux&#xff08;IP&#xff1a;192.168.234.128&#xff0c;MAC&#xff1a;00:00:29:35:64:EC&#xff09;目标1&#xff1a;网关&#xff08;IP&#xff1a;192.168.234.2&#xff0c;MAC&#xff1a;00:50:56:ED:D…