#swiftui #geometryreader
#swiftui #geometryreader
Вопрос:
Я пытаюсь использовать GeometryReader для создания представления карты (для использования в карточной игре). На этой карточке будет 3 фигуры. Я пытаюсь центрировать эти 3 фигуры с помощью GeometryReader (начиная с первой фигуры, прямоугольника), но это не работает. Что я делаю не так?
Вот как я ХОЧУ, чтобы это выглядело: вот как я хочу, чтобы это выглядело
Вот как это выглядит на самом деле: вот как это выглядит на самом деле
struct Card: View {
var body: some View {
ZStack {
RoundedRectangle(cornerRadius: 10.0).stroke(lineWidth: 3)
VStack {
GeometryReader { geometry in
Rectangle()
.size(
width: geometry.size.width * 0.75,
height: geometry.size.height * 0.75
)
.position(
x: geometry.size.width / 2,
y: geometry.size.height / 2
)
}
GeometryReader { geometry in
Circle()
.size(
width: geometry.size.width * 0.75,
height: geometry.size.height * 0.75
)
.position(
x: geometry.size.width / 2,
y: geometry.size.height / 2
)
}
GeometryReader { geometry in
Rectangle()
.size(
width: geometry.size.width * 0.75,
height: geometry.size.height * 0.75
)
.position(
x: geometry.size.width / 2,
y: geometry.size.height / 2
)
}
}
}
.foregroundColor(Color.orange)
}
}
Ответ №1:
Здесь возможен вариант компоновки. Протестировано с Xcode 12 / iOS 14
struct Card3: View {
var body: some View {
ZStack {
RoundedRectangle(cornerRadius: 10.0).stroke(lineWidth: 3)
GeometryReader { geometry in
VStack {
Color.clear.overlay(Rectangle()
.frame(
width: geometry.size.width * 0.75,
height: geometry.size.height / 3 * 0.75
))
Color.clear.overlay(Circle()
.frame(
width: geometry.size.width * 0.75,
height: geometry.size.height / 3 * 0.75
))
Color.clear.overlay(Rectangle()
.frame(
width: geometry.size.width * 0.75,
height: geometry.size.height / 3 * 0.75
))
}.frame(maxWidth: .infinity, maxHeight: .infinity)
}
}
.foregroundColor(Color.orange)
}
}
Комментарии:
1. Спасибо! Это работает. Мне все еще любопытно, почему мой код с использованием .position() не сработал. Согласно документации, .position() должен центрировать представление по xy. Итак, что я сделал не так. Не могли бы вы помочь мне решить эту проблему с помощью this .position()? Из документации: Сводка фиксирует центр представления в указанных координатах в пространстве координат его родителя. Параметры x Координата x, по которой нужно разместить центр этого вида. y — координата y, по которой нужно разместить центр этого вида. Возвращает вид, который фиксирует центр этого вида в точках x и y.
2. * Согласно документации, .position() должен РАСПОЛАГАТЬ центр представления по x y