繁体   English   中英

更改图标会导致 SwiftUI animation 出现故障?

Changing icon causes a hitch in SwiftUI animation?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有一个标签列表,当你 select 时,它们会出现一个芯片。

当您单击每个芯片上的“X”时,标签应滑出一个 animation,列表中的标签将被标记为未选中。

我遇到的问题是当我移除最后一个芯片时,标签左侧的圆形/圆形检查与 animation 不顺畅流动。

我相信这是因为图标在选择与未选择时会发生变化,因为如果我保持图标相同,这不是问题。 如果我移除芯片上的幻灯片 animation 也不是问题,但是我喜欢这个 animation 并想保留它。

我实际上在我的应用程序的几个地方遇到了这个问题,涉及动画+更改图标,并且想知道是否有解决方法?

动画问题的GIF

我在下面附上了一个可重现的例子。

import SwiftUI

struct ContentView: View {
    var body: some View {
        Icon_Animation()
    }
}

struct Icon_Animation: View {
    //All tags
    var testTags: [Tag] =
    [Tag("tag1"),
     Tag("tag2"),
     Tag("tag3")]
    
    //Only tags that have been selected
    @State var selectedTags = [Tag]()
    
    var body: some View {
        ScrollView{
            
            //Hstack of the tags that have been selected
            HStack{
                ForEach(selectedTags){ tag in
                        HStack(spacing: 0){
                            Button{
                                //Clicking on the X will remove from selectedTags array, and then make that tag's isSelected = false
                                withAnimation(.easeOut) {
                                    if let index = selectedTags.firstIndex(where: {$0.name == tag.name}){
                                        selectedTags.remove(at: index)
                                    }
                                }
                                
                                //PROBLEM: even though this statemnt isn't in the withAnimation block, it causes a weird behavior with the circle/check-circle icon
                                //If I remove the withAnimation statement from the above block, it works fine. However, I would like to keep the slide animation on the chips.
                                tag.isSelected = false
                                
                            }label:{
                                Image(systemName: "x.circle.fill")
                                    .font(.subheadline)
                                    .padding(.horizontal, 6)
                            }
                            
                            Image(systemName: "number")
                                .font(.footnote.weight(.bold))
                                .padding(.trailing, 2)
                            Text("\(tag.name)")
                                .font(.footnote)
                        }
                        .padding(.trailing, 20)
                        .padding(.vertical, 6)
                        .background(Color.blue.opacity(0.6), in: RoundedRectangle(cornerRadius: 14, style: .continuous))
                        .transition(.slide)
                }
            }
            .frame(maxWidth: .infinity, alignment: .leading)
            .padding()
            
            //List of tags where you can select each tag to create a chip
            ForEach(testTags){ tag in
                TagView(tag: tag)
                    .onTapGesture {
                        tag.isSelected.toggle()
                        
                        if(tag.isSelected == true){
                            selectedTags.append(tag)
                        }
                    }
            }
            .padding()
        }
        .padding()
    }
}

class Tag: Identifiable, ObservableObject {
    var id = UUID()
    @Published var name: String
    @Published var isSelected = false
    
    init(_ name: String){
        self.name = name
    }

}

struct TagView: View {
    @ObservedObject var tag: Tag = Tag("test")
  
    var body: some View {
        ZStack{
            //Overlay for when tag is selected
            Rectangle()
                .fill(Color.purple.opacity(0.6))
                .edgesIgnoringSafeArea(.all)
                .cornerRadius(5)
                .opacity(tag.isSelected ? 1 : 0)
            
            HStack(spacing: 8){
                
                //PROBLEM!!: I want to use a different icon based on whether tag isSelected, but it's causing a hitch in the animation when switching
                if(tag.isSelected){
                    Image(systemName: "checkmark.circle.fill")
                        .font(.title2.weight(.light))
                }else{
                    Image(systemName: "circle")
                        .font(.title2.weight(.light))
                }
                
                Image(systemName: "number")
                    .font(.body.weight(.bold))
                
                Text(tag.name)
                    .font(.headline)
                    .fontWeight(.bold)
            }
            .frame(maxWidth: .infinity, alignment: .leading)
            
        }
    }
}
1 个回复

我认为这是一个常见问题,归结为父视图从 if 语句接收两个不同的子视图,并且由于它们是两个不同的视图,具有不同的 id,SwiftUI 不知道如何在它们之间设置动画。

诀窍是只使用一个内容可变的子视图。 您应该能够通过替换生成图像的TagView中的if...else...来实现这一点,并在初始化程序中使用三元组:

Image(systemName: tag.isSelected ? "checkmark.circle.fill" : "circle" )
               .font(.title2.weight(.light))
3 QTProperty动画,更改QpushButton图标

我正在尝试用动画更改qpushbutton图标。 目前,我有一个包含按钮的面板。 在船上,我有球。 我想将球从当前位置移动到另一个单元,但是我想展示道路。 因此,我创建了QSequentialAnimationGroup,并添加了所有动画。 但在实施之后,不再显示按钮。 错误在哪里。 ...

2018-03-17 16:19:47 0 46   c++/ qt
4 如何修复jQuery SlideToggle动画挂钩?

我正在尝试创建一个FAQ页面,并且我希望问题栏在单击后向下滑动。 尽管我已经达到了想要的效果,但是当它向后滑动时,动画却出现了一些明显的障碍,这很烦人,因为第二个块的标题向第一个块的标题靠拢。 我已经在stackoverflow的所有内容中进行了搜索,但是尽管检查了很多问题及其答案,但没 ...

5 更改数据源时的SwiftUI列表动画

我的 SwiftUI 应用程序中有一个列表,顶部的按钮用于查看要加载到列表中的上一个/下一个类别的项目。 当您按下按钮时,列表的源会发生变化,并且列表会以其默认动画(行折叠起来)进行更新。 简化的可重现版本的代码(请参见下面的屏幕截图): import SwiftUI struct Conten ...

2020-01-31 18:44:39 1 1312   swiftui
6 在 SwiftUI 中动态更改动画的持续时间

我正在尝试在动画时更改动画的持续时间。 我有两个属性 - isAnimating确定 animation 是否应该运行和duration 。 有一个正在动画的视图,按钮切换isAnimating和 Slider 绑定到持续时间 state。 当 animation 正在播放并且我使用 Slider ...

7 R tcltk,更改图标会导致死窗口

有人遇到过这个问题吗? 我创建了一个小的弹出式tklistbox并更改了默认图标。 但是,更改图标后,列表框有时会以半死模式弹出。 参见下图(左一为半死,右一为活跃)。 如果保留默认的TK图标,就没有此问题。 谢谢! DD ...

2013-03-22 18:28:53 0 84   r
8 在动画期间更改数据会导致不需要的幻灯片

我想淡入文本。 当我通过 onAppear 或 Button 更改数据时,过渡会淡出但会发生不需要的幻灯片/剪辑。 期望的结果应该是新文本应该在没有幻灯片的情况下显示。 我的解决方案是使用ZStack并控制两个单独的Text的不透明度。 有没有更好的办法? ...

2021-07-06 19:37:30 0 23   swiftui
9 SwiftUI 在 animation 期间更改列表导致不正确显示 state

在使用某些控件和撤消 + 重做按钮时,我正在尝试将动画添加到列表视图中。 我在按钮中添加了withAnimation闭包,但是当我双击一个按钮时,列表视图与支持的 state 不同步并且不会刷新。 我发现我经常一次撤消多个步骤,所以这是我希望用户经常体验的模式。 我对为什么会发生这种情况的理解是, ...

10 为什么我的过渡动画在关闭div时会遇到麻烦?

当您单击右下角的箭头时,我有一张卡片可以展开以显示更多内容。 我注意到如果我按箭头关闭额外的内容,它会在关闭之前出现轻微的故障。 看起来它首先取出填充,然后关闭整个div。 有没有办法让这个动画流畅而没有波动的动画? 这是JSFiddle 用于切换类的JavaScript。 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM