小编Mof*_*waw的帖子

SwiftUI | 使用 onDrag 和 onDrop 对单个 LazyGrid 中的项目重新排序?

我想知道是否可以使用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)

collectionview ios swift swiftui xcode12

25
推荐指数
6
解决办法
8946
查看次数

获取 SwiftUI ScrollView 的当前滚动位置

使用 new ScrolLViewReader,似乎可以以编程方式设置滚动偏移。

但我想知道是否也可以获取当前的滚动位置?

似乎ScrollViewProxy唯一附带的scrollTo方法,允许我们设置偏移量。

谢谢!

ios swift swiftui xcode12

17
推荐指数
4
解决办法
4116
查看次数

SwiftUI | 使用 ScrollViewReader 为 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)

也许这还不可能?

谢谢!

ios swift swiftui xcode12

12
推荐指数
2
解决办法
2822
查看次数

SwiftUI - 检测 ScrollView 何时完成滚动?

我需要找出我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)

谢谢!

scrollview ios swift swiftui

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

Firebase Crashlytics | Swift 包管理器 (SPM) 运行脚本?

我想Crashlytics使用 Swift 包管理器添加到我的应用程序中。

现在,由于通常的安装方式Firebase是通过CocoaPods,关于如何正确设置的教程Crashlytics也针对CocoaPods.

换句话说 - 我们应该从教程中复制的运行脚本与 SPM 不兼容,如您所见:

${PODS_ROOT}/FirebaseCrashlytics/run
Run Code Online (Sandbox Code Playgroud)

那么如何找到Crashlytics使用SPM的文件位置来获取正确的运行脚本呢?

谢谢!

ios firebase crashlytics swift

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

SwiftUI - 如何获取 ScrollView 内容的大小(高度)

我想确定我的(垂直)内容的高度ScrollView

ScrollView {  
    //My Content
}
Run Code Online (Sandbox Code Playgroud)

这可能吗?我尝试了一些方法,但似乎没有任何作用。

不幸的是,简单地使用 theGeometryReader是行不通的,因为10无论 the 中的内容是什么,它都会返回一个值ScrollView

谢谢!

ios swift swiftui

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

SwiftUI | onDrag - 自定义 (dragItem) 预览图像外观

我一直在想,如果有任何的方式来定制preview imageview所有正使用时拖onDrag

如您所见,preview image默认情况下,视图的不透明度图像稍大。

根据我的发现,preview image在拖动过程的一开始就生成了a 。但我找不到改变它的方法。

我所说的定制是指有一些定制imagepreview 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 中进行拖放 …

ios swift swiftui

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

SwiftUI | 警告:绑定首选项 _ 尝试每帧更新多次。可能的原因?

自从我使用首选项 ( PreferenceKey,..)以来,我在控制台中收到此消息:

Bound preference _ tried to update multiple times per frame.

经过无数次的研究,我还没有找到任何方法可以让它静音。所以...既然还没有特别针对此警告的问题,您认为可能的原因是什么?

如果没有,可以忽略此警告还是我必须修复它?

非常感谢!

(我试图找到一个例子,但不知何故我没有得到任何简单的警告......)

ios swiftui

8
推荐指数
2
解决办法
2075
查看次数

CoreData+CloudKit | 开/关 iCloud 同步切换

我想让用户可以选择打开和关闭 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()会被调用。

任何帮助都会很棒,当然也欢迎其他方式!

谢谢。

core-data ios swift cloudkit

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

SwiftUI | 如果被 ScrollView 取消,则不会调用 DragGestures onEnded

我有以下问题。

我有一个View内部的ScrollView,我想拖。现在,一切正常,发生拖动和滚动。但是,一旦我尝试同时执行这两项操作,dragOffset似乎就会停留,而不是重置到其初始位置。

更何况,onEndedDragGesture永远不会发生。我怎样才能阻止这种情况发生并将绿色重置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 swift swiftui

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