#swiftui #path #shapes
Вопрос:
Я пытаюсь создать пользовательскую фигуру, которая по сути является круглым прямоугольником, но в верхней строке немного отсутствует, поэтому она подходит для любого заполнителя, который я хочу в текстовом поле . И все это прекрасно работает, проблема в том, что я, похоже, не могу применить .cornerRadius к этой пользовательской форме, потому что, похоже, она всегда обрезает форму, у кого-нибудь есть какие-либо идеи? Я перепробовал все, кроме рисования пользовательских квадратичных фигур, чтобы просто закруглить углы.
Это моя индивидуальная форма
struct RoundRectanglePlaceholder: Shape { let placeholder: String let text: String func path(in rect: CGRect) -gt; Path { var path = Path() if text.isEmpty { return RoundedRectangle(cornerRadius: 6).path(in: rect) } else { let placeholderSize = placeholder.widthOfString(usingFont: .systemFont(ofSize: 13)) path.move(to: .init(x: rect.minX, y: rect.maxY)) path.addLine(to: .init(x: rect.maxX, y: rect.maxY)) path.addLine(to: .init(x: rect.maxX, y: rect.minY)) path.addLine(to: .init(x: rect.minX placeholderSize 20, y: rect.minY)) path.move(to: .init(x: rect.minX, y: rect.maxY)) path.addLine(to: .init(x: rect.minX, y: rect.minY)) path.addLine(to: .init(x: rect.minX 10 , y: rect.minY)) } return path } }
И вот как я его использую
struct TextFieldView: View { let title: String @State var text: String var body: some View { ZStack(alignment: .leading) { Text(title) .foregroundColor(text.isEmpty ? Color(.placeholderText) : .purple) .offset(y: text.isEmpty ? 0 : -30) .offset(x: text.isEmpty ? 0 : 5) .scaleEffect(text.isEmpty ? 1 : 0.75, anchor: .leading) .padding([.top, .leading, .bottom], 12) TextField("", text: $text) .accentColor(.purple) .padding([.top, .leading, .bottom], 12) } .animation(.spring(response: 0.3, dampingFraction: 0.7), value: text) .overlay( RoundRectanglePlaceholder(placeholder: title, text: text) .stroke(Color.gray, style: StrokeStyle(lineWidth: 1, lineCap: .round)) .clipShape(RoundedRectangle(cornerRadius: 6, style: .continuous)) ) } }
Комментарии:
1. Почему бы просто не использовать RoundedRectangle() и фон того же цвета, что и ваш фон для текстового поля на
Text()
?