Как обнаружить и принять меры при нажатии кнопки в SwiftUIIOS

Программируем под IOS
Ответить
Anonymous
 Как обнаружить и принять меры при нажатии кнопки в SwiftUI

Сообщение Anonymous »

Я хочу выполнить действие, когда начинается нажатие кнопки, а затем когда кнопка перестает быть нажатой. Искал простое решение, но попал в более сложные конфигурации. Один из довольно простых и близких вариантов — тот, который я получил от BlueSpud. Действие кнопки не используется, поэтому я попробовал:

struct MyView: View {
@State private var pressing = false

var body: some View {

Text("Button")
.background(self.pressing ? Color.red : Color.blue)
.gesture(DragGesture(minimumDistance: 0.0)
.onChanged { _ in
self.pressing = true
print("Pressing started and/or ongoing")
}
.onEnded { _ in
self.pressing = false
print("Pressing ended")
})
}
}


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

Я также попробовал пример Apple для создания жестов SwiftUI. Он обеспечивает очень последовательный контроль над нажатыми и ненажатыми состояниями, но я не знаю, куда вставлять свои действия:

struct PressedButton: View {

var startAction: ()->Void
var endAction: ()->Void

enum DragState {
case inactive
case pressing
case dragging(translation: CGSize)

var translation: CGSize {
switch self {
case .inactive, .pressing:
return .zero
case .dragging(let translation):
return translation
}
}

var isActive: Bool {
switch self {
case .inactive:
print("DragState inactive but I can't add my action here")
//self.endAction()
return false
case .pressing, .dragging:
return true
}
}

var isDragging: Bool {
switch self {
case .inactive, .pressing:
return false
case .dragging:
return true
}
}
}

@GestureState var dragState = DragState.inactive

var body: some View {
let longPressDrag = LongPressGesture(minimumDuration: 0.1)
.sequenced(before: DragGesture())
.updating($dragState) { value, state, transaction in
switch value {

// Long press begins.
case .first(true):
print("Long press begins. I can add my action here")
self.startAction()
state = .pressing

// Long press confirmed, dragging may begin.
case .second(true, let drag):
//print("Long press dragging")
state = .dragging(translation: drag?.translation ?? .zero)

// Dragging ended or the long press cancelled.
default:
print("Long press inactive but it doesn't get called")
state = .inactive
}
}
.onEnded { _ in
print("Long press ended but it doesn't get called")
}

return Text("Button")
.background(dragState.isActive ? Color.purple : Color.orange)
.gesture(longPressDrag)
}
}


Подробнее здесь: https://stackoverflow.com/questions/593 ... in-swiftui
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»