GithubHelp home page GithubHelp logo

h2ob / ffpage Goto Github PK

View Code? Open in Web Editor NEW
38.0 2.0 10.0 16.18 MB

类似微博个人主页、抖音个人主页、简书个人主页的控件,支持刷新放大,可悬浮组件

License: MIT License

Objective-C 92.08% Ruby 7.92%

ffpage's Introduction

FFPage

FFPage

支持

  • 刷新/放大效果
  • 差异滚动(左右两边滚动偏移量不互相影响)
  • 动画改变高度
  • 支持旋屏

用法

pod 'FFPage'

Step1
使用中可参考 PinExampleViewController

    // 初始化
    self.adapterViewController = [[FFAdapterViewController alloc]init];
    // 设置样式
    self.adapterViewController.style = FFPageStyle样式;
    // 设置头部视图高度
    self.adapterViewController.headHeight = 头部高度;
    // 设置菜单/分类控制器视图高度
    self.adapterViewController.menuHeight = 菜单高度;
    
    // 设置头部控制器
    self.adapterViewController.headViewController = 头部控制器;
    // 设置菜单/分类控制器
    self.adapterViewController.menuViewController = 菜单控制器;
    // 设置底部分页控制器
    self.adapterViewController.pageViewController = 分页控制器;
    
    
    [self addChildViewController:self.adapterViewController];
    [self.contentView addSubview:self.adapterViewController.view];
    [self.adapterViewController didMoveToParentViewController:self];
    
    
    // 如果你已经设置好了高度又想改变头部视图高度或者菜单高度
    self.adapterViewController.headHight = 您想修改的高度;
    self.adapterViewController.menuHeight = 您想修改的高度;
    [self.adapterViewController updateHeightWithAnimation:YES completion:^{
            
    }];

Step2
使用中可参考 PageSubViewController

//在下方可以左右切换的页面中需要实现 <FFPageProtocol>

//告诉他你的滚动视图是哪一个
- (UIScrollView *)scrollview{
    
    return self.tableView;
}

step3

更新当前控制器是哪一个
[self.adapterViewController updateCurrentController:self.pageViewController.currentController];

Tips

如果需要根据滚动偏移对导航栏透明度颜色等做改变 可以接收通知FFHomeScrollViewContentOffsetChangedNotice 值是一个CGPoint的字符串

原理

禁用UIScrollView的滚动,然后增加UIPanGestureRecognizer来传递滚动防止手势冲突 参考了https://www.jianshu.com/p/42858f95ab43 https://github.com/xuning0/ScrollViewNestDemo

Other

项目中内置了一个FFPageViewController用来替代UIPageViewController,采用RunLoop来预加载,采用LRU算法自动释放超过限制数量的控制器,每个控制器都有自己的生命周期,对内存和CPU进行了优化。

ffpage's People

Contributors

h2ob avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

ffpage's Issues

使用感受

首先很感谢作者开源这个框架,看了下源码实现,里面的控制器缓存实现思路和物理模拟滚动很好,对使用者也很友好,代理清晰。不过使用过程中,有几个地方不是很明,还望作者指点。
1.对于pageViewController,如果业务需要展现不同种类的控制器,可以在- (UIViewController *)pageViewController:(FFPageViewController *)pageViewConteoller controllerForPage:(NSInteger)page 根据 page 设置不同的控制器,那self.homePageViewController.tabViewController 这里该如何设置呢?
2.希望可以在 FFPageViewControllerDelegate 提供 scrollerView偏移量回调代理,例如对导航栏或是 headerView 做额外设置
3.希望可以回调 下方控制器 即将进入,已经进入,即将消失,已经消失等代理,若业务方需要对下方控制器进行埋点统计,将会很好处理
4.看框架里有FFRereshView,可以自定义很好。不过希望可以提供外界配置的代理(如可以继续使用 MJRefresh),就像灵活配置tabViewController那样。
以上几点,就是使用过程发现的问题,望作者采纳,谢谢~

切换选项卡 header停留顶部不滑动的情况

#pragma mark - 内外部滚动视图的偏移量处理

  • (void)transitionWithOffset:(CGFloat)offset{

    CGFloat outOffY = self.scrollview.contentOffset.y;//外部滚动视图的偏移量
    CGFloat subOffY = [self.controller scrollview].contentOffset.y; //子视图的偏移量
    CGFloat maxOffY = self.headHeight - self.ignoreTopSpeace + self.scrollview.contentInset.top;//headView悬浮的时候最大偏移量
    CGFloat maxSubOffY = [self.controller scrollview].maxOffsetY;

    //手指向上
    if(offset < 0){
    //修改处 开始
    //处理 切换选项卡 header停留顶部不滑动的情况
    if(outOffY < maxOffY){
    CGFloat final = outOffY - offset - maxOffY;
    if(final < 0){
    outOffY -= offset;
    [self setOutScrollViewOffY:outOffY];
    }else{
    outOffY = maxOffY;
    [self setOutScrollViewOffY:outOffY];
    [self transitionWithOffset:-final];
    }
    }
    //修改处 结束
    // *********优先判断子视图是否滚动到顶部
    //子视图未滚动到顶部
    if(subOffY > 0){

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.