SwiftUI 在 Zstack 中隐藏文本输入?

Posted

技术标签:

【中文标题】SwiftUI 在 Zstack 中隐藏文本输入?【英文标题】:SwiftUI Hide Text Input behind in Zstack? 【发布时间】:2021-12-28 17:13:53 【问题描述】:

所以我正在尝试为 SwiftUI 中的文本输入构建自定义外观。

我试图用一些不同的技巧来做到这一点,我想出的一个是使用标签,我打算在标签后面隐藏一个 TextInput,让它基本上像一个文本输入,而不是一个文本输入.

我什至不知道这是否可能。如果没有,我需要回到绘图板。

这就是我希望它看起来像空白的样子 黑色数字,具有自定义间距和字体等。

一旦开始输入数字,它们就会变成白色。

但是,正如您所见,textInput 是可见的。可以隐藏吗?

import SwiftUI

struct CustomInput: View 
    
    @State var id: String = " "
    @State var label1: Character = Character(" ")
    @State var label2: Character = Character(" ")
    @State var label3: Character = Character(" ")
    @State var label4: Character = Character(" ")
    @State var label5: Character = Character(" ")
    @State var label6: Character = Character(" ")
    @State var label7: Character = Character(" ")
    @State var label8: Character = Character(" ")
    @State var label9: Character = Character(" ")
    
   
    
    var body: some View 

        ZStack 
            Color.green
            HStack(spacing: 15)
                ForEach(0 ..< 9)  index in
                    Text(String(id[safe: index] ?? "0"))
                        .font(.custom("regular", size: 32))
                        .frame(height: 48)
                        .foregroundColor(id.count <= index ? .black : .white)
                
            
            .frame(width: 311, height: 48)
            
            TextField("", text: $id)
                .frame(width: 311, height: 48)
          
        
        .frame(width: 311, height: 48)

            
    
    


extension StringProtocol 
    subscript(safe offset: Int) -> Character? 
        guard 0 ..< count ~= offset else 
            return nil
        
        return self[index(startIndex, offsetBy: offset)]
    

【问题讨论】:

你能解释一下你的情况吗?例如,它总是一组数字吗? 是的,这是一个 9 位数字。 @Bnd10706 顺便说一句,你不再需要那些label*s 我尝试不使用标签,自定义字体和自定义间距使我无法使用一般的文本输入来实现结果。特别是因为我需要 0 一直存在。这只是我试图拉的一个把戏大声笑 @Bnd10706 我的意思是所有@State 属性,你没有使用它们 【参考方案1】:

这是一个可行的解决方案,供您继续使用。老实说,你最好的选择可能是使用UIViewRepresentable,但我会留给你。

注意:您需要在这里处理一些事情。它需要处理一些可能的错误。

如果您尝试使用非数字字符,则会出现错误。

禁用上下文菜单操作(复制、粘贴等)。我通过将重音设置为 .clear 来隐藏它

添加您的样式。

struct FirstView: View 
  @State var numbers = [0, 0, 0, 0, 0, 0, 0, 0, 0]
  @State var editedNumbers = ""

  var body: some View 
      ZStack 
          HStack 
              ForEach(0..<numbers.count)  index in
                  Text(String(numbers[index]))
                      .padding(.horizontal, 2)
                      .foregroundColor(numbers[index] != 0 ? .white : .black)
              
          
              .frame(width: UIScreen.main.bounds.width * 0.8)
              .padding(.vertical)
              .background(Color.green)


          TextField("", text: $editedNumbers)
              .frame(width: UIScreen.main.bounds.width * 0.8)
              .padding(.vertical)
              .foregroundColor(.clear)
              .accentColor(.clear)
              .onChange(of: editedNumbers, perform:  value in

              numbers = [0, 0, 0, 0, 0, 0, 0, 0, 0]

              for (index, char) in editedNumbers.enumerated() 
                  if index >= 0 && index <= 8 
                      numbers[index] = char.wholeNumberValue ?? 0
                  
              
          )
      
  

【讨论】:

效果明智,这基本上就是我要找的。它不允许删除,但谢谢你!我可以乱来看看我能不能找出错误 @Bnd10706 来自此解决方案的大多数错误/错误可以在 .onChange 修饰符中处理。我不知道你的要求是什么,所以我把它们排除在外了。 基本上这是一个 9 位的标签号,需要在此流程中输入。 UI 设计师想出了这个愚蠢的设计,它是每个人都喜欢的东西。它的愚蠢。谢谢,这是一个很好的起点。 实际上,您只需使用 .forgroundcolor 进行清除就解决了我的问题。我可以在我的原始代码中使用它 刚刚添加了一些修复程序以阻止崩溃以及在退格键上重置回 0。

以上是关于SwiftUI 在 Zstack 中隐藏文本输入?的主要内容,如果未能解决你的问题,请参考以下文章

放入ZStack时swiftui列表不起作用

SwiftUI,ScrollView 在 ZStack 中向上推送 VStack 图像

SwiftUI - 滑动文本动画和定位

SwiftUI 在 ZStack 中不居中

SwiftUI动画视图出现在ZStack中时出现奇怪的过渡

如何通过拖动在SwiftUI ZStack中重新排列视图