SwiftUI: отступы внутри текстового поля

У меня TextField в SwiftUI. Когда я применяю к нему отступы как

TextField(text, text: $value)
    .padding()

отступ находится за пределами области касания TextField, т.е. нажатие на отступ не переводит текстовое поле в фокус.

Я хотел бы иметь возможность сфокусировать TextField, даже если пользователь нажимает на заполнение.


person Vivek Roy    schedule 13.02.2021    source источник
comment
Проверьте, отвечает ли это на ваш вопрос.   -  person ScorpiCon    schedule 13.02.2021
comment
Это ужасно сложно для чего-то столь простого. Необходимость включать библиотеки только для того, чтобы правильно добавить отступы в текстовое поле. В любом случае. Спасибо @ScorpiCon   -  person Vivek Roy    schedule 13.02.2021


Ответы (3)


Вы можете это проверить. пока я делал только с верхним и нижним отступом. вы можете сделать то же самое с начальным и конечным (или с горизонтальным и вертикальным). как указано в вопросе, это сделает это Я хотел бы иметь возможность сфокусировать TextField, даже если пользователь нажимает на заполнение.

struct ContentView: View {
@State var name = ""
@State var isTextFieldFocused = false
var body: some View {
        ZStack {
            HStack{
                Text(name)
                    .font(.system(size: 50 , weight: .black))
                    .foregroundColor(isTextFieldFocused ? Color.clear : Color.black)
                Spacer()
            }
            TextField(name, text: $name , onEditingChanged: { editingChanged in
                isTextFieldFocused = editingChanged
            }) 
            .font(.system(size: isTextFieldFocused ? 50 :  100 , weight: .black))
            .foregroundColor(isTextFieldFocused ? Color.black  : Color.clear)
            .frame(width: 300, height: isTextFieldFocused ? 50 :  100 , alignment: .center)
                        .padding(.leading, isTextFieldFocused ? 25 : 0  )
                        .padding(.trailing, isTextFieldFocused ? 25 : 0 )
            
            .padding(.top,isTextFieldFocused ? 25 : 0 )
            .padding(.bottom,isTextFieldFocused ? 25 : 0 )
            
        }.frame(width: 300)
        .background(Color.red.opacity(0.2))
}
}
person Ahmad    schedule 13.02.2021
comment
Это не отвечает на вопрос. Он добавляет отступ, если текстовое поле действительно изменяется. Но вопрос в том, как сфокусировать TextField, когда пользователь касается добавленного отступа. - person Ali; 05.05.2021

Да, но вам нужно создать свой собственный TextFieldStyle. Вот пример:

struct CustomTextField: View {
    
    public struct CustomTextFieldStyle : TextFieldStyle {
        public func _body(configuration: TextField<Self._Label>) -> some View {
            configuration
                .font(.largeTitle) // set the inner Text Field Font
                .padding(10) // Set the inner Text Field Padding
                //Give it some style
                .background(
                    RoundedRectangle(cornerRadius: 5)
                        .strokeBorder(Color.primary.opacity(0.5), lineWidth: 3)) 
        }
    }
    @State private var password = ""
    @State private var username = ""
    
    var body: some View {
        VStack {
            TextField("Test", text: $username)
                .textFieldStyle(CustomTextFieldStyle()) // call the CustomTextField
            SecureField("Password", text: $password)
                .textFieldStyle(CustomTextFieldStyle())
        }.padding()
    }
}
person Rami Almofleh    schedule 25.06.2021
comment
Похоже, это не влияет на область касания. - person arsenius; 19.07.2021

Я не знаю, можете ли вы добавить отступ внутри TextField, но вы можете заполнить его из внешней среды и дать ему фон формы с тем же цветом фона вашего TextField.

Попробуй это;

        TextField("Username", text: $value)
            .background(Color.yellow)
            .padding(50)
            .background(Capsule().fill(Color.white))
person Mehmet Demirkan    schedule 13.02.2021
comment
Я хочу увеличить область касания TextField. Это не так? - person Vivek Roy; 13.02.2021