Как присвоить значение переменной «Get-Only»? - PullRequest
1 голос
/ 16 февраля 2020

Я новичок в Swift и SwiftUI. В настоящее время, когда пользователь увеличивает масштаб изображения, изображение возвращается в обычное положение после завершения. Мне бы хотелось, чтобы, когда пользователь прекращает увеличивать изображение, оно остается увеличенным.

struct ContentView: View {
   @GestureState var magnifyBy = CGFloat(1.0)
   @State var zoomIn = CGFloat(1.0)

    var magnification: some Gesture {
           MagnificationGesture()
               .updating($magnifyBy) { currentState, gestureState, transaction in
                gestureState = currentState
           }.onEnded{value in
               magnifyBy = value
        }
    }

    var body: some View {
           Circle()
               .frame(width: 100 * magnifyBy,
                      height: 100 * magnifyBy,
                      alignment: .center)
       }
}

magnifyBy = значение

Бросает мне ошибка: Невозможно присвоить свойству: 'magnifyBy' является свойством только для получения

Что я могу сделать, чтобы это исправить?

1 Ответ

1 голос
/ 16 февраля 2020

GestureState активен, когда жест активен и должен использоваться только внутри этого периода времени, соответственно обновляя. После завершения жеста соответствующее состояние жеста сбрасывается до исходного значения. Таким образом, чтобы изменения были постоянными, нам нужно хранить их отдельно.

Здесь возможен подход (протестирован и работает с Xcode 11.2 / iOS 13.2)

struct ContentView: View {
    @GestureState var magnifyBy = CGFloat(1.0)
    @State var zoomIn = CGFloat(1.0)

    var magnification: some Gesture {
        MagnificationGesture()
            .updating($magnifyBy) { value, gestureState, transaction in
                gestureState = value // gestureState is magnifyBy
        }.onEnded{ value in
            self.zoomIn *= value // < preserve last changes
        }
    }

    var body: some View {
        Circle()
            .frame(width: 100 * magnifyBy * zoomIn, //after onEnded magnifyBy=1 again
                   height: 100 * magnifyBy * zoomIn,  
                   alignment: .center)
            .gesture(magnification)
    }
}

Пожалуйста, см. Подробности на GestureState в официальной статье Apple, Добавление интерактивности с помощью жестов . Тот редкий случай, когда документация полна и хороша.

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