SwiftUI 如何为文本字段中的每个字符添加动画?

2023-12-07

当用户在文本字段中键入字符时,我想在每个新键入的字符上显示一些动画(有点像 Cash App 为数字设置动画的方式,但我也想为字母字符实现它)。

enter image description here

在 SwiftUI 中可以做到这一点吗?我的直觉是,我可能必须桥接到 UIKit 才能更细致地访问textfield的元素,但不确定如何实际实现它。


你可以创建一个“假”TextField出现在真实的之上。然后显示a中的字符ForEach.

它是用FocusState在 iOS 15 中

@available(iOS 15.0, *)
struct AnimatedInputView: View {
    @FocusState private var isFocused: Int?
    @State var text: String = ""
    //If all the fonts match the cursor is better aligned 
    @State var font: Font = .system(size: 48, weight: .bold, design: .default)
    @State var color: Color = .gray
    var body: some View {
        HStack(alignment: .center, spacing: 0){
            //To maintain size in between the 2 views
            Text(text)
                .font(font)
                .opacity(0)
                .overlay(
                    //This textField will be invisible
                    TextField("", text: $text)
                        .font(font)
                        .foregroundColor(.clear)
                        .focused($isFocused, equals: 1)
                )
                .background(
                    ZStack{
                        HStack(alignment: .center, spacing: 0, content: {
                            //You need an array of unique/identifiable characters
                            let uniqueArray = text.uniqueCharacters()
                            ForEach(uniqueArray, id: \.id, content: { char in
                                CharView(char: char.char, isLast: char == uniqueArray.last, font: font)
                                
                            })
                        })
                    }.opacity(1)
                        .minimumScaleFactor(0.1)
                    
                )
            
                .onAppear(perform: {
                    //Bring focus to the hidden TextField
                    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5, execute: {
                        isFocused = 1
                    })
                })
        }
        .padding()
        .border(color)
        .font(.title)
        //Bring focus to the hidden textfield
        .onTapGesture {
            isFocused = 1
        }
    }
}
struct CharView: View{
    var char: Character
    var isLast: Bool
    var font: Font
    @State var scale: CGFloat = 0.75
    var body: some View{
        Text(char.description)
            .font(font)
            .minimumScaleFactor(0.1)
            .scaleEffect(scale)
            .onAppear(perform: {
                //Animate only if last character
                if isLast{
                    withAnimation(.linear(duration: 0.5)){
                        scale = 1
                    }
                }else{
                    scale = 1
                }
            })
    }
}
@available(iOS 15.0, *)
struct AnimatedInputView_Previews: PreviewProvider {
    static var previews: some View {
        AnimatedInputView()
    }
}
//Convert String to Unique characers
extension String{
    func uniqueCharacters() -> [UniqueCharacter]{
        let array: [Character] = Array(self)
        return array.uniqueCharacters()
    }
    func numberOnly() -> String {
        self.trimmingCharacters(in: CharacterSet(charactersIn: "-0123456789.").inverted)
    }
    
}
extension Array where Element == Character {
    
    func uniqueCharacters() -> [UniqueCharacter]{
        var array: [UniqueCharacter] = []
        
        for char in self{
            array.append(UniqueCharacter(char: char))
        }
        return array
    }
    
}

//String/Characters can be repeating so yu have to make them a unique value
struct UniqueCharacter: Identifiable, Equatable{
    var char: Character
    var id: UUID = UUID()
}

这是一个示例版本。只接受数字,如计算器示例

import SwiftUI

@available(iOS 15.0, *)
struct AnimatedInputView: View {
    @FocusState private var isFocused: Int?
    @State var text: String = ""
    //If all the fonts match the cursor is better aligned 
    @State var font: Font = .system(size: 48, weight: .bold, design: .default)
    @State var color: Color = .gray
    var body: some View {
        HStack(alignment: .center, spacing: 0){
            Text("$").font(font)
            //To maintain size in between the 2 views
            Text(text)
                .font(font)
                .opacity(0)
                .overlay(
                    //This textField will be invisible
                    TextField("", text: $text)
                        .font(font)
                        .foregroundColor(.clear)
                        .focused($isFocused, equals: 1)
                        .onChange(of: text, perform: { value in
                               if Double(text) == nil{
                                   //Leaves the negative and decimal period
                                   text = text.numberOnly()
                               }
                               //This condition can be improved.
                               //Checks for 2 occurences of the decimal period
                               //Possible solution
                               while text.components(separatedBy: ".").count > 2{
                                   color = .red
                                   text.removeLast()
                               }

                               //This condition can be improved.
                               //Checks for 2 occurences of the negative
                               //Possible solution
                               while text.components(separatedBy: "-").count > 2{
                                   color = .red
                                   text.removeLast()
                               }
                               color = .gray

                           })
                )
                .background(
                    ZStack{
                        HStack(alignment: .center, spacing: 0, content: {
                            //You need an array of unique/identifiable characters
                            let uniqueArray = text.uniqueCharacters()
                            ForEach(uniqueArray, id: \.id, content: { char in
                                CharView(char: char.char, isLast: char == uniqueArray.last, font: font)
                                
                            })
                        })
                    }.opacity(1)
                        .minimumScaleFactor(0.1)
                    
                )
            
                .onAppear(perform: {
                    //Bring focus to the hidden TextField
                    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5, execute: {
                        isFocused = 1
                    })
                })
        }
        .padding()
        .border(color)
        .font(.title)
        //Bring focus to the hidden textfield
        .onTapGesture {
            isFocused = 1
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SwiftUI 如何为文本字段中的每个字符添加动画? 的相关文章

  • 将自定义图像设置为 UIBarButtonItem 但它不显示任何图像

    我想将自定义图像设置为 UIBarButtonItem 但它只显示周围的矩形框并且不显示实际图像 func setupBrowserToolbar let browser UIToolbar frame CGRect x 0 y 20 wi
  • Swift 3 中的 JSON 解析

    有没有人能够找到一种在 Swift 3 中解析 JSON 文件的方法 我已经能够返回数据 但在将数据分解为特定字段时我没有成功 我会发布示例代码 但我已经尝试了很多不同的方法但没有成功 并且没有保存任何代码 我想要解析的基本格式是这样的 提
  • 对成员“buildBlock()”的引用不明确

    我一直在尝试使用 Swift UI 为 iOS 13 制作一个应用程序 但我不断收到这个奇怪的错误 对成员 buildBlock 的引用不明确 无论我做什么 错误都不会消失 我尝试一次对代码段进行注释 以查看哪一部分可能导致了问题 但唯一有
  • Swift:如何减少 didupdatelocations 调用

    我想出了一些代码来打印我所在位置的地址和邮政编码 这是在 didupdatelocation 函数中完成的 我遇到的唯一问题是 didupdatelocation 函数每秒都会更新该地址 因为这电池效率非常低 所以我一直在寻找使用间隔的方法
  • SwiftUI:状态栏颜色

    有没有办法将 SwiftUI 视图的状态栏更改为白色 我可能错过了一些简单的东西 但我似乎找不到在 SwiftUI 中将状态栏更改为白色的方法 到目前为止我只看到 statusBar hidden Bool 状态栏文本 色调 前景色可以通过
  • Swift Codable 将空 json 解码为 nil 或空对象

    这是我的代码 class LoginUserResponse Codable var result String var data LoginUserResponseData var mess String public class Log
  • 在 SwiftUI 中使用分段式选取器在两个页面之间滑动

    我有一个Picker with pickerStyle SegmentedPickerStyle 使其成为分段控件 我想让页面在之间平滑滑动 而不是使用条件语句替换视图 这是我迄今为止所做的 gif 这是到目前为止的代码 由if 而不是在不
  • 如何防止Apple Watch进入睡眠状态?

    我们正在开发一个 Apple Watch 项目 但如果不被打扰 手表就会进入睡眠状态 有什么办法可以阻止它进入睡眠状态吗 据我所知和有关该主题的其他搜索 目前还没有api可通过编程方式启用或禁用 Apple Watch 的睡眠模式
  • Swift C 回调 - Swift 类指针的 takeUnretainedValue 或 takeRetainedValue

    我有一些UIView or UITableViewCell 里面我有 C 回调 例如 CCallback bridge self observer data gt Void in let mySelf Unmanaged
  • CGPoint 标量乘法 Swift

    我正在 SpriteKit 中构建一个平台游戏 并将为我的实体实现更新功能 以便它们根据重力和速度移动 但是 我需要使添加的速度量与增量时间成比例 以防止帧速率影响我的实体的移动方式 因此我将导入 GLKit 以便我可以使用标量函数 但是
  • 我可以/如何用 RC3 替换我的 KVO 东西?

    我正在尝试将一个使用 Facebook 的 KVOController 的 objc 应用程序移植到 Swift 我被鼓励去看看RC3 https github com ReactiveCocoa ReactiveCocoa作为一种替代且更
  • iOS:Swift - 如何在触摸时向地图添加精确定位并获取该位置的详细地址?

    我想在 iOS 地图的触摸上添加注释并获取各个位置的详细地址 地标 我如何在 Swift 中实现这一目标 提前致谢 要对地图上的触摸做出反应 您需要为地图视图设置点击识别器 in viewDidLoad let gestureRecogni
  • Swift 3 错误:[_SwiftValue pointSize] 无法识别的选择器发送到实例

    我刚刚将我们的项目迁移到 swift 3 发现由于一个问题导致大量崩溃 由于未捕获的异常 NSInvalidArgumentException 而终止应用程序 原因 SwiftValue pointSize 发送到实例的无法识别的选择器 该
  • Swift - 选择值后隐藏 pickerView

    我发现了类似的问题 他们的答案很有帮助 但我坚持最后一件事 我试图在点击字段时显示 pickerView 然后选择数据时 我希望 pickerView 隐藏 我可以从 pickerView 获取数据来隐藏 但是 pickerView 后面仍
  • Transit MKDirectionsRequest 产生 null 错误 Error Domain=MKErrorDomain Code=5 "(null)"

    我正在尝试使用 MapKit Directions Request 来获取两个坐标之间的交通方向 当我切换到其他 非 Transit 类型时 下面的代码可以工作 但是当我切换到 Transit 时 它会抛出一个错误 该错误在 Apple 文
  • 我们可以从 LinkPresentation 框架中的 LPLinkView 中提取图像吗?

    我想在我的应用程序中呈现丰富的链接 并将这些数据发送到我的服务器 我需要访问视图内的图像LPLinkView https developer apple com documentation linkpresentation lplinkvi
  • Swift 中带圆角的 NSWindow

    我想要一个圆角的窗户 但我在每个角落都有一个白点 Code let effect NSVisualEffectView frame NSRect x 0 y 0 width 0 height 0 effect blendingMode be
  • 无法转换“UINavigationController”类型的值

    我正在为我的应用程序实现一个搜索界面 因此基本上我会将搜索关键字从一个 ViewController 传递到另一个 ViewController 我已经多次进行过这种类型的参数传递 但这次似乎有些奇怪 目标 ViewController 嵌
  • 将数字分解为单个数字的数组

    如果我有整数 123 并且我想将数字分解为数组 1 2 3 最好的方法是什么 我已经搞乱了很多 并且我有以下工作 var number 123 var digits Array String number map Int strtoul S
  • 在 UIMenuItem 上设置accessibilityLabel

    我正在尝试设置accessibilityLabel of a UIMenuItem而且似乎没有效果 无论如何 VoiceOver 只是读取项目的标题 let foo UIMenuItem title foo action selector

随机推荐

  • List.Add() 的问题仅保存最后添加的项目[重复]

    这个问题在这里已经有答案了 我注意到的问题是这行代码 tempList Add orderables 在此完整代码中 AssociatedComboItems ai new AssociatedComboItems List
  • PHP:将分隔的逗号字符串值与多个数组值插入到 MySql 中

    这是我的目标 1 我只有一个从服务器发送的 ID 其中包含以逗号分隔的字符串列表 它看起来像这样 ID 1 名称 蓝色 红色 绿色 黄色 2 这是我的尝试 2 1 我尝试使用此代码将名称更改为数组 myString Red Blue Bla
  • 如何重新加载在另一个文件中导入的Python模块?

    我正在尝试了解 Python 如何重新加载模块 但遇到了障碍 假设我有 dir1 file1 py from dir2 file2 import ClassOne myObject ClassOne dir1 dir2 file2 py c
  • “data.table”包中的“setDT”错误

    这好像是setDT每当您尝试在存储的数据上运行它时 都会返回错误datasets包裹 例如 library data table setDT CO2 Error in assign name x parent frame inherits
  • Spring Hibernate - CrudRepository 和 SessionFactory 之间的区别

    我正在考虑使用 Hibernate 来保存我的模型 我似乎找到了两种方法来做到这一点 第一个正在使用SessionFactory 例如 public Collection loadProductsByCategory String cate
  • iOS 7 弃用核心蓝牙

    在 iOS 7 中 一些核心蓝牙内容现已被弃用 例如 CBUUIDGenericAccessProfileString 和 CBUUIDDeviceNameString 这苹果文档 state Deprecated There are no
  • 无法使用类型为 (Int, @value Int) 的参数列表调用“+=”

    我有课Transaction其中有一个变量金额类型的Int 我想从另一个班级访问它 我有一个array of Transactions并将其所有金额相加 所以我有这段代码 func computeTotal gt Int let total
  • Java Double 变量有奇怪的值[重复]

    这个问题在这里已经有答案了 可能的重复 Java 中的浮点运算不能产生精确的结果 我正在做这个简单的除法 但我得到了一个非常奇怪的输出 double a 60 1 2 1 1 gt 600 0000000000008 什么时候应该是600
  • MySQL 中日期字段按年份分组

    我有一个 MySQL 数据库 其中有一个客户表 一些虚拟数据是 customer id date 000001 2008 10 10 000002 2008 11 11 000003 2010 01 02 000004 2007 04 03
  • 为每个用户创建子域

    如何为网站的每个注册用户创建一个子域during注册 对于下面的场景 用户打开 site com register 提供详细信息并提交 立即重定向到 newuser site com 用户可以在 newuser site com 区域工作
  • 有没有办法使用 isin() 作为 pandas 数据框中另一列的计算器函数?

    我的 pandas 数据框中有一列 Product ID 我想基于此列创建一个计算列 3 5 8 中的 PRODUCT ID 将采用值 旧 其他值采用 新 现在我正在使用 for 循环来检查数据帧的每个索引 portfoy PRODUCT
  • 将二进制数分成零组和一组

    例如 我有一个二进制数10000111000011 并希望将其分成连续的 1 和 0 组 1 0000 111 0000 11 我认为这是使用环视的绝佳机会 我的正则表达式对数字使用正向后查找 它捕获以供以后反向引用 然后对同一数字使用负向
  • 在Python中的一行中动态打印字符串

    我正在尝试在一行中打印字符串 我已经找到了解决方案 但它们不能正确地与 Windows 一起使用 我有包含名称的文本文件 我想像这样打印它们 name john然后将 john 更改为下一个名字并保留name 我已经编写了这段代码 但在 W
  • 从 Cefsharp 浏览器获取 HTML

    我在我的 WinForm 项目中使用 CefSharp v55 0 页面加载后 我想从中获取 HTML 代码 为此 我正在使用这个 private void WebBrowserFrameLoadEnded object sender Fr
  • 如何用手指在画布上绘画?

    我正在尝试通过 NET Maui 制作一些绘图的东西 我已阅读文档 现在我可以通过命令绘制形状 但我不知道如何使用触摸事件 用手指绘图 来做到这一点 你知道我该怎么做吗 您知道这方面的任何指南或文档吗 我应该读什么 您可以使用 NET MA
  • 如果形状的高度大于表单的高度,则显示滚动条

    如果我的形状高度大于表单高度 我只需要在表单上显示滚动条 这样 当用户向下滚动时 它可以显示形状的末端 这是我的代码 public partial class Form1 Form public Form1 InitializeCompon
  • 使用 Java 设置 Windows 系统变量

    有没有办法将特定目录添加到 Windows 系统变量 PATH 中 这似乎不起作用 String cmd cmd c set PATH PATH c test Runtime getRuntime exec cmd c test 没有出现在
  • R:将 R 因子扩展为每个因子级别的虚拟列

    我在 R 中有一个相当大的数据框 有两列 我正在努力摆脱Code柱子 factor输入 858 个级别 虚拟变量 问题是 当我尝试这样做时 R Studio 总是崩溃 gt str d data frame 649226 obs of 2
  • 如何在不插入空格的情况下用点连接两个宏?

    我正在预处理 InfoPlist 文件以包含我的修订号 我的标题如下所示 import svn h define APP VERSION 1 0 define APP BUILD APP VERSION SVN REVISION 当我从程序
  • SwiftUI 如何为文本字段中的每个字符添加动画?

    当用户在文本字段中键入字符时 我想在每个新键入的字符上显示一些动画 有点像 Cash App 为数字设置动画的方式 但我也想为字母字符实现它 在 SwiftUI 中可以做到这一点吗 我的直觉是 我可能必须桥接到 UIKit 才能更细致地访问