Ios SwiftUI:水平滚动视图动画&x2B;手势

Ios SwiftUI:水平滚动视图动画&x2B;手势,ios,swift,animation,swiftui,scrollview,Ios,Swift,Animation,Swiftui,Scrollview,我正在尝试重新创建“展开应用程序订阅”屏幕,屏幕上的图像水平旋转,这些图像自动从右向左移动,并启用向右或向左移动的手势,然后动画再次继续 我找到了一种使用3个修改器设置水平滚动视图动画的方法: 抵消 动画 外观 但是,当我拖动旋转木马时,我找不到方法将x坐标更改为我离开的位置 如果有人知道如何解决这个问题,那就可以救命了 以下是我编写的SwiftUI代码: import SwiftUI import AVKit struct ContentView: View { @S

我正在尝试重新创建“展开应用程序订阅”屏幕,屏幕上的图像水平旋转,这些图像自动从右向左移动,并启用向右或向左移动的手势,然后动画再次继续

我找到了一种使用3个修改器设置水平滚动视图动画的方法:

  • 抵消
  • 动画
  • 外观
但是,当我拖动旋转木马时,我找不到方法将x坐标更改为我离开的位置

如果有人知道如何解决这个问题,那就可以救命了

以下是我编写的SwiftUI代码:

import SwiftUI
import AVKit

struct ContentView: View {
    
    @State var scrollText = false
    
    var body: some View {
        
        ZStack {
            
            VStack {
                Color(#colorLiteral(red: 0, green: 0, blue: 0, alpha: 1))
                .ignoresSafeArea(.all)
            }
            
            VStack {

                VideoPlayer(player: AVPlayer(url: Bundle.main.url(forResource: "wave-1", withExtension: "mp4")!)) {
                    VStack {
                        Image("pro-text")
                            .resizable()
                            .frame(width: 150, height: .infinity)
                            .scaledToFit()
                    }
                }
                .ignoresSafeArea(.all)
                .frame(width: .infinity, height: 300)
                
                ScrollView(.horizontal, showsIndicators: false) {
                    HStack(spacing: 5) {
                        
                        Image("benefit-1")
                            .resizable()
                            .frame(width: 120, height: 120)
                        
                        Image("benefit-2")
                            .resizable()
                            .frame(width: 120, height: 120)
                        
                        Image("benefit-3")
                            .resizable()
                            .frame(width: 120, height: 120)
                        
                        Image("benefit-4")
                            .resizable()
                            .frame(width: 120, height: 120)
                        
                        Image("benefit-5")
                            .resizable()
                            .frame(width: 120, height: 120)
                        
                    }
                    .offset(x: scrollText ? -500 : 20)
                    .animation(Animation.linear(duration: 30).repeatForever(autoreverses: false))
                    .onAppear() {
                        self.scrollText.toggle()
                    }
                }
                
                Spacer()
            }
            
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

在这里分享我另一篇文章的答案

因为duration似乎还不能与动画一起使用,所以我必须稍微修改一下才能获得我想要的动画效果

以下是我所做的:

  • 我在ScrollView中添加了一个ScrollViewReader
  • 我使用ForEach并在ScrollView中将ID添加到我的项目中
  • 使用.offset和.animation修改器为 ScrollView本身(而不是其中的项目)
  • Used.scrollTo in.onAppear在启动ScrollView时移动 到离起始位置更远的项目,以允许用户同时 即使使用滚动视图,也可以前后滚动项目 自身从右向左设置动画
  • 我的代码是这样的:

    import SwiftUI
    import AVKit
    
    struct ProView: View {
        
        @State private var scrollText = false
        
        var body: some View {
            
            ZStack {
                
    //            VStack {
    //                Color(#colorLiteral(red: 0, green: 0, blue: 0, alpha: 1))
    //                    .ignoresSafeArea(.all)
    //            }
    //            
    //            VStack {
    //                
    //                VideoPlayer(player: AVPlayer(url: Bundle.main.url(forResource: "wave-1", withExtension: "mp4")!)) {
    //                    VStack {
    //                        Image("pro-text")
    //                            .resizable()
    //                            .frame(width: 200, height: .infinity)
    //                            .scaledToFit()
    //                    }
    //                }
    //                .ignoresSafeArea(.all)
    //                .frame(width: .infinity, height: 300)
                    
                    ScrollView(.horizontal, showsIndicators: false) {
                        
                        ScrollViewReader { value in
                            
                            HStack(spacing: 5) {
                                
                                ForEach(0 ..< 100) { i in
                                    
                                    HStack {
                                        Image("benefit-1")
                                            .resizable()
                                            .frame(width: 120, height: 120)
                                        
                                        Image("benefit-2")
                                            .resizable()
                                            .frame(width: 120, height: 120)
                                        
                                        Image("benefit-3")
                                            .resizable()
                                            .frame(width: 120, height: 120)
                                        
                                        Image("benefit-4")
                                            .resizable()
                                            .frame(width: 120, height: 120)
                                        
                                        Image("benefit-5")
                                            .resizable()
                                            .frame(width: 120, height: 120)
                                        
                                        Image("benefit-6")
                                            .resizable()
                                            .frame(width: 120, height: 120)
                                        
                                        Image("benefit-7")
                                            .resizable()
                                            .frame(width: 120, height: 120)
                                        
                                        Image("benefit-8")
                                            .resizable()
                                            .frame(width: 120, height: 120)
                                        
                                        Image("benefit-9")
                                            .resizable()
                                            .frame(width: 120, height: 120)
                                        
                                        Image("benefit-10")
                                            .resizable()
                                            .frame(width: 120, height: 120)
                                    }
                                    .id(i)
                                }
                                
                            }
                            .offset(x: scrollText ? -10000 : 20)
                            .animation(Animation.linear(duration: 300).repeatForever(autoreverses: false))
                            .onAppear() {
                                value.scrollTo(50, anchor: .trailing)
                                scrollText.toggle()
                            }
                        }
                    }
                    
                    Spacer()
                }
                
            }
        }
    }
    
    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            ProView()
        }
    }
    
    导入快捷界面
    进口AVKit
    结构唯冠:视图{
    @State private var scrollText=false
    var body:一些观点{
    ZStack{
    //VStack{
    //颜色(#colorLiteral(红色:0,绿色:0,蓝色:0,阿尔法:1))
    //.ignoresSafeArea(.all)
    //            }
    //            
    //VStack{
    //                
    //视频播放器(播放器:AVPlayer(url:Bundle.main.url)(用于资源:“wave-1”,带扩展名:“mp4”)!){
    //VStack{
    //图像(“专业文本”)
    //.可调整大小()
    //.frame(宽度:200,高度:无穷大)
    //.scaledofit()
    //                    }
    //                }
    //.ignoresSafeArea(.all)
    //.frame(宽度:。无穷大,高度:300)
    滚动视图(.horizontal,showsIndicators:false){
    ScrollViewReader{中的值
    HStack(间距:5){
    ForEach(0..<100){i in
    HStack{
    图像(“效益-1”)
    .可调整大小()
    .框架(宽度:120,高度:120)
    图像(“效益-2”)
    .可调整大小()
    .框架(宽度:120,高度:120)
    图像(“效益-3”)
    .可调整大小()
    .框架(宽度:120,高度:120)
    形象(“利益-4”)
    .可调整大小()
    .框架(宽度:120,高度:120)
    图像(“效益-5”)
    .可调整大小()
    .框架(宽度:120,高度:120)
    图像(“效益-6”)
    .可调整大小()
    .框架(宽度:120,高度:120)
    图像(“效益-7”)
    .可调整大小()
    .框架(宽度:120,高度:120)
    图像(“效益-8”)
    .可调整大小()
    .框架(宽度:120,高度:120)
    图像(“效益-9”)
    .可调整大小()
    .框架(宽度:120,高度:120)
    形象(“利益-10”)
    .可调整大小()
    .框架(宽度:120,高度:120)
    }
    .id(i)
    }
    }
    .偏移量(x:scrollText?-10000:20)
    .animation(animation.linear(持续时间:300)。repeatForever(自动反转:false))
    .onAppear(){
    值。滚动到(50,锚点:。尾部)
    scrollText.toggle()
    }
    }
    }
    垫片()
    }
    }
    }
    }
    结构内容视图\u预览:PreviewProvider{
    静态var预览:一些视图{
    唯冠()
    }
    }
    
    在这里分享我另一篇文章的答案

    因为duration似乎还不能与动画一起使用,所以我必须稍微修改一下才能获得我想要的动画效果

    以下是我所做的:

  • 我在ScrollView中添加了一个ScrollViewReader
  • 我使用ForEach并在ScrollView中将ID添加到我的项目中
  • 使用.offset和.animation修改器为 ScrollView本身(而不是其中的项目)
  • 已使用。滚动到内部。onAppear to mov