Почему такие различия между предварительным просмотром Xcode и прямым запуском приложения в SwiftUI? - PullRequest
0 голосов
/ 08 ноября 2019

Я делаю какое-то приложение, которое поддерживает слайдер с одним касанием ручки!

В любом случае, когда я делаю это приложение, я почти проверил результат моего кода для предварительного просмотра Xcode, который является самым мощнымособенность SwiftUI.

Но когда я пытаюсь запустить свое приложение напрямую (будь то симулятор или реальное устройство), приложение буквально отличается, и я не знаю, ПОЧЕМУ!

Вот мой почти весь исходный код (извините за неудобство, если вы чувствуете, но я думаю, что это шанс полностью запустить мой крошечный проект, и, возможно, это лучше, чем писать код частично и описывать много раз ...)

import SwiftUI

struct ContentView: View {

@State var centerContent = CGPoint()

@GestureState var dragAmount = CGPoint.zero

@State var currentPoint = CGPoint.zero
@State var atan2Current: CGFloat = 0.0

var body: some View {
    VStack {
        ZStack {
            UserTouchCircle(center: $centerContent, atan2: $atan2Current)
                .frame(width: UIScreen.main.bounds.width * 0.85, height: UIScreen.main.bounds.width * 0.85)

            Circle()
                .frame(width: UIScreen.main.bounds.width * 0.9, height: UIScreen.main.bounds.width * 0.9)
                .foregroundColor(Color.red.opacity(0.5))
                .gesture(DragGesture().updating(self.$dragAmount) { value, state, transaction in

                    state = value.location

                    self.currentPoint = CGPoint(x: self.dragAmount.x - self.centerContent.x, y: self.centerContent.y - self.dragAmount.y)
                    self.atan2Current = atan2(self.dragAmount.x - self.centerContent.x, self.centerContent.y - self.dragAmount.y)

                })
        }
    }
}
}

struct UserTouchCircle: View {

@Binding var center: CGPoint
@Binding var atan2: CGFloat

var body: some View {

    GeometryReader { geometry in
        Path { path in

            self.center = CGPoint(x: geometry.size.width / 2, y: geometry.size.height / 2)

            path.move(to: self.center)

            path.addArc(center: self.center, radius: UIScreen.main.bounds.width * 0.40, startAngle: .degrees(-90), endAngle: .degrees(self.atan2ToDegrees(tan: self.atan2)), clockwise: false)
        }
    }
}

func atan2ToDegrees(tan: CGFloat) -> Double {

    if tan > 0 {
        return (Double(tan) * (180 / Double.pi) - 90)
    } else {
        return (Double(tan) * (180 / Double.pi) + 270)
    }
}
}

Когда я запускаю свое приложение на устройстве, Xcode отображает ниже в строке self.currentPoint = CGPoint(x: self.dragAmount.x - self.centerContent.x, y: self.centerContent.y - self.dragAmount.y), self.atan2Current = atan2(self.dragAmount.x - self.centerContent.x, self.centerContent.y - self.dragAmount.y) и self.center = CGPoint(x: geometry.size.width / 2, y: geometry.size.height / 2).

Изменение состояния во время обновления представления, это приведет к неопределенному поведению.

Я знаю, почему это произошло (фраза Xcode), но разница между предварительным просмотром и реальным устройством.

Как я могу решить эту проблему? пожалуйста помогите.

спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...