Реагировать на перетаскивание на просмотр - PullRequest
0 голосов
/ 29 марта 2020

У меня есть вид, который я хочу изменить всякий раз, когда по нему происходит длительное нажатие или перетаскивание. Он может начинаться как вне поля зрения, так и внутри.

struct ContentView: View {
    @State var active: Bool = false

    var body: some View {
        Rectangle()
        .fill(self.active ? Color.red : Color.secondary)
    }
}

Примером такого поведения является клавиатура iPhone: при длительном нажатии на клавишу она всплывает (active = true). Когда вы выходите из него, он выскакивает (active = false), но затем активируется следующая клавиша.

Я пытался использовать LongPressGesture, но не могу понять, как заставить его вести себя так, как я хочу.

1 Ответ

0 голосов
/ 29 марта 2020

Я сделал для вас пример на игровых площадках, чтобы показать, как использовать LongPressGestureRecognizer.

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

В моей реализации долгое нажатие на представление bodyView меняет цвет с прозрачного на красный. Это происходит внутри didSet свойства showBody, которое вызывает showBodyToggled(). Я проверяю state жеста, потому что распознаватель жестов будет отправлять сообщения для каждого состояния (я выполняю действие, только если состояние .began).

Дайте мне знать, если вы есть вопросы:

//: A UIKit based Playground for presenting user interface

import UIKit
import PlaygroundSupport

class MyViewController : UIViewController {

    var bodyView: UIView!

    var showBody = false {
        didSet {
            showBodyToggled()
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        configureSubviews()
        configureLongPressRecognizer()
    }

    func configureSubviews() {
        bodyView = UIView()
        bodyView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(bodyView)

        NSLayoutConstraint.activate([
            bodyView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
            bodyView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            bodyView.heightAnchor.constraint(equalToConstant: 200),
            bodyView.widthAnchor.constraint(equalToConstant: 300)
        ])
    }

    func configureLongPressRecognizer() {
        bodyView.addGestureRecognizer(
            UILongPressGestureRecognizer(
                target: self,
                action: #selector(longPressed(_:))
            )
        )
    }

    @objc func longPressed(_ sender: UILongPressGestureRecognizer) {
        // the way I'm doing it: only acts when the long press first happens.
        // delete this state check if you'd prefer the default long press implementation
        switch sender.state {
        case .began:
            showBody = !showBody
        default:
            break
        }
    }

    func showBodyToggled() {
        UIView.animate(withDuration: 0.4) { [weak self] in
            guard let self = self else { return }
            self.bodyView.backgroundColor = self.showBody ? .red : .clear
        }

    }
}
// Present the view controller in the Live View window
PlaygroundPage.current.liveView = MyViewController()

РЕДАКТИРОВАТЬ:

Вот пример в SwiftUI, где долгое нажатие 0,5 секунды переключает цвет круга между красным и черным

struct ContentView: View {
    @State var active = false

    var longPress: some Gesture {
        LongPressGesture()
            .onEnded { _ in
                withAnimation(.easeIn(duration: 0.4)) {
                    self.active = !self.active
                }
        }
    }

    var body: some View {
        Circle()
            .fill(self.active ? Color.red : Color.black)
            .frame(width: 100, height: 100, alignment: .center)
            .gesture(longPress)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...