相关疑难解决方法(0)

拦截UIScrollView上的平移手势会中断滚动

我有一个垂直滚动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

40
推荐指数
3
解决办法
4万
查看次数

SwiftUI:如何处理轻按和长按按钮?

我在 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)

谢谢!

杰拉德

button long-press swiftui

25
推荐指数
7
解决办法
2万
查看次数

带有手势行的 SwiftUI ScrollView 无法识别滚动

我在 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)

scrollview gesture drag ios swiftui

7
推荐指数
0
解决办法
3731
查看次数

SwiftUI 拖动以关闭 ScrollView

我想在 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)

uiscrollview gesture ios swiftui

6
推荐指数
0
解决办法
1263
查看次数

如何使用 SwiftUI 拖动工作滑块

我想拖动一个滑块,当然也让它滑动。我可以做一个或另一个,但我不能两者都做。我怎样才能拖动并有一个工作滑块?

我也试图找到一种方法来删除一个手势,但我找不到一种方法来做到这一点。还尝试了 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)

swift swiftui

2
推荐指数
1
解决办法
1749
查看次数

带有点击和拖动手势的 SwiftUI ScrollView

我正在尝试使用可以点击和拖动的元素来实现 ScrollView。它应该按以下方式工作:

  1. ScrollView 应该可以正常工作,因此向上/向下滑动不应干扰手势。
  2. 点击一个条目应该运行一些代码。如果有一个“敲击指示器”,那就太好了,这样用户就知道敲击已被注册(使这变得困难的是,敲击指示器应该在触摸触发,而不是在触摸触发,并且应该处于活动状态直到手指松开)。
  3. 长按条目应激活拖动手势,以便可以四处移动项目。

下面的代码涵盖了所有这些要求(抽头指示器除外)。但是,我不确定它为什么起作用,具体来说,为什么我需要使用 .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)

ios swift swiftui

1
推荐指数
1
解决办法
2219
查看次数