成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

用 SwiftUI 實現 3D Scroll 效果

開發 后端
我們預覽下今天要實現的 3D scroll 效果。學完本教程后,你就可以在你的 App 中把這種 3D 效果加入任何自定義的 SwiftUI 視圖。下面我們來開始本教程的學習。

[[424241]]

我們預覽下今天要實現的 3D scroll 效果。學完本教程后,你就可以在你的 App 中把這種 3D 效果加入任何自定義的 SwiftUI 視圖。下面我們來開始本教程的學習。

入門

首先,創建一個新的 SwiftUI 視圖。為了舉例說明,在這個新視圖中,我會展示一個有各種顏色的矩形列表,并把新視圖命名為 ColorList。

  1. import SwiftUI 
  2.  
  3. struct ColorList: View { 
  4.     var body: some View { 
  5.         Text("Hello, World!"
  6.     } 
  7.  
  8. struct ColorList_Previews: PreviewProvider { 
  9.     static var previews: some View { 
  10.         ColorList() 
  11.     } 

顏色數據

在視圖的結構體里,添加一個用于記錄顏色的變量。

  1. var colors: [Colors] 

實現這個列表

在 body 變量的內部,刪除掉占位 Text。在 ScrollView 嵌套中添加一個 HStack,如下:

  1. var body: some View { 
  2.     ScrollView(.horizontal, showsIndicators: false) { 
  3.         HStack(alignment: .center, spacing: 50) { 
  4.  
  5.         } 
  6.     } 

展示矩形

我們使用 ForEach 在 HStack 內部根據 colors 中的數據分別創建不同顏色的矩形。此外,我修改了矩形的 frame,讓它看起來與傳統 UI 布局更像一些。

  1. var body: some View { 
  2.     ScrollView(.horizontal, showsIndicators: false) { 
  3.         HStack(alignment: .center, spacing: 20) { 
  4.             ForEach(colors, id: \.self) { color in 
  5.                 Rectangle() 
  6.                     .foregroundColor(color) 
  7.                     .frame(width: 200, height: 300, alignment: .center) 
  8.             } 
  9.         } 
  10.     } 

在 Preview 結構體中傳入如下的顏色參數:

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

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

增加 3D 效果

首先,把 Rectangle 嵌套在 GeometryReader 中。這樣的話,當 Rectangle 在屏幕上移動的時候,我們就可以獲得其 frame 的引用。

  1. var body: some View { 
  2.     ScrollView(.horizontal, showsIndicators: false) { 
  3.         HStack(alignment: .center, spacing: 230) { 
  4.             ForEach(colors, id: \.self) { color in 
  5.                 GeometryReader { geometry in 
  6.                     Rectangle() 
  7.                         .foregroundColor(color) 
  8.                         .frame(width: 200, height: 300, alignment: .center) 
  9.                 } 
  10.             } 
  11.         } 
  12.     } 

根據 GeometryReader 的用法要求,我們需要修改上面定義的 HStack 的 spacing 屬性。

在 Rectangle 中加入下面這行代碼。

  1. .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 屬性,并加上了投影效果,讓它更美觀。

Pretty cool right!

最終效果

  1. struct ColorList: View { 
  2.      
  3.     var colors:[Color] 
  4.      
  5.     var body: some View { 
  6.         ScrollView(.horizontal, showsIndicators: false) { 
  7.             HStack(alignment: .center, spacing: 230) { 
  8.                 ForEach(colors, id: \.self) { color in 
  9.                     GeometryReader { geometry in 
  10.                         Rectangle() 
  11.                             .foregroundColor(color) 
  12.                             .frame(width: 200, height: 300, alignment: .center) 
  13.                             .cornerRadius(16) 
  14.                             .shadow(color: Color.black.opacity(0.2), radius: 20, x: 0, y: 0) 
  15.                             .rotation3DEffect(Angle(degrees: (Double(geometry.frame(in: .global).minX) - 210) / -20), axis: (x: 0, y: 1.0, z: 0)) 
  16.                     } 
  17.                 } 
  18.             }.padding(.horizontal, 210) 
  19.         } 
  20.     } 

 

責任編輯:武曉燕 來源: Swift社區
相關推薦

2009-05-13 08:13:37

SUSELinux 10.3Nvidia

2023-05-26 07:08:05

CSS模糊實現文字

2025-05-29 06:48:51

前端偽3D

2010-06-09 16:21:10

OpenSUSE界面

2021-08-30 06:20:39

CSS 技巧3D 效果

2012-07-18 20:59:40

jQuery

2011-09-07 10:00:53

Ubuntu3D

2010-01-04 15:17:52

Ubuntu啟動

2021-11-08 06:02:17

CSS 技巧代碼重構

2009-04-03 08:33:59

Symbian諾基亞Photo Brows

2010-06-09 10:13:40

OpenSUSE 3D

2012-06-16 16:57:52

WebGL

2012-02-27 10:00:50

HTML 5

2013-07-23 07:03:51

Android開發學習Gallery實現3DAndroid源碼下載

2013-01-30 16:15:40

adobeHTML5css3

2011-05-26 10:55:39

2022-09-19 19:16:42

輪播圖has

2023-09-01 09:30:22

Three.js3D 圖形庫

2011-08-15 14:16:12

2010-01-06 10:16:06

Ubuntu 3D
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲欧美视频 | 精品乱码一区二区三四区视频 | 在线看片国产精品 | 97在线观看 | 天天色av | 国产传媒在线观看 | 欧美亚洲国产一区二区三区 | 国产精品一区二区不卡 | 国产一区二区在线免费观看 | 成人亚洲一区 | 在线日韩欧美 | 99精品网| 国产精品久久国产精品99 gif | 国产一区精品在线 | 精品视频一区二区 | 女人天堂av | 怡红院成人在线视频 | 欧美日韩国产一区 | 亚洲人精品午夜 | 91国产在线播放 | 99精品国产一区二区三区 | 欧美久久影院 | 国产片侵犯亲女视频播放 | 亚洲一区二区中文字幕在线观看 | 色偷偷噜噜噜亚洲男人 | 国产亚洲精品久久久久久牛牛 | 狠狠爱一区二区三区 | 黑人精品欧美一区二区蜜桃 | 亚洲九九| 久久久久国产精品一区二区 | 色视频成人在线观看免 | 免费一级黄色录像 | 二区不卡 | 国产在线一区二区三区 | 日韩视频一区 | 日韩精品视频在线观看一区二区三区 | 亚洲精品一区二三区不卡 | 亚洲视频不卡 | 午夜影院在线观看 | 在线国产精品一区 | 欧美精选一区二区 |