Coder Social home page Coder Social logo

wmpagecontroller's People

Contributors

baryon avatar chengxianghe avatar chinsyo avatar codwam avatar edwardbx avatar ghysrc avatar huangxinyu1213 avatar jeeliu avatar litt1e-p avatar sinofake avatar wangmchn avatar wanhmr avatar yinqiangw 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  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

wmpagecontroller's Issues

scrollViewDidScroll 里的操作

感觉一滚动 ,就在不停调用layoutChildViewControllers,做了很多没意思的操作啊,这个该怎么优化呢?

  • (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    [self layoutChildViewControllers];
    if (animate) {
    CGFloat width = scrollView.frame.size.width;
    CGFloat contentOffsetX = scrollView.contentOffset.x;
    CGFloat rate = contentOffsetX / width;
    [self.menuView slideMenuAtProgress:rate];
    }
    }
  • (void)layoutChildViewControllers{
    int currentPage = (int)self.scrollView.contentOffset.x / viewWidth;
    int start,end;
    if (currentPage == 0) {
    start = currentPage;
    end = currentPage + 1;
    }else if (currentPage + 1 == self.viewControllerClasses.count){
    start = currentPage - 1;
    end = currentPage;
    }else{
    start = currentPage - 1;
    end = currentPage + 1;
    }
    NSLog(@"%s",func); //startPage
    for (int i = start; i <= end; i++) {
    NSLog(@"hello");
    CGRect frame = [self.childViewFrames[i] CGRectValue];
    UIViewController *vc = [self.displayVC objectForKey:@(i)];
    if ([self isInScreen:frame]) {
    if (vc == nil) {
    // 先从 cache 中取
    vc = [self.memCache objectForKey:@(i)];
    if (vc) {
    // cache 中存在,添加到 scrollView 上,并放入display
    [self addCachedViewController:vc atIndex:i];
    }else{
    // cache 中也不存在,创建并添加到display
    [self addViewControllerAtIndex:i];
    }
    }
    }else{
    if (vc) {
    // vc不在视野中且存在,移除他
    [self removeViewController:vc atIndex:i];
    }
    }
    }
    }

建议修改- (void)menuView:(WMMenuView *)menu didSelesctedIndex:(NSInteger)index currentIndex:(NSInteger)currentIndex

建议把这里修改为:

- (void)menuView:(WMMenuView *)menu didSelesctedIndex:(NSInteger)index currentIndex:(NSInteger)currentIndex {
    NSInteger gap = (NSInteger)labs(index - currentIndex);
    animate = NO;
    CGPoint targetP = CGPointMake(viewWidth*index, 0);

    [self.scrollView setContentOffset:targetP animated:gap > 1?NO:self.pageAnimatable];

    _selectIndex = (int)index;

    UIViewController *vc = [self.displayVC objectForKey:@(_selectIndex)];
    if (vc == nil) {
        // 先从 cache 中取
        vc = [self.memCache objectForKey:@(_selectIndex)];
        if (vc) {
            // cache 中存在,添加到 scrollView 上,并放入display
            [self addCachedViewController:vc atIndex:_selectIndex];
            self.currentViewController = vc;
        } else {
            // cache 中也不存在,创建并添加到display
            [self addViewControllerAtIndex:_selectIndex];

            self.currentViewController = self.displayVC[@(_selectIndex)];
        }
    } else {
        self.currentViewController = vc;
    }


    if (gap > 1 || !self.pageAnimatable) {
        [self postFullyDisplayedNotificationWithCurrentIndex:(int)index];
        // 由于不触发 -scrollViewDidScroll: 手动清除控制器..
        UIViewController *vc = [self.displayVC objectForKey:@(currentIndex)];
        if (vc) {
            [self removeViewController:vc atIndex:currentIndex];
        }
    }

}

修复一个bug

当初始化进去后,viewDidLoad 实现[self addViewControllerAtIndex:self.selectIndex]; 当前index 的view frame为nil,而- (void)viewDidLayoutSubviews后也没对index 的view frame进行更新。 所以要对index view 进行赋值,以便后面进行更新,修改如下:

// 添加子控制器
- (void)addViewControllerAtIndex:(int)index {
    Class vcClass = self.viewControllerClasses[index];
    UIViewController *viewController = [[vcClass alloc] init];
    [self addChildViewController:viewController];
    viewController.view.frame = [self.childViewFrames[index] CGRectValue];
    [viewController didMoveToParentViewController:self];
    [self.scrollView addSubview:viewController.view];
    [self.displayVC setObject:viewController forKey:@(index)];

   self.currentViewController = viewController;

    [self backToPositionIfNeeded:viewController atIndex:index];
}

if you wanna set wmmenuview as titleview,you should add this

i wanna set wmmenuview as titleview,but i notice that if you push to another viewcontroller,after pull back,the wmmenuview will increase more subviews.

i check the thread stack finded that the reason is when push viewcontroller,the parent controller will call "willMoveToSuperview" again,so the wmmenuview will add new items,but obversely you dont want that happen.

so a simple way to fix the problem is to add a bool variable and add a if control,like below:

  • (void)willMoveToSuperview:(UIView *)newSuperview {
    if(!self.isload){
    self.isload=true;
    [self addScrollView];
    [self addItems];
    [self makeStyle];
    }
    }

works fine on me.hope will help somebody

Controller中的UIRectEdge问题

你在WMPageController.m中的viewDidLoad方法中有这么一句话self.edgesForExtendedLayout = UIRectEdgeNone;这样子controller的view就不能全屏显示了哦。我在WMPageController中的calculateSize方法里面添加了这么一句代码
if (self.edgesForExtendedLayout == UIRectEdgeAll) {
_viewY = self.viewFrame.origin.y + 64.0f;
}

你好,你的控件非常好用,只是我发现了一点美中不足

今天偶然间发现了你的控件,特地下下来玩了一下,发现了一点小问题,就是当用手势滑动的时候,调用了slideMenuAtProgress:方法更新UI,但是并没有在其中设置item的selected,虽然不影响大局,但是这个selected属性在拓展的时候经常会用到,可能修复一下会比较好。

滑动不触发didSelect代理方法

有个页面是需要登录才能展示的, 但是滚动的时候代理并不会被触发,有什么好的解决办法么?

我目前是在viewWillAppear 里面判断,如果未登录就手动设置menu选中上个页面.

我想的是可否增加一个选项:
将要展示某个页面时,根据代理返回的bool值 决定是否展示.

怎么通过代码设置WMPageController的selectIndex

我现在遇到的问题是:WMPageController现在在某个Index 比如0. 切换到app的其他地方做了一些操作后,需要跳转到WMPageController的页面的0 index. 我通过设置self.pageView.selectIndex = 0;后调到了对应的index 但是页面是空白的页面。 网络请求的数据是正确的。

有没有人遇到类似的情况?

貌似用不了。。。。

  • (void)viewDidLoad {
    [super viewDidLoad];

    WMPageController *pageController = [self getDefaultController];
    pageController.title = @"Line";
    }

  • (WMPageController *)getDefaultController{
    NSMutableArray *viewControllers = [[NSMutableArray alloc] init];
    NSMutableArray *titles = [[NSMutableArray alloc] init];
    for (int i = 0; i < 4; i++) {
    Class vcClass;
    NSString *title;
    switch (i % 3) {
    case 0:
    vcClass = [YZViewController class];

            title = @"Greetings";
            break;
        case 1:
            vcClass = [YZSales_VC class];
            title = @"Hit Me";
            break;
        default:
            vcClass = [YZViewController class];
            title = @"Fluency";
            break;
    }
    [viewControllers addObject:vcClass];
    [titles addObject:title];
    

    }
    WMPageController *pageVC = [[WMPageController alloc] initWithViewControllerClasses:viewControllers andTheirTitles:titles];
    pageVC.pageAnimatable = YES;
    pageVC.menuItemWidth = 85;
    pageVC.postNotification = NO;

    return pageVC;
    }
    设置了没啥反应

代理方法

能否添加这样一个代理方法,在外界捕获到滑动的时候,获得到当前选中的索引。

NavigationBar 颜色被改变

我的项目里,当显示WMPageController时,Navigation Bar 的颜色会变成亮灰色,而我的项目所有其他部分都是白色。我尝试在WMPageController初始化时设置view的背景颜色为白色也是无效。
Navigation Bar的颜色是在切换动画完成后改变的,也就是动画之中颜色还是正常,一旦动画结束颜色就变成亮灰了。

这个问题在你的demo里也能看到,只是变化是反的,切换过程中是亮灰,切换完毕变成白色。

问个小白问题..

如果我想要在程序启动后就显示这种界面,而不是通过导航控制器push过去,要怎么做呢,小白求教

子控制器 init

// 添加子控制器

  • (void)addViewControllerAtIndex:(int)index {
    Class vcClass = self.viewControllerClasses[index];
    UIViewController *viewController = [[vcClass alloc] init];

我想问下每次都自动init,那我如果想在ib或者sb里面加载怎么办。。

页面值传递的问题

人比较笨,没明白,你说pageController进行传递数据,可是这个没法改变WMViewControlle或者WMTableViewController或者WMCollectionViewController里面的 数据类型 假如这里面的数据是根据外面传入的数据进行改变的,这个应该怎么办?by the way,你的这个写的是我看到的类似控件,用起来最简单的一个控件,非常方便!!!

关于滑动问题

关于你的PageController 我想禁止手势滑动
我在你的WMPageController 的 addScrollView 方法中加入 scrollView.scrollEnabled = NO; 可以实现效果
但是如果外部调用pageController.scrollview.scollEnable =NO;却无法实现,想请教一下

Is there a way to update tab item title?

In my case, I need to show a number in the item title, and update them at some times.

It seems that currently there is no method to update the title easily?

For fixed width items it should be easily to be updated since no frame recalculation is needed?

如何修改menuView的高度

我现在这边的结构是这样的。
image
然后在互联网设置(wanSettingsVC)中又加了几个navitationController(而不是viewController)作为childViewControllers.用于切换不同的上网方式。这时上面的menuView 的高度就变成下面这样了。请教下在哪里可以修改。THX
我设置了menuHeight为44,但是不管用。
image

image

多次调用 viewDidLayoutSubviews

为什么我在我的项目中使用这些代码,在每次切换菜单的时候都会调用viewDidLayoutSubviews,导致menu每次都从0重新滚动一遍。而你的demo却没有,我自己做个实验,新建一个空白 的项目只放一个uiscrollview 每次向这个scrollview添加view的时候都会调用 viewDidLayoutSubviews。
真心很奇怪

能否实现预加载左右n页的功能呢?

子控制器界面内容较多时,第一次滑动过去的时候会停顿一下,当子控制器加载完毕后就左右滑动得很流畅了,所以我想问一下,能否实现预加载左右n页的功能,然后左右滑动的时候就流畅滑动无停顿

menuView selected bug?

it calls the method:addMenuView when I scroll , and go to below lines:

  • if (self.selectIndex != 0) {
  • [self.menuView selectItemAtIndex:self.selectIndex];
  • }

then in the WMMenuView.m:
-(void)selectItemAtIndex:(NSInteger)index {

  • NSInteger tag = index + kTagGap;
  • NSInteger currentIndex = self.selItem.tag - kTagGap;
  • WMMenuItem *item = (WMMenuItem *)[self viewWithTag:tag];
  • [self.selItem deselectedItemWithoutAnimation];
  • self.selItem = item;
  • [self.selItem selectedItemWithoutAnimation];
  • [self.progressView setProgressWithOutAnimate:index];
  • if ([self.delegate respondsToSelector:@selector(menuView:didSelesctedIndex:currentIndex:)]) {
    [self.delegate menuView:self didSelesctedIndex:index currentIndex:currentIndex];
  • }
  • [self refreshContenOffset];
    }

there is a delegate method @selector(menuView:didSelesctedIndex:currentIndex:), it will send to its delegate and responds to it. _animate will become NO, the bug comes:when I scroll again, the menuView couldn't add its view, cause in the method below:

  • -(void)scrollViewDidScroll:(UIScrollView *)scrollView, menuView can not call slideMenuAtProgress:.

it works well when I delete some delegate codes in the WMMenuView.m: - (void)selectItemAtIndex:(NSInteger)index:

// if ([self.delegate respondsToSelector:@selector(menuView:didSelesctedIndex:currentIndex:)]) {
// [self.delegate menuView:self didSelesctedIndex:index currentIndex:currentIndex];
// }

is it?

iOS 9 Split View support required

Please support - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator in iOS 9.

提个问题

每次都会把之前的ViewController给destroy掉,然后再次查看,重新进入viewdidload。都是些本地数据的话,不影响,但如果是通过网络获取数据或者是之前的viewcontroller内有输入框(处于编辑状态),这样的情况,重新加载整个视图,我觉得不是很合理~

赞!

看上去不错啊,赞一个!

- WMMenuView Delegate 这里是不是笔误

  • (void)menuView:(WMMenuView _)menu didSelesctedIndex:(NSInteger)index currentIndex:(NSInteger)currentIndex {
    NSInteger gap = (NSInteger)labs(index - currentIndex);
    _selectIndex = (int)index;
    _animate = NO;
    CGPoint targetP = CGPointMake(_viewWidth_index, 0);

    [self.scrollView setContentOffset:targetP animated:gap > 1 ? NO : self.pageAnimatable];
    if (gap > 1 || !self.pageAnimatable) {
    // 由于不触发 -scrollViewDidScroll: 手动处理控制器
    UIViewController *currentViewController = self.displayVC[@(currentIndex)];
    // 最好判断一下,因为在做某个项目时,currentViewController = nil
    if (currentViewController) {
    [self removeViewController:currentViewController atIndex:currentIndex];
    }
    [self layoutChildViewControllers];
    self.currentViewController = self.displayVC[@(self.selectIndex)];
    [self postFullyDisplayedNotificationWithCurrentIndex:(int)index];

#pragma mark - 这里 是不是应该是 index 而不是 currentIndex
[self didEnterController:self.currentViewController atIndex: currentIndex];

}

第一个控制器不执行viewDidAppear:

感谢你提供这么好用的框架,但是我在实际使用过程中发现 第一个控制器不走viewDidAppear 或 will 方法.

请问是我参数设置的问题吗?

能否作为一个view添加到已有的控制器里面

我尝试在已经有的控制器添加进去
代码是这样的

   WMPageController *pageController = [self p_defaultController];
    pageController.menuViewStyle = WMMenuViewStyleLine;
    pageController.titleSizeSelected = 15;
    [self.MainView addSubview:pageController.view];

能看到导航条,但是看不到内容
有个奇怪的问题,内容会在加载的一瞬间出现一次,然后就不见了
我断点去加载发现这样直接加载view的话,你控制器的viewDidLayoutSubviews不会调用,导致scrollview的frame为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.