iOS 嵌套滚动界面实现思路: UIScrollView 上面放 UIPageViewController

要实现这种效果:

UIScrollView ( base scroll ) 上面放 UIPageViewController,

UIPageViewController 有很多 Page, 一个 page 是一个 UIViewController,

page 上面可以放 UIScrollView ( child scroll )

需要

base scroll 可以滑, 他的内容高度 = 子滚动视图的内容高度 + 子滚动视图之上内容的高度

base scroll 的 content size’s height = child scroll content size’s height + size’s height of view above child scroll

截屏2021-04-26 上午9.35.33.png

本文主要参考: bawn/Aquaman

实现的思路

类似的效果,上面的思路挺直观

不方便实现

试考虑下面场景:

上面放的 UIPageViewController,从一个 page 滑到另一个 page,

base scroll 的 content size’s height = 子滚动视图 1 的内容高度 + 固定高度 ( header + menu )

变成

base scroll 的 content size’s height = 子滚动视图 2 的内容高度 + 固定高度 ( header + menu )

可能有抖动

UI 就是障眼法

UIScrollView ( mainScrollView , 竖着滑 ) 上面放 UIScrollView ( contentScrollView 横着滚 ),

contentScrollView 上面放 contentStackView ( UIStackView ),

contentStackView 有很多 Page, 一个 page 就是,上面提到的 UIScrollView ( child scroll )

UIScrollView ( contentScrollView 横着滚 ), 其 isPagingEnabled = true

这样就模拟了,UIPageViewController 的滑动翻页效果

实现细节
lazy public private(set) var mainScrollView: AquaMainScrollView = {
        let scrollView = AquaMainScrollView()
        scrollView.delegate = self
        scrollView.am_isCanScroll = true
        return scrollView
    }()

手势兼容,滚动区域控制:

  • 如果不加这一段,child scroll 滚动无效, 滚的就是 mainScrollView ( 竖着滑 )

  • 加了这一段,child scroll 上面,其独立滚动,

child scroll 上面固定高度的共用视图, 滚的是 mainScrollView



public class AquaMainScrollView: UIScrollView, UIGestureRecognizerDelegate {
    
    public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {        
        // 子视图,不是 UIScrollView, 不用考虑
        guard let scrollView = gestureRecognizer.view as? UIScrollView else {
            return false
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值