SwiftUI -ReelsLayout App
效果图
类似于tiktok 播放页面, 滑动切换
AVKit UIViewControllerRepresentable
makeUIViewController updateUIViewController
OffsetKey: PreferenceKey
.preference .onPreferenceChange
playPause(:)
页面结构
HomeView
Scrollview
Overlay ( 其他控件 不跟着 scrollView 滚动 )
- 点赞双击的红心(带偏移动画)
 LazyVStack (记住是 LazyVStack)
ReelView
ReelView
ReelView …
CustomVideoPlayer
Overlay ( 界面具体元素 [ 点赞 评论 私信 更多 ] )
onTapGesture(count: 2 …)
- likedCounter数组 isLiked = true 触发点赞动画效果
 onAppear
- 新建 player [ player = queue ]
 - AVPlayerLooper ( 循环播放 )
 - 播放完成之后 player.seek(to: .zero) 重头开始
 onDisappear
- player = nil
 overlay ( scrollView 界面上其他元素 [ Reels标题, )
- 标题 Reels
 - Camera 图标📷
 
按照页面page 样式, 竖屏滑动

ReelVIew 代码
1  | //  | 
播放逻辑 算法
1  | /// Play / Pause Action  | 

回顾页面结构
HomeView
Scrollview
Overlay ( 其他控件 不跟着 scrollView 滚动 )
- 点赞双击的红心(带偏移动画)
 LazyVStack (记住是 LazyVStack)
ReelView
ReelView
ReelView …
CustomVideoPlayer
Overlay ( 界面具体元素 [ 点赞 评论 私信 更多 ] )
onTapGesture(count: 2 …)
- likedCounter数组 isLiked = true 触发点赞动画效果
 onAppear
- 新建 player [ player = queue ]
 - AVPlayerLooper ( 循环播放 )
 - 播放完成之后 player.seek(to: .zero) 重头开始
 onDisappear
- player = nil
 overlay ( scrollView 界面上其他元素 [ Reels标题, )
- 标题 Reels
 - Camera 图标📷
 
回顾 3 月 12 号
记不住的点
布局没什么问题
- 数据共享绑定有点迷糊 @Binding
 - 通过OffsetKey来拿到scrollView 滚动的 size 变化控制播放▶️暂停 ⏸
 - 点击屏幕双击计算 添加一个 item 给 likeCounter; 动画效果给 likeCounter 动画添加一个counter.isLiked = true 动画完成之后 移除这个 id 的 likeCounter
 - 然后再 Home 页面的 scrollView 上面通过 Zstack 添加 forEach 的红心, 并给定frame , .animation , .offset(x: …, y: …), .offset(y:… )
 
首页滚动模式
1  | lazyVStack {  | 
以上就能确定基本翻页 Reel 的效果了.
