我有一个垂直滚动UIScrollView.我还想在其上处理水平平移,同时允许默认的垂直滚动行为.我UIView在滚动视图上放置了一个透明图,并为其添加了一个平移手势识别器.这样我可以很好地获得平底锅,但滚动视图不会接收任何手势.
我已经实现了以下UIPanGestureRecognizerDelegate方法,希望仅将我的手势识别器限制为水平平底锅,但这没有帮助:
- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer {
// Only accept horizontal pans here.
// Leave the vertical pans for scrolling the content.
CGPoint translation = [gestureRecognizer translationInView:self.view];
BOOL isHorizontalPan = (fabsf(translation.x) > fabsf(translation.y));
return isHorizontalPan;
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
return (otherGestureRecognizer == _scrollView.panGestureRecognizer);
}
Run Code Online (Sandbox Code Playgroud) uiscrollview uigesturerecognizer ios ios5 uipangesturerecognizer
我在 SwiftUI 中有一个按钮,我希望能够对“点击按钮”(正常点击/点击)和“长按”执行不同的操作。
这在 SwiftUI 中可能吗?
这是我现在拥有的按钮的简单代码(仅处理“正常”点击/触摸案例)。
Button(action: {self.BLEinfo.startScan() }) {
Text("Scan")
} .disabled(self.BLEinfo.isScanning)
Run Code Online (Sandbox Code Playgroud)
我已经尝试添加一个“长按手势”,但它仍然只“执行”“正常/短”点击。这是我试过的代码:
Button(action: {self.BLEinfo.startScan() }) {
Text("Scan")
.fontWeight(.regular)
.font(.body)
.gesture(
LongPressGesture(minimumDuration: 2)
.onEnded { _ in
print("Pressed!")
}
)
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
杰拉德
我在 SwiftUI 中实现了一个垂直的 ScrollView,然后给每行水平拖动手势。以某种方式实现这一点会在拖动行内(以查看列表的其余部分)时停止 ScrollView 拖动,我尝试用 List 替换 ScrollView 但问题仍然存在。
这是代码:
struct MyView: View {
var MyArray: [String] = ["Foo", "bar","foobar"]
var body: some View {
ScrollView{
ForEach(MyArray, id:\.self)
{ _ in
Cell()
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
细胞:
struct Cell: View{
@State var draggedOffset = CGSize.zero
var body: some View {
HStack {
Text("Test")
}.animation(.linear)
.offset(x: self.draggedOffset.width)
.gesture(DragGesture()
.onChanged{ value in
self.draggedOffset.width = value.translation.width
}
.onEnded { value in
self.draggedOffset = CGSize.zero
})
}
}
Run Code Online (Sandbox Code Playgroud) 我想在 SwiftUI 中通过拖动来关闭滚动视图,如果您在内容顶部(偏移量 0)时继续拖动,它会关闭视图。
我正在努力在 SwiftUI 中实现这一点,但发现它相当困难。似乎我可以识别DragGesture或允许滚动,但不能同时识别两者。
我需要避免使用UIViewRepresentable并使用纯 SwiftUI 解决这个问题或尽可能接近。否则,它可能会使我的应用程序的其他部分的开发变得困难。
这是我遇到的问题的示例:
import SwiftUI
struct DragToDismissScrollView: View {
enum SeenState {
case collapsed
case fullscreen
}
@GestureState var dragYOffset: CGFloat = 0
@State var scrollYOffset: CGFloat = 0
@State var seenState: SeenState = .collapsed
var body: some View {
GeometryReader { proxy in
ZStack {
Button {
seenState = .fullscreen
} label: {
Text("Show ScrollView")
}
/*
* Works like a regular ScrollView but provides updates …Run Code Online (Sandbox Code Playgroud) 我想拖动一个滑块,当然也让它滑动。我可以做一个或另一个,但我不能两者都做。我怎样才能拖动并有一个工作滑块?
我也试图找到一种方法来删除一个手势,但我找不到一种方法来做到这一点。还尝试了 Apple“Composing SwiftUI Gestures”文档中的“Sequenced Gesture States”代码,并引入了一个标志来打开/关闭拖动,结果相同,拖动或滑动不是两者。
我还尝试将滑块放在容器(VStack)中并将拖动手势附加到它,但这也不起作用。
import SwiftUI
struct ContentView: View {
@State var pos = CGSize.zero
@State var acc = CGSize.zero
@State var value = 0.0
var body: some View {
let drag = DragGesture()
.onChanged { value in
self.pos = CGSize(width: value.translation.width + self.acc.width, height: value.translation.height + self.acc.height)
}
.onEnded { value in
self.pos = CGSize(width: value.translation.width + self.acc.width, height: value.translation.height + self.acc.height)
self.acc = self.pos
}
return Slider(value: $value, in: 0...100, step: 1)
.frame(width: 250, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用可以点击和拖动的元素来实现 ScrollView。它应该按以下方式工作:
下面的代码涵盖了所有这些要求(抽头指示器除外)。但是,我不确定它为什么起作用,具体来说,为什么我需要使用 .highPriorityGesture 并且例如不能对 Tap Gesture 和 DragGesture 进行排序.sequenced(before: ...)(这会阻止滚动)。
另外,我希望在触地事件时收到通知(不是触地,参见 2.)。我尝试使用 LongPressGesture() 而不是 TapGesture(),但这也会阻止 ScrollView 滚动,之后甚至不会触发 DragGesture。
有人知道这是如何实现的吗?或者这就是 SwiftUI 的极限?如果是这样,是否有可能移植 UIKit 的东西来实现这一点(我也已经尝试过,但没有成功,ScrollView 的内容也应该是动态的,因此移植整个 ScrollView 可能很困难)?
谢谢你的协助!
struct ContentView: View {
var body: some View {
ScrollView() {
ForEach(0..<5, id: \.self) { i in
ListElem()
.highPriorityGesture(TapGesture().onEnded({print("tapped!")}))
.frame(maxWidth: .infinity)
}
}
}
}
struct ListElem: View {
@GestureState var dragging = CGSize.zero
var body: some View {
Circle() …Run Code Online (Sandbox Code Playgroud) swiftui ×5
ios ×4
gesture ×2
swift ×2
uiscrollview ×2
button ×1
drag ×1
ios5 ×1
long-press ×1
scrollview ×1