Ваш вопрос совсем не тупой!
Вроде бы просто
- прочитать кадр первого просмотра (в глобальных координатах) и сохранить его в настройках
- прочитать кадр второго просмотра (в глобальных координатах) и сохранить его в настройках
- вычислить пересечение при изменении настроек
создать нашу структуру ключей предпочтений легко , это было уже объяснено на этом веб-сайте ранее (используйте поиск для более подробной информации: -))
struct Sizes: PreferenceKey {
typealias Value = [CGRect]
static var defaultValue: [CGRect] = []
static func reduce(value: inout [CGRect], nextValue: () -> [CGRect]) {
value.append(contentsOf: nextValue())
}
}
с использованием GeometryReader в фоновом режиме Модификатор вида уже объяснен
struct SizeReader: View {
var body: some View {
GeometryReader { proxy in
Color.clear
.preference(key: Sizes.self, value: [proxy.frame(in: .global)])
}
}
}
и теперь мы можете использовать его для сохранения прямоугольников в нашем ключе настройки размеров
RectView(color: .pink).background(SizeReader())
А как насчет нашего RectView? Чтобы продемонстрировать, как работает наше «простое решение», представьте, что кто-то создал его со случайным размером и случайным выравниванием
struct RectView: View {
let color: Color
let size = CGFloat(Int.random(in: 50 ... 200))
var body: some View {
color.frame(width: size, height: size)
.alignmentGuide(HorizontalAlignment.center) {
CGFloat.random(in: 0 ..< $0.width)
}
.alignmentGuide(VerticalAlignment.center) {
CGFloat.random(in: 0 ..< $0.width)
}
}
}
, пока все хорошо, мы готовы проверить наше «простое решение»
Позволяет завершить sh наш проект с
struct ContentView: View {
@State var id = UUID()
var body: some View {
VStack {
ZStack {
Color.black
RectView(color: .pink)
.background(SizeReader())
RectView(color: .yellow)
.background(SizeReader())
.blendMode(.difference)
}
.onPreferenceChange(Sizes.self) { (value) in
let intersection = value[0].intersection(value[1])
print(value[0])
print(value[1])
print(intersection)
print()
}
.onTapGesture {
self.id = UUID()
}
Text("paceholder").id(id)
}
}
}
Запустите его, и каждый раз, когда вы нажимаете на черную часть экрана, вы видите два прямоугольника произвольного размера и позиционирования и в окне отладки распечатывает значения наш интерес.
ПРЕДУПРЕЖДЕНИЕ проверьте распечатку, и вы увидите, что что-то не так!
Код является ошибочным примером, и я поместил его здесь, чтобы продемонстрировать, что ваш вопрос вовсе не глупый! Есть много мыслей, чтобы понять о макете SwiftUI и о том, как он работает за кулисами.
Надеюсь, кто-нибудь умный попытается объяснить, что не так, и подскажет нам, как сделать это функционал, все специалисты приветствуются! Пожалуйста, не меняйте RectView, думайте, что это какой-то встроенный компонент SwiftUI