#swiftui
#swiftui
Вопрос:
У меня уже есть переключатель, настроенный, как на изображении ниже, для включения / выключения изображения или прохождения / сбоя. Я пытаюсь добавить третье состояние, используя жест длительного нажатия на изображение, который сделает изображение серым со значком косой черты. Я добился этого в текстовом элементе, поскольку at is не имеет условия bool, но после долгих поисков не могу понять, как добиться этого с помощью изображения.
То, к чему я стремлюсь, это что-то вроде:
Image(systemName: isPressed ? "checkmark.circle.fill" : "x.circle.fill" || isLongPressed ? "checkmark.circle.fill" : "slash.circle.fill")
Хотя я знаю, что это неверно.
struct element: View {
var section: CleaningElements = courseSections[0]
@State private var isPressed = true
@State private var isLongPressed = true
var body: some View {
HStack(alignment: .top) {
Button(action: {
self.isPressed.toggle() }) {
Image(systemName: isPressed ? "checkmark.circle.fill" : "x.circle.fill")
.font(.system(size: 20))
.foregroundColor(isPressed ? .green : .red)
.frame(width: 36, height: 36)
.background(RoundedRectangle(cornerRadius: 12, style: .continuous).fill(section.color))
}
Text(section.title)
.font(.subheadline)
.bold()
.opacity(isLongPressed ? 1.0 : 0.3)
.foregroundColor(isLongPressed ? Color.primary : Color.secondary)
.onLongPressGesture {
self.isLongPressed.toggle()
}
Spacer()
}
.padding(3)
}
}
Ответ №1:
Вот демонстрация (с упрощенным вашим кодом) возможного решения — сохранить кнопку для выделения, но обрабатывать действия, но пользовательские жесты. Протестировано с Xcode 12.1 / iOS 14.1
struct element: View {
@State private var isPressed = false
@State private var isLongPressed = false
var body: some View {
Button(action: {}) {
Group {
if isLongPressed {
Image(systemName: "minus.circle")
.foregroundColor(.gray)
} else {
Image(systemName: isPressed ? "checkmark.circle.fill" : "x.circle.fill")
.foregroundColor(isPressed ? .green : .red)
}
}
.font(.system(size: 20))
.frame(width: 36, height: 36)
.background(RoundedRectangle(cornerRadius: 12, style: .continuous).fill(Color.yellow))
.gesture(TapGesture().onEnded {
isLongPressed = false
self.isPressed.toggle()
})
.gesture(LongPressGesture().onEnded { _ in
isLongPressed = true
})
}
}
}