Giter Site home page Giter Site logo

wwmz / wmzpagecontroller Goto Github PK

View Code? Open in Web Editor NEW
654.0 13.0 121.0 17.05 MB

分页控制器,替换UIPageController方案,具备完整的生命周期,多种指示器样式,多种标题样式,可悬浮,支持ios13暗黑模式(仿优酷,爱奇艺,今日头条,简书,京东等多种标题菜单) (Pagination controller with full life cycle, multiple indicator styles, multiple title styles)

License: MIT License

Objective-C 97.37% C 2.49% Ruby 0.07% Swift 0.08%
page pagecontroller segment menu

wmzpagecontroller's Introduction

Hi there 👋 I'm WMZ

广州开发

Anurag's github stats

wmzpagecontroller's People

Contributors

davidlii avatar wwmz 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  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  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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wmzpagecontroller's Issues

刷新的时候可以左右滚动

你的demo刷新的时候不会左右滚动,但是相同代码写入我自己的工程,刷新的时候可以左右滚动,请问有什么特别的设置吗?

细节还需完善

1、title的左侧间距无法调整
2、title栏目view,无法调整左右边距,只能设置宽度
3、右侧固定的按钮无法自定义,建议是右侧暴露出一个view,让使用者自定义view,且可设置size

正好这几个都是项目中需要的....

怎样与swift混编?

好轮子
但是怎样与swift混编?
.wTitleArrSet(data)一直报 Argument passed to call that takes no arguments错误

添加自定义view无法带到最顶层

1.WMZPageController的子控制器作为UITableBarController的子控制器
2.WMZPageController的view添加一个自定义view,并[self.view bringSubviewToFront:self.自定义view];
3.window的根控制器由其他控制器切换为上面的UITableBarController控制器的时候并不能展示出上面的自定义view
4.版本号1.3.7

感谢大佬

首先感谢作者提供的优秀的三方,希望能继续更新下去。这里我遇到这个问题:

我将param设置成
.wMenuAnimalSet(PageTitleMenuAiQY)///爱奇艺样式(依恋)

然后动态的添加[self addMenuTitleWithObject:[WMZPageTitleDataModel initWithIndex:0 controller:AddVC title:@"增加的标题"]]

发现指示器的位置滑动到了第0个,并没有在当前的索引中。

打开相册, 照片顶部被导航栏遮盖

UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
imagePicker.delegate = self;
imagePicker.allowsEditing = YES;

imagePicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
[self presentViewController:imagePicker animated:YES completion:nil];

建议设置按钮图片时判断是否时网络图

175行:CGSize size = btn.maxSize;
//设置图片
id image = [self getTitleData:self.param.wTitleArr[i] key:@"image"];
id selectImage = [self getTitleData:self.param.wTitleArr[i] key:@"selectImage"];
if (image) {
[btn sd_setImageWithURL:[NSURL URLWithString:image] forState:UIControlStateNormal];

显示导航栏+中间刷新

显示导航栏+中间刷新的控制器数组放再嵌套一个WMZPageController 会有滑动冲突
//控制器数组 .wViewControllerSet(^UIViewController *(NSInteger index) { UseVC *vc = [UseVC new]; vc.index = @0; return vc; })

crash when “newVC == nil”

这个方法取值为空未做兼容,导致闪退
- (UIViewController*)getVCWithIndex:(NSInteger)index{
    if (index < 0|| index >= self.param.wControllers.count) {
        return nil;
    }
    if ([[self findBelongViewControllerForView:self].cache objectForKey:@(index)]) {
        return [[self findBelongViewControllerForView:self].cache objectForKey:@(index)];
    }
    return self.param.wControllers[index];
}
   UIViewController *newVC = [self getVCWithIndex:index];
   [newVC beginAppearanceTransition:YES animated:YES];
   [self addChildVC:index VC:newVC];
- (void)addChildVC:(NSInteger)index VC:(UIViewController*)newVC{
    if (![[self findBelongViewControllerForView:self].childViewControllers containsObject:newVC]) {
        [[self findBelongViewControllerForView:self] addChildViewController:newVC];
        CGRect frame = CGRectMake(index * self.dataView.frame.size.width,0,self.dataView.frame.size.width,
                                  self.dataView.frame.size.height);
        newVC.view.frame = frame;
        [self.dataView addSubview:newVC.view];
        [newVC didMoveToParentViewController:[self findBelongViewControllerForView:self]];
        [[self findBelongViewControllerForView:self].cache setObject:newVC forKey:@(index)];
    }
}

请问如何在右侧add自定义的view

类似这种右侧有一个自定的view的需求。

直接在wCustomMenuViewSet(^(UIView *bgView){}回调里这样写:

XKCustomView * view = [XKCustomView new];
[bgView addSubView:view];

这样恐怕不行吧,会重复add

代码规范的问题

WMZPageConfig文件宏定义前缀问题,枚举值的定义,目前都缺少。
WMZPageController
  1. 生命周期方法,是否需要拆分.如:viewWillAppear逻辑编写是否过多。
  2. if-else方法是否存在太多。如:“UI”【大方法拆分】
WMZPagePropStatementAndPropSetFuncStatement是否可取,个人觉得会影响代码可读性。

美团商家详情两层联调

滑动右边的tableview,多滑动一些到,比如到标题4.置顶之后,滑动左边的tableview列表,将整个页面滑动到初始位置,此时滑动右侧的tableview,向下滑动没有问题,向上滑动的话,右侧的tableview会直接置顶,滚动到标题0

DropMenu和pageController运行起来直接crash

DropMenu和pageController的代码运行起来后就挂了,报的如下exception!
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'section header height must not be negative - provided height for section 3 is -0.010000'

菜单滚动到顶部,无法悬停,

  • (void)setupUI {
    __weak MineViewController *weakSelf = self;
    //默认标题透明度0
    [self.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor colorWithRed:10/255.0 green:10/255.0 blue:20/255.0 alpha:0]}];
    WMZPageParam *param = PageParam()
    .wTitleArrSet(@[@"分享",@"赞过",@"评论"])
    // .wMenuWidthSet(kWidth/3)
    .wControllersSet(@[[WaterCollectionController new],[WaterCollectionController new],[WaterCollectionController new]])
    //悬浮开启
    .wTopSuspensionSet(YES)
    //等分
    .wMenuTitleWidthSet(PageVCWidth/3)
    //头视图y坐标从0开始
    .wFromNaviSet(NO)
    //导航栏透明度变化
    .wNaviAlphaSet(YES)
    //顶部可下拉
    .wBouncesSet(YES)
    //头部
    .wMenuHeadViewSet(^UIView *{
    MineHeader *back = [MineHeader new];
    back.frame = CGRectMake(0, 0, PageVCWidth, 470+PageVCStatusBarHeight);

      return back;
    

    })
    //导航栏标题透明度变化
    .wEventChildVCDidSrollSet(^(UIViewController *pageVC, CGPoint oldPoint, CGPoint newPonit, UIScrollView *currentScrollView) {

        __strong MineViewController *strongSelf = weakSelf;
       [strongSelf.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor colorWithRed:10/255.0 green:10/255.0 blue:20/255.0 alpha:newPonit.y/(500+470-2*PageVCNavBarHeight)]}];
    

    });
    //实现tableview的协议
    self.downSc.dataSource = self;
    self.param = param;
    //延时0.1秒
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    // 下拉刷新
    self.downSc.mj_header= [MJRefreshNormalHeader headerWithRefreshingBlock:^{
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    [weakSelf.downSc.mj_header endRefreshing];
    });
    }];

    });
    }
    我这样配置,菜单可以悬浮,但是没办法悬停,菜单滚动到顶部,无法悬停,我滑动下面的collectionView,菜单立马跟着下来了。。但是你的demo又没有问题,我导入的是1.1.8版本的库,我对比了下demo,属性好像没有差别。。不知道还需要配置什么。。求大佬指点一二

各个板块中放UITableView的问题

1.在导航栏透明度变化+头部刷新这个demo中,如果我在各个板块控制器内添加UITableView,会出现UITableView下拉的时候,头部就会立马下拉刷新的问题。应该是手势处理的问题。
2.在导航栏透明度变化+头部刷新这个demo中,无法添加加载更多。

子控制器的生命周期函数调用有点小瑕疵

和系统实现的容器控制器管理的子控制器生命周期函数调用时机不是很一致
这是使用WMZPageController时轻微拖动然后取消拖动时子控制器的生命周期函数调用顺序
`2020-01-26 21:15:18.164039+0800 Example[68459:663714] 0x7f8a12436a90 -[ListViewController viewWillAppear:]

2020-01-26 21:15:18.164300+0800 Example[68459:663714] 0x7f8a124713e0 -[ListViewController viewWillDisappear:]

2020-01-26 21:15:18.164746+0800 Example[68459:663714] 0x7f8a12436a90 -[ListViewController viewDidAppear:]

2020-01-26 21:15:18.165165+0800 Example[68459:663714] 0x7f8a124713e0 -[ListViewController viewDidDisappear:]`

这是我用系统UIPageViewController按照如上操作其子控制器的生命周期调用情况
`2020-01-26 21:23:04.310820+0800 YunES[68568:677963] -[YJFTableViewController viewWillAppear:]

2020-01-26 21:23:04.310979+0800 YunES[68568:677963] -[YJFNomalViewController viewWillDisappear:]

2020-01-26 21:23:10.122912+0800 YunES[68568:677963] -[YJFNomalViewController viewWillAppear:]

2020-01-26 21:23:10.123155+0800 YunES[68568:677963] -[YJFNomalViewController viewDidAppear:]

2020-01-26 21:23:10.123380+0800 YunES[68568:677963] -[YJFTableViewController viewWillDisappear:]

2020-01-26 21:23:10.123608+0800 YunES[68568:677963] -[YJFTableViewController viewDidDisappear:]
`

隐藏导航栏后,直接把菜单栏加到导航栏的位置,页面下部分有留白,大概一个导航栏的高度,具体代码在这里

NSArray *data=@[@"活动行程",@"申请记录"];

NSMutableArray *vcArr=[NSMutableArray new];
[vcArr addObject:[[MJGoTableViewController alloc]init]];
[vcArr addObject:[[MJGoApplyTableViewController alloc]init]];

WMZPageParam *param = PageParam()
.wTitleArrSet(data)
.wMenuTitleOffsetSet(16.5)
.wMenuTitleSelectColorSet(UIColorWhite)
.wMenuTitleColorSet(UIColorWithHexString(@"#FFFFFF"))
.wMenuAnimalSet(3)
.wMenuIndicatorWidthSet(28)
.wMenuCellMarginSet(16.5)
.wMenuBgColorSet(UIColorWithHexString(@"#4B4B4B"))
.wMenuCellMarginYSet(20)
.wFromNaviSet(NO)
.wControllersSet(vcArr);
self.param = param;

self.rectArr=[NSMutableArray new];
CGRect frame=CGRectMake(SCREEN_WIDTH*vcArr.count, 0, SCREEN_WIDTH, SCREEN_HEIGHT-TabBarHeight);
[self.rectArr addObject:[NSValue valueWithCGRect:frame]];

如何更新右边固定标题?

.wMenuFixRightDataSet(@{@"name":@"金币",@"image":@"f_arrow_upbai"})
.wEventFixedClickSet(^(id anyID, NSInteger index) {
WMZPageNaviBtn *btn = anyID;
[btn setTitle:@"更新" forState:UIControlStateNormal];
})

是这样更新右边固定标题的吗?这样写页面会变形

selectMenuWithIndex不能立即生效?

您好大佬,麻烦问下,默认选中某个index页面,selectMenuWithIndex不能立即生效,我加了个延迟0.1秒才会选中这个页面,请问是什么原因呀?

设置wMenuTitleSelectUIFontSet无效

想给选中状态和未选中状态设置不同的字体,同时设置了wMenuTitleUIFontSet和wMenuTitleSelectUIFontSet,生效的只有wMenuTitleUIFontSet

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.