广告位联系
返回顶部
分享到

用SwiftUI实现3D Scroll滚动效果

Swift 来源:互联网搜集 作者:秩名 发布时间:2020-04-27 21:15:01 人浏览
摘要

我们预览下今天要实现的 3D scroll 效果。学完本教程后,你就可以在你的 App 中把这种 3D 效果加入任何自定义的 SwiftUI 视图。下面我们来开始本教程的学习。 入门 首先,创建一个新的 SwiftUI 视图。为了举例说明,在这个新视图中,我会展示一个有各种颜色

我们预览下今天要实现的 3D scroll 效果。学完本教程后,你就可以在你的 App 中把这种 3D 效果加入任何自定义的 SwiftUI 视图。下面我们来开始本教程的学习。

入门

首先,创建一个新的 SwiftUI 视图。为了举例说明,在这个新视图中,我会展示一个有各种颜色的矩形列表,并把新视图命名为 ColorList 。

 
import SwiftUI

struct ColorList: View {
 var body: some View {
  Text("Hello, World!")
 }
}

struct ColorList_Previews: PreviewProvider {
 static var previews: some View {
  ColorList()
 }
}
 
 

颜色数据

在视图的结构体里,添加一个用于记录颜色的变量。

 
var colors: [Color]
 

实现这个列表

在 body 变量的内部,删除掉占位 Text 。在 ScrollView 嵌套中添加一个 HStack ,如下:

 
var body: some View {
 ScrollView(.horizontal, showsIndicators: false) {
  HStack(alignment: .center, spacing: 50) {

  }
 }
}
 
 

展示矩形

我们使用 ForEach 在 HStack 内部根据 colors 中的数据分别创建不同颜色的矩形。此外,我修改了矩形的 frame,让它看起来与传统 UI 布局更像一些。

 
var body: some View {
 ScrollView(.horizontal, showsIndicators: false) {
  HStack(alignment: .center, spacing: 20) {
   ForEach(colors, id: .self) { color in
    Rectangle()
     .foregroundColor(color)
     .frame(width: 200, height: 300, alignment: .center)
   }
  }
 }
}
 
 

在 Preview 结构体中传入如下的颜色参数:

 
struct ColorList_Previews: PreviewProvider {
 static var previews: some View {
  ColorList(colors: [.blue, .green, .orange, .red, .gray, .pink, .yellow])
 }
}
 
 

你可以看到下图中的效果:

增加 3D 效果

首先,把 Rectangle 嵌套在 GeometryReader 中。这样的话,当 Rectangle 在屏幕上移动的时候,我们就可以获得其 frame 的引用。

 
var body: some View {
 ScrollView(.horizontal, showsIndicators: false) {
  HStack(alignment: .center, spacing: 230) {
   ForEach(colors, id: .self) { color in
    GeometryReader { geometry in
     Rectangle()
      .foregroundColor(color)
      .frame(width: 200, height: 300, alignment: .center)
    }
   }
  }
 }
}
 
 

根据 GeometryReader 的用法要求,我们需要修改上面定义的 HStack 的 spacing 属性。

在 Rectangle 中加入下面这行代码。

	
.rotation3DEffect(Angle(degrees: (Double(geometry.frame(in: .global).minX) - 210) / -20), axis: (x: 0, y: 1.0, z: 0))
 

当 Rectangle 在屏幕上移动时,这个方法的 Angle 参数会发生改变。请重点看 .frame(in:) 这个函数,你可以获取 Rectangle 的 CGRect 属性 minX 变量来计算角度。

axis 参数是一个元组类型,它定义了在使用你传入的角度参数时,哪一个坐标轴要发生改变。在本例中,是 Y 轴。

rotation3DEffect() 方法的文档可以在苹果官方网站的 这里 找到。

下一步,把这个案例跑起来。当矩形在屏幕上移动时,你可以看到它们在旋转。

我还修改了矩形的 cornerRadius 属性,并加上了投影效果,让它更美观。

最终效果

 
struct ColorList: View {

 var colors:[Color]

 var body: some View {
  ScrollView(.horizontal, showsIndicators: false) {
   HStack(alignment: .center, spacing: 230) {
    ForEach(colors, id: .self) { color in
     GeometryReader { geometry in
      Rectangle()
       .foregroundColor(color)
       .frame(width: 200, height: 300, alignment: .center)
       .cornerRadius(16)
       .shadow(color: Color.black.opacity(0.2), radius: 20, x: 0, y: 0)
       .rotation3DEffect(Angle(degrees: (Double(geometry.frame(in: .global).minX) - 210) / -20), axis: (x: 0, y: 1.0, z: 0))
     }
    }
   }.padding(.horizontal, 210)
  }
 }
}


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://juejin.im/post/5e9feb21e51d45470b4ff99b
相关文章
  • Swift中转义闭包介绍

    Swift中转义闭包介绍
    前言 Swift 是一种非常强大的编程语言,是为 Apple 生态系统开发应用程序的首选;iOS、macOS、watchOS 和 tvOS。作为使用 Swift 编写代码的开发人
  • Swift代码自定义UIView实现的方法
    Swift自定义View和OC自定义View的原理都是一样的,重写init()方法或initWithFrame()方法 下面简单说说如何自定义swift UIView 主要是重写init(frame:
  • 详解SwiftUI使用Paths和AnimatableData实现酷炫的颜色切
    本文中我们将学习如何使用 SwiftUI 中的 Paths 和 AnimatableData 来制作颜色切换动画。 这些快速切换的动画是怎么实现的呢?让我们来看下文吧
  • 用SwiftUI实现3D Scroll滚动效果
    我们预览下今天要实现的 3D scroll 效果。学完本教程后,你就可以在你的 App 中把这种 3D 效果加入任何自定义的 SwiftUI 视图。下面我们来开始
  • Swift4使用GCD实现计时器的方法
    开发过程中,我们可能会经常使用到计时器。苹果为我们提供了Timer。但是在平时使用过程中会发现使用Timer会有许多的不便 1:必须保证在
推荐阅读
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计