我想知道是否可以使用View.onDrag
和手动View.onDrop
添加拖放重新排序LazyGrid
?
虽然我能够使用 使每个项目都可以拖动onDrag
,但我不知道如何实现放置部分。
这是我正在试验的代码:
import SwiftUI
//MARK: - Data
struct Data: Identifiable {
let id: Int
}
//MARK: - Model
class Model: ObservableObject {
@Published var data: [Data]
let columns = [
GridItem(.fixed(160)),
GridItem(.fixed(160))
]
init() {
data = Array<Data>(repeating: Data(id: 0), count: 100)
for i in 0..<data.count {
data[i] = Data(id: i)
}
}
}
//MARK: - Grid
struct ContentView: View {
@StateObject private var model = Model()
var body: some …
Run Code Online (Sandbox Code Playgroud) 使用 new ScrolLViewReader
,似乎可以以编程方式设置滚动偏移。
但我想知道是否也可以获取当前的滚动位置?
似乎ScrollViewProxy
唯一附带的scrollTo
方法,允许我们设置偏移量。
谢谢!
有没有办法ScrollView
通过使用更改默认滚动动画ScrollViewReader
?
我尝试了不同的东西,但动画仍然是默认的。
withAnimation(.easeInOut(duration: 60)) { // <-- Not working (changes nothing)
proxy.scrollTo(50, anchor: .center)
}
Run Code Online (Sandbox Code Playgroud)
正如你在这里看到的:(显然这比 1 分钟的动画快)
struct ContentView: View {
var body: some View {
ScrollView {
ScrollViewReader { proxy in
Button("Scroll to") {
withAnimation(.easeInOut(duration: 60)) {
proxy.scrollTo(50, anchor: .center)
}
}
ForEach(0..<100) { i in
Rectangle()
.frame(width: 200, height: 100)
.foregroundColor(.green)
.overlay(Text("\(i)").foregroundColor(.white).id(i))
}
.frame(maxWidth: .infinity)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
也许这还不可能?
谢谢!
我需要找出我ScrollView
停止移动的确切时刻。SwiftUI 可以实现吗?
这将是UIScrollView
.
想了很久还是不明白……
一个用于测试的示例项目:
struct ContentView: View {
var body: some View {
ScrollView {
VStack(spacing: 20) {
ForEach(0...100, id: \.self) { i in
Rectangle()
.frame(width: 200, height: 100)
.foregroundColor(.green)
.overlay(Text("\(i)"))
}
}
.frame(maxWidth: .infinity)
}
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
我想Crashlytics
使用 Swift 包管理器添加到我的应用程序中。
现在,由于通常的安装方式Firebase
是通过CocoaPods
,关于如何正确设置的教程Crashlytics
也针对CocoaPods
.
换句话说 - 我们应该从教程中复制的运行脚本与 SPM 不兼容,如您所见:
${PODS_ROOT}/FirebaseCrashlytics/run
Run Code Online (Sandbox Code Playgroud)
那么如何找到Crashlytics
使用SPM的文件位置来获取正确的运行脚本呢?
谢谢!
我想确定我的(垂直)内容的高度ScrollView
。
ScrollView {
//My Content
}
Run Code Online (Sandbox Code Playgroud)
这可能吗?我尝试了一些方法,但似乎没有任何作用。
不幸的是,简单地使用 theGeometryReader
是行不通的,因为10
无论 the 中的内容是什么,它都会返回一个值ScrollView
谢谢!
我一直在想,如果有任何的方式来定制preview image
的view
所有正使用时拖onDrag
?
如您所见,preview image
默认情况下,视图的不透明度图像稍大。
根据我的发现,preview image
在拖动过程的一开始就生成了a 。但我找不到改变它的方法。
我所说的定制是指有一些定制image
或preview image
定制view
。(都没有默认的不透明度)
有没有人有想法?
我曾尝试使用previewImageHandler并且一般来说,阅读了很多关于NSItemProvider
. 但对我来说,这似乎对 SwiftUI 来说是不可能的?
随着UIKit
一个可能只是定制UIDragItem
-类似的东西使用previewProvider
:这里
这是我的演示代码:
struct ContentView: View {
var body: some View {
DraggedView()
.onDrag({ NSItemProvider() })
}
private struct DraggedView: View {
var body: some View {
RoundedRectangle(cornerRadius: 20)
.frame(width: 120, height: 160)
.foregroundColor(.green)
}
}
}
Run Code Online (Sandbox Code Playgroud)
我将使用它在 a 中进行拖放 …
自从我使用首选项 ( PreferenceKey
,..)以来,我在控制台中收到此消息:
Bound preference _ tried to update multiple times per frame.
经过无数次的研究,我还没有找到任何方法可以让它静音。所以...既然还没有特别针对此警告的问题,您认为可能的原因是什么?
如果没有,可以忽略此警告还是我必须修复它?
非常感谢!
(我试图找到一个例子,但不知何故我没有得到任何简单的警告......)
我想让用户可以选择打开和关闭 iCloud 同步。
经过一段时间的研究,我发现实现这一目标的一种方法是将cloudKitContainerOptions
.
nil
因此,如果我不想同步数据库,我会将其设置为。
if(!UserDefaultsManager.shared.iCloudSyncOn) {
description.cloudKitContainerOptions = nil
}
Run Code Online (Sandbox Code Playgroud)
这一切都工作正常,但我还没有找到在运行时执行此操作的方法。
我尝试在用户切换时重新初始化我的容器,以便我的容器cloudKitContainerOptions
根据选择而有所不同。
但这只会在保存上下文时返回一个错误,说:Thread 1: "Illegal attempt to establish a relationship 'addEntries' between objects in different contexts ...
,我认为这是由于重新初始化造成的。
我想我必须将新创建的上下文传递到我的整个视图层次结构,任何缓存 moc 的东西?
这是我的 CoreDataStack 的简化片段:
func setupContainer() -> NSPersistentContainer {
let container = NSPersistentCloudKitContainer(name: "...")
guard let description = container.persistentStoreDescriptions.first else { ... }
...
if(!UserDefaultsManager.shared.iCloudSyncOn) {
description.cloudKitContainerOptions = nil
}
container.loadPersistentStores(completionHandler: { ... })
...
return container
}
Run Code Online (Sandbox Code Playgroud)
当用户切换时,setupContainer()
会被调用。
任何帮助都会很棒,当然也欢迎其他方式!
谢谢。
我有以下问题。
我有一个View
内部的ScrollView
,我想拖。现在,一切正常,发生拖动和滚动。但是,一旦我尝试同时执行这两项操作,dragOffset
似乎就会停留,而不是重置到其初始位置。
更何况,onEnded
的DragGesture
永远不会发生。我怎样才能阻止这种情况发生并将绿色重置Rectangle
到其初始位置?
拖动或滚动工作得很好。
但是每当我同时做这件事时,就会发生这种情况。
struct ContentView: View {
@State private var dragOffset: CGSize = .zero
var body: some View {
ScrollView {
Rectangle()
.frame(width: UIScreen.main.bounds.size.width, height: 300)
.foregroundColor(.green)
.offset(x: dragOffset.width)
}
.gesture(DragGesture()
.onChanged { value in
dragOffset = value.translation
}
.onEnded { value in
dragOffset = .zero
}
)
.animation(.default)
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
ios ×10
swift ×9
swiftui ×8
xcode12 ×3
cloudkit ×1
core-data ×1
crashlytics ×1
firebase ×1
scrollview ×1