Мне очень нужна твоя помощь в этом. Заполнитель поля пароля не анимируется, пока я не начну что-то вводить. Однако анимация метки адреса электронной почты работает нормально, как и ожидалось. Когда я нажимаю на поле адреса электронной почты, его метка правильно анимируется. Кроме того, не могли бы вы просмотреть мой код на наличие технических проблем, поскольку в настоящее время я изучаю SwiftUI.
Я очень ценю вашу помощь.
Заранее спасибо.
МойКод:
//FloatingTextFieldView.swift
import SwiftUI
@available(iOS 15.0, *)
struct FloatingTextFieldView: View {
var type: String
var placeholder: String
var rightIcon: String?
var leftIcon: String?
@Binding var text: String
var onTap: () -> Void = {}
private enum Field: Int, Hashable {
case fieldName
}
@State private var isActive: Bool = false
@FocusState private var focusField: Field?
var body: some View {
VStack(alignment: .leading) {
ZStack(alignment: .leading) {
HStack {
if let leftIcon = leftIcon {
ImageView(name: rightIcon)
.onTapGesture {
print("----Icon Tapped with \(text)")
}
}
if type == "password" {
SecureField("", text: $text, onCommit: {
})
.padding(.leading, leftIcon == nil ? 0 : 8)
.padding(.trailing, rightIcon == nil ? 0 : 8)
.focused($focusField, equals:.fieldName)
} else {
TextField("", text: $text, onEditingChanged: { editing in
self.isActive = editing
print("----FieldActive \(self.isActive)")
}) {
}
.padding(.leading, leftIcon == nil ? 0 : 8)
.padding(.trailing, rightIcon == nil ? 0 : 8)
.focused($focusField, equals:.fieldName)
}
if let rightIcon = rightIcon {
ImageView(name: rightIcon)
.onTapGesture {
print("----Icon Tapped with \(text)")
}
}
}
.padding()
.overlay(
RoundedRectangle(cornerRadius: 5)
.stroke(Color.gray, lineWidth: 1)
)
CutomTextView(placeholder: placeholder,
color: .red,
backgroundColor: .white,
callback: {},
isActive: (!self.isActive && self.text.isEmpty)
)
}
}
.padding()
}
}
//CustomTextView.swift
import SwiftUI
struct CutomTextView: View {
var placeholder: String? = ""
var color: Color
var backgroundColor: Color
var callback: ()->Void
var isActive: Bool
var body: some View {
Text(placeholder ?? "placeholder")
.foregroundColor(color)
.padding(.horizontal, 10)
.background(backgroundColor)
.offset(x: self.isActive ? 20 : 10 ,y: self.isActive ? 0 : -35 )
.scaleEffect(self.isActive ? 1 : 0.8, anchor: .leading)
.animation(.easeInOut(duration: 0.4), value: self.isActive)
.onTapGesture {
}
}
}
В настоящее время проблема заключается в том, что заполнитель поля пароля не анимируется, когда я нажимаю на поле, но анимируется, когда я начинаю печатать. Я хочу анимировать его, когда я нажимаю на поле, такое же, как заполнитель поля адреса электронной почты.





У вас уже есть переменная состояния фокуса, которая определяет, когда поле получает фокус, поэтому я бы предложил вам использовать ее, чтобы определить, когда поле активно.
Кроме того, представление CustomTextView использует флаг isActive наоборот, потому что, когда isActive истинно, заполнитель занимает все поле. Поэтому вы можете переключить логику CustomTextView. Но, исходя из того, как сейчас реализована логика, попробуйте внести эти изменения в FloatingTextFieldView:
isActive, которое передается в CustomTextView:// isActive: (!self.isActive && self.text.isEmpty)
isActive: focusField != .fieldName && text.isEmpty
isActive избыточна, ее можно удалить.Ах да, вместо этого вам нужно успеть focusField != .fieldName && text.isEmpty. Ответ обновлен.
Огромное спасибо 👍 Бензи Низ.❤️
Рад, что смог помочь, спасибо за голос. Возможно, вы могли бы принять ответ (нажав галочку), если проблема будет решена?😉
Теперь анимация метки поля пароля работает, но с этим изменением возникла другая проблема: после ввода чего-либо в поле заполнитель возвращается в исходное положение, а не остается в верхней части поля.