View, предназначенные для отображения различных UI-элементов
Отображает одну или несколько строк текста, доступного только для чтения.
Text("Hello World") Text("Hello").bold() + Text(" ") + Text("World!")
Text("Hello, world!") .font(.headline) .fontWeight(.bold) .italic() .underline() .lineLimit(2) .padding(20)
Компонует изображение и текст в единый графический элемент. Прекрасно подходит для пунктов меню.
// С использование SF Symbol Label("Add", image: "therock") // C использование собственного изображения Label("Edit", systemImage: "pencil.circle")
Label("Edit", systemImage: "pencil.circle") // выбор стиля (иконка, текст или все вместе) .labelStyle(.titleOnly) // размер изображения .imageScale(.large)Вы можете создать собственный стиль оформления на основе протокола
LabelStyle
struct ShadowLabelStyle: LabelStyle { func makeBody(configuration: Configuration) -> some View { Label(configuration) .shadow(color: .black, radius: 3, x: 5, y: 5) } } // label с тенью Label("Edit", systemImage: "pencil.circle") .labelStyle(ShadowLabelStyle())
Создается State-параметр, который будет хранить редактируемый текст.
@State private var text: String = "Редактируемый текст"
TextField
принимает Binding-параметр.
TextField("Placeholder", text: $text)
Доступен вариант с наблюдателями onEditingChanged
и onCommit
TextField("Placeholder", text: $text, onEditingChanged: { isEditingBegin in if isEditingBegin { print("Редактирование начало") } else { print("Редактирование окончено") } }, onCommit: { print("Нажата кнопка Return") })
С помощью аргумента formatter
в качестве связанного параметра может выступать параметр произвольного типа.
// Привязка текстового поля к параметру типа Date @State private var date = Date() // ... static var df: DateFormatter { let df = DateFormatter() df.dateStyle = .short return df } // ... TextField( "Date", value: $date, formatter: Self.df, onEditingChanged: { _ in }, onCommit: { })
Для применения универсального стиля оформления используется модификатор textFieldStyle(_:)
. При этом вам доступны несколько встроенных стилей:
DefaultTextFieldStyle()
PlainTextFieldStyle()
RoundedBorderTextFieldStyle()
SquareBorderTextFieldStyle()
// Применение стиля TextField("Placeholder", text: $text) .textFieldStyle(RoundedBorderTextFieldStyle())
Так же вы можете создать и применить собственный универсальный стиль на основе протокола TextFieldStyle
.
struct MyTextFieldStyle: TextFieldStyle { func _body(configuration: TextField) -> some View { configuration .padding(10) .background(Color.green) .cornerRadius(20) .shadow(color: .gray, radius: 10) } } TextField("Placeholder", text: $text) .textFieldStyle(MyTextFieldStyle())
Создается State-параметр, который будет хранить редактируемый текст.
@State private var text: String = "Редактируемый текст"
TextEditor
принимает Binding-параметр.
TextEditor(text: $text)
// Применение стиля TextField("Placeholder", text: $text) .foregroundColor(Color.gray) .font(.custom("HelveticaNeue", size: 13)) .lineSpacing(5)
View, предназначенные для отображения различных фигур
Circle() Circle() .frame(width: 200, height: 150)
// закрашенный круг Circle() // для изменения цвета можно использовать fill или foregroundColor .fill(Color.blue) // или .foregroundColor(.pink) // круг с обводкой Circle() .stroke() // или .stroke(Color.red, lineWidth: 20) // сектор круга Circle() .trim(from: 0.2, to 1.0)
Ellipse() Ellipse() .frame(width: 200, height: 150)
// закрашенный эллипс Ellipse() // для изменения цвета можно использовать fill или foregroundColor .fill(Color.blue) // или .foregroundColor(.pink) // эллипс с обводкой Ellipse() .stroke() // или .stroke(Color.red, lineWidth: 20) // сектор эллипса Ellipse() .trim(from: 0.2, to 1.0)
Capsule() Capsule(style: .circular) Capsule(style: .continuous) .frame(width: 200, height: 150)
// закрашенная капсула Capsule() // для изменения цвета можно использовать fill или foregroundColor .fill(Color.blue) // или .foregroundColor(.pink) // капсула с обводкой Capsule() .stroke() // или .stroke(Color.red, lineWidth: 20) // сектор капсулы Capsule() .trim(from: 0.2, to 1.0)
Rectangle() Rectangle() .frame(width: 200, height: 150)
// закрашенный прямоугольник Rectangle() // для изменения цвета можно использовать fill или foregroundColor .fill(Color.blue) // или .foregroundColor(.pink) // прямоугольник с обводкой Rectangle() .stroke() // или .stroke(Color.red, lineWidth: 20)
Прямоугольник с закругленными краями, заполняющий родительское View
RoundedRectangle(cornerRadius: 15) RoundedRectangle(cornerRadius: 15, style:) RoundedRectangle(cornerSize: CGSize(width: 10, height: 5), style: .circular) RoundedRectangle(cornerRadius: 15, style: .continuous) .frame(width: 200, height: 150)
// закрашенный прямоугольник RoundedRectangle(cornerRadius: 15) // для изменения цвета можно использовать fill или foregroundColor .fill(Color.blue) // или .foregroundColor(.pink) // прямоугольник с обводкой RoundedRectangle(cornerRadius: 15) .stroke() // или .stroke(Color.red, lineWidth: 20) RoundedRectangle(cornerRadius: 15) .trim(from: 0.2, to: 1.0)
Вьюшки, предназначенные для верстки и размещения других вью.
HStack {} HStack(spacing: 20) {} HStack(alignment: .bottom, spacing: 20) {} HStack { Rectangle() .fill(.red) .frame(width: 120, height: 120) Rectangle() .fill(.green) .frame(width: 110, height: 110) }
HStack(alignment: .center, spacing: 20) { Text("Hello, World!") .fontWeight(.bold) Text("This is description") } .padding() .font(.title) .background(.yellow) .cornerRadius(20)
Гибкое вью, занимающее все доступное пространство по основной оси стэка или по обеим осям, если не находится в стеке.
Spacer() // С минимальной длиной Spacer(minLength: 50) // В составе стека // Будет растягивать стек на всю доступную ширину HStack(spacing: 0) { Image(systemName: "xmark") Spacer() Image(systemName: "gear") } .padding()
Spacer() .background(.red) .frame(height: 20)