对拖动视图进行反应



我有一个视图,每当长按或拖动它时,我都想更改它。它可以从视图外部开始,也可以从视图内部开始。

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,但不知道如何让它按我想要的方式运行。

我在操场上为您举了一个例子,展示如何使用LongPressGestureRecognizer

将手势识别器添加到要长按的视图中,target是处理手势识别的父控制器(在您的情况下为ContentView(,action是长按时发生的情况。

在我的实现中,长按视图bodyView会将其颜色从透明更改为红色。这发生在showBody属性的didSet内部,该属性调用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)
}
}

最新更新