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 的效果了.