XYZ*_*XYZ 5 core-data ios ios-animations swiftui
因为List
、ForEach
和CoreData
是我认为的三个主要罪魁祸首......好吧,如果不只是.transition()
它本身的话。
基本上,我想要一个存储在核心数据中的任务列表,并且在点击任务时,它就会随着.transition(.scale)
. 我尝试过的几种潜在解决方案在画布和模拟器中都失败了,其中两个是堆栈溢出:
其余的尝试只是将 插入.transition(.scale)
到所有可能的位置,并且有/没有.animation(...)
附加。
这是我的错误视图的基本结构:
struct DeadlineListView: View {
@FetchRequest(entity: Deadline.entity(),
sortDescriptors: [NSSortDescriptor(keyPath: \Deadline.dueTime, ascending: true)],
predicate: NSPredicate(format: "isCompleted == false"),
animation: Animation.linear(duration: 2)
) var deadlineList: FetchedResults<Deadline>
// some other vars...
var body: some View {
VStack(spacing: 0.0) {
HStack {
// some other views...
}
// --- Where things matter most ---
List {
ForEach(deadlineList, id: \.uid) { deadline in
Button(action: { isShowingDeadlineDetails = true }) {
DeadlineView(deadline: deadline)
}.sheet(isPresented: $isShowingDeadlineDetails) {
DeadlineDetailView(deadline: deadline)
}
.listRowInsets(EdgeInsets())
}
}
// --- Where things matter most ---
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以从技术上讲,我有一个 s 列表Button
,看起来像DeadlineView(...)
.
DeadlineView(...)
有一个按钮供用户点击以表示任务已完成:
Button(action: {
deadline.isCompleted = true
deadline.objectWillChange.send()
do {
try context.save()
} catch {
print("Unable to save deadline isCompleted in DeadlineView!")
}
}){
// some View...
}
Run Code Online (Sandbox Code Playgroud)
此按钮将使NSPredicate
忽略此任务,从而使该任务从我的列表中消失。
是的,它确实可以制作动画。但是已完成的任务被它下面的任务挤压,没有任何可见的(至少对我来说).transition(.scale)
。
.transition(.scale)
回到第一个片段:
List {
ForEach(deadlineList, id: \.uid) { deadline in
Button(action: { isShowingDeadlineDetails = true }) {
DeadlineView(deadline: deadline)
// .transition(.scale) 1. HERE!
}
// 2. HERE!
.sheet(isPresented: $isShowingDeadlineDetails) {
DeadlineDetailView(deadline: deadline)
}
// 3. HERE!
.listRowInsets(EdgeInsets())
// 4. HERE!
}
// 5. HERE!
}
// 6. HERE!
Run Code Online (Sandbox Code Playgroud)
后面全部有/没有 .animation(.linear(duration: 2))
附加。
正如您可能已经注意到的,duration
动画 ( 2
) 的 相当长,因此它的运行速度足够慢,足以让我观察到它transition
确实没有运行。
但有趣的是,它并没有对此做出反应duration
,无论是它0.2
还是2
(好吧,至少对我来说,它似乎不会持续几2
秒钟)。
欢迎任何解决方案或解决方法。
由于过渡影响了这里的许多观点。您必须在内部进行与转换相关的更改
withAnimation(Animation.easeIn) { //here you can change the animation you want
//state changes should write here
}
Run Code Online (Sandbox Code Playgroud)
此链接可能有帮助 https://www.youtube.com/watch?v=3krC2c56ceQ
归档时间: |
|
查看次数: |
354 次 |
最近记录: |