向SwiftUI TextField添加不可编辑的后缀

im9ewurl  于 2023-05-27  发布在  Swift
关注(0)|答案(2)|浏览(130)

我在SwiftUI中有一个TextField,我希望始终显示“%”后缀。用户不应该能够删除它,它应该始终保持在右侧,即使在添加文本时。
我该怎么做?

wmtdaxz3

wmtdaxz31#

**%**可以是一个单独的视图,始终显示在正确的位置。

将UIKit控件 Package 在UIViewRepresentable中。这将给予您能够访问更多的定位信息。如果你 Package 一个UITextInput,那么你可以用firstRect(for:)得到文本最后一个字符的CGRect
然后,您可以通过以下方式显示**%**:

  • 在自定义视图中使用UIKit
  • 或者在自定义视图中添加回调或绑定,回传CGRect,用SwiftUI显示**%**。

如果你想用SwiftUI显示**%**,可以用ZStack实现:

ZStack(alignment: .topLeading) {
  Text("%").offset(x: lastCharacterPosition.maxX, y: lastCharacterPosition.minY)
  CustomTextInput(
    text: $text,
    onLastCharacterPositionChange: { rect in
      self.lastCharacterPosition = rect
    }
  )
}

请注意,在此场景中,CustomTextInput必须配置为透明。此外,偏移量可能需要一些调整,我没有尝试。

beq87vna

beq87vna2#

仅SwiftUI:您可以使用相同的文本在文本字段下创建不可见文本,然后添加任何您想要的后缀。

下面的灰色输入标签有一个不可见的hidden()文本作为背景,它总是将Text("]")文本推到正确的位置。

HStack(spacing: 1) {
    Text("[")
        .font(.sourceSans(size: 24, weight: .regular))
        .foregroundColor(UI.Color.foreground.secondary)
    TextField(
        mode.name,
        text: $word.phonemes.updating($lastUpdated)
    )
    .disableAutocorrection(true)
    .font(.sourceSans(size: 24, weight: .regular))
    .foregroundColor(UI.Color.foreground.secondary)
    .background(
        HStack(spacing: 1) {
            Text(word.phonemes)
                .font(.sourceSans(size: 24, weight: .regular))
                .hidden()
            Text("]")
                .font(.sourceSans(size: 24, weight: .regular))
                .foregroundColor(UI.Color.foreground.secondary)
            Spacer()
        }
    )
    Spacer()
}
.frame(height: 24)

相关问题