Swift 5.2, iOS 13

Я хочу предсказать / вычислить центральную точку кадра после того, как он был масштабирован, чтобы я мог перемещать к нему фигуру при масштабировании. Если я попытаюсь масштабировать и центрировать вид в анимации / динамически, это не сработает, с конечным результатом, как я подозреваю, комбинацией центральных точек. Итак, на изображениях ниже синий прямоугольник начинается в верхнем правом углу, я масштабирую его и перемещаю в центр. Но, как вы можете видеть из зеленого прямоугольника, масштабирование испортило ту точку, до которой нужно добраться ...

enter image description here enter image description here

struct SwiftUIView2: View {
@State var relocate = Alignment.topTrailing
@State var zoom:CGFloat = 1.0
@State var tag:Bool = true
@State var tag2:Bool = false
@State var centerPoint: CGPoint = .zero
var body: some View {
    ZStack {
        ZStack(alignment: relocate) {
            Rectangle()
                .stroke(Color.blue, lineWidth: 2)
                .frame(width: 32, height: 32, alignment: .center)
                .onTapGesture {
                    withAnimation {
                    if self.tag {
                        self.zoom = 2.0
                        self.relocate = Alignment.center
                    } else {
                        self.relocate = Alignment.topTrailing
                        self.zoom = 1.0
                    }
                    }
                    DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
                        self.tag.toggle()
                    }
                    
            }
            .scaleEffect(zoom, anchor: .topLeading)
        }.frame(width: 256, height: 256, alignment: relocate)
            .border(Color.red)
        if !tag {
                ZStack {
                    Rectangle()
                        .stroke(Color.green, lineWidth: 2)
                        .frame(width: 32, height: 32, alignment: .center)
                        .onTapGesture {
                            self.tag.toggle()
                    }
                }.frame(width: 256, height: 256, alignment: .center)
                    .scaleEffect(zoom, anchor: .center)
        }

    }
}
}

GeoReader Я думал будет ответом, но и от него вылезает фигня. Провел больше недели, пробуя настраиваемые выравнивания, положение, все, что я мог придумать. На данный момент оценил решение с процентным соотношением экранов сайта, но, очевидно, оно не слишком хорошо работает с экранами разных размеров.

1
user3069232 25 Июн 2020 в 09:21

1 ответ

Лучший ответ

Вот исправление (протестировано с Xcode 11.4 / iOS 13.4)

            }
            .scaleEffect(zoom)      // << here !! (remove topLeading anchor)
        }.frame(width: 256, height: 256, alignment: relocate)
1
Asperi 25 Июн 2020 в 10:48