我正在尝试在 SwiftUI 中拖动视图。
拖动工作完美,直到我将第二根手指放在屏幕上,之后拖动停止并且代码块 ( onChanged, onEnded) 都没有被调用。
但是,当我再次开始用一根手指拖动时,它再次开始工作。
有什么办法可以解决这个问题还是我遗漏了一些东西?
struct Pager: View {
func drag(geometry: GeometryProxy) -> some Gesture {
DragGesture()
.onChanged({ (value) in
//some code
})
.onEnded({ (value) in
//some code
})
}
var body: some View {
GeometryReader { (geometry) in
ZStack {
ForEach(self.items.indices.reversed(), id: \.self) { index in
Card(index: index, item: self.items[index])
.offset(x: 0, y: self.offset(index: index, geometry: geometry))
.animation(.linear)
}
}
.background(Color.black)
.gesture(self.drag(geometry: geometry))
}
}
}
Run Code Online (Sandbox Code Playgroud) 我正在构建一个自定义模态,当我拖动模态时,任何附加动画的子视图都会在我拖动时进行动画处理。我该如何阻止这种情况发生?
我考虑过传递@EnvironmentObject带有isDragging标志的 an ,但它的可扩展性不太好(并且不能很好地与自定义ButtonStyles 配合使用)
import SwiftUI
struct ContentView: View {
var body: some View {
Text("Hello, world!")
.padding()
.showModal(isShowing: .constant(true))
}
}
extension View {
func showModal(isShowing: Binding<Bool>) -> some View {
ViewOverlay(isShowing: isShowing, presenting: { self })
}
}
struct ViewOverlay<Presenting>: View where Presenting: View {
@Binding var isShowing: Bool
let presenting: () -> Presenting
@State var bottomState: CGFloat = 0
var body: some View {
ZStack(alignment: .center) {
presenting().blur(radius: isShowing ? …Run Code Online (Sandbox Code Playgroud) 处理 SwiftUI 的最佳方法是重新渲染使用DragGesture和.offset()修饰符移动的整个视图:MyView().offset(x: drag.translation.width)?
一旦MyView()是一个非常大的视图,包含大量复杂的子视图,拖动开始变得越来越不平滑,这显然是因为 SwiftUI 每次移动时都会重新渲染整个视图,这也会导致所有后代视图将被重绘等等。
.offset()移动大视图时使用修改器不可行吗?有没有其他方法?到目前为止,使用此处描述的 DragGewture 和偏移修改器(或在某些情况下为位置)似乎是常见的方法。
我想在任何 SwiftUI 视图上注册某个拖动手势,包括ScrollViews与任何其他手势同时注册(即不影响现有手势)。然而,当如下所示DragGesture在 a 上添加 a 时ScrollView,该手势似乎立即被 吞没了ScrollView。
ScrollView {
Rectangle()
.frame(width: 500, height: 500)
}
.simultaneousGesture(
DragGesture()
.onChanged { value in
print("changed:", value.translation)
}
.onEnded { value in
print("ended:", value.translation)
}
)
Run Code Online (Sandbox Code Playgroud)
当我拖动 时Rectangle,此代码将打印:
changed: (3.0, 16.666671752929688)
Run Code Online (Sandbox Code Playgroud)
例如。
所以onChanged只被调用一次,onEnded永远不会被调用。
有没有办法也可以DragGestures一起工作?ScrollViews
GestureState我也尝试使用和修饰符找到解决方法updating(_:),但它也不起作用。
在我正在开发的一个应用程序中,有一个部分主要是“前进”导航——点击按钮会显示下一张幻灯片。但是,还需要辅助“向后”导航。这是我使用的方法:
import SwiftUI
struct Sample: View {
@State private var dragOffset: CGFloat = -100
var body: some View {
VStack {
Text("Perhaps a title")
ScrollView {
VStack {
Text("Some scrollable content is going to be here")
// ...
Button(action: {
// Go to the next slide
}) { Text("Next") }
}
}
Text("and, maybe, something else")
}
.overlay(
Image(systemName: "arrow.left").offset(x: dragOffset / 2),
alignment: .leading
)
.gesture(
DragGesture()
.onChanged{
self.dragOffset = $0.translation.width
}
.onEnded {
self.dragOffset = -100 // Hide …Run Code Online (Sandbox Code Playgroud) 我刚刚开始使用 SwiftUI,我希望找到最好的方法来解决在拖动手势期间将该矩形保持在屏幕边界内的问题。现在它会离开边缘,直到到达正方形的中间(我想是因为我正在使用 CGPoint)。
我尝试做一些数学来限制矩形,它只在左侧成功,但这似乎是一种糟糕的方法,并且没有考虑到不同的屏幕尺寸。有人可以帮忙吗?
struct ContentView: View {
@State private var pogPosition = CGPoint()
var body: some View {
PogSound()
.position(pogPosition)
.gesture(
DragGesture()
.onChanged { value in
self.pogPosition = value.location
// Poor solve
if(self.pogPosition.x < 36) {
self.pogPosition.x = 36
}
}
.onEnded { value in
print(value.location)
}
)
}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建一个 SwiftUI Scrollview 来拖动其容器,如下所示:https://drive.google.com/file/d/1O92DgsVI1OjM1HEUXUwVywB8gcdShOP-/view ?usp=sharing
许多苹果应用程序都使用它(苹果地图、音乐、钱包等),但我还没有找到一种简单的方法来使用 SwiftUI 来做到这一点。您认为简单地实现这一点的最佳方法是什么?
我查看了这里的大多数库https://github.com/search?q=swiftui+drawer但它们都没有实现带有可以拖动视图的 ScrollView 的抽屉。
我还尝试将自定义 UIScrollView 实现为 UIViewRepresentable ,并尝试调整 scrollViewWillBeginDragging() 但无法使其工作。
我目前正在开发一个应用程序,向用户显示他的植物箱和一些测量值(如地面湿度、温度等)。每个植物箱里面都有一些植物,这些植物以详细视图显示。我希望用户能够将其中一株植物拖到角落以将其移除。目前我有这个实现:
@GestureState private var dragOffset = CGSize.zero
var body: some View {
//Plants Headline
VStack (spacing: 5) {
Text("Plants")
.font(.headline)
.fontWeight(.light)
//HStack for Plants Images
HStack (spacing: 10) {
//For each that loops through all of the plants inside the plant box
ForEach(plantBoxViewModel.plants) { plant in
//Image of the individual plant (obtained via http request to the backend)
Image(base64String: plant.picture)
.resizable()
.clipShape(Circle())
.overlay(Circle().stroke(Color.white, lineWidth: 2))
.offset(x: self.dragOffset.width, y: self.dragOffset.height)
.animation(.easeInOut)
.aspectRatio(contentMode: .fill)
.frame(width: 70, height: 70)
.gesture(
DragGesture()
.updating(self.$dragOffset, body: …Run Code Online (Sandbox Code Playgroud) 我想让一个视图“可滑动”,但是这个视图只覆盖整个屏幕的一小部分。正在做:
var body: some View {
ZStack {
Text("ABC")
.gesture(DragGesture().onChanged(onChanged))
}
}
func onChanged(value: DragGesture.Value) {
print(value.startLocation)
print("onChanged", value.location)
}
Run Code Online (Sandbox Code Playgroud)
为我提供用户滑动位置的相对值 - 但是,在不知道视图的确切位置的情况下,我无法知道用户的触摸在屏幕上的位置。
换句话说,当Text位于屏幕中央时,一直到右边缘给出 200px。但是假设文本向左移动,那么它几乎是 400。我尝试在 ZStack 上放置另一个手势来保存初始值,但是看来您不能在彼此之间拥有多个手势。
如何让侦听器转换值,使左边缘为 0,右边缘为以 px 为单位的 displayWidth,无论文本在哪里?
draggesture ×9
swiftui ×9
gesture ×3
ios ×3
swift ×3
drag ×1
scrollview ×1
swift5 ×1
swiftui-list ×1