美文网首页iOS经验总结
iOS 多页面嵌套JXCategoryView与WMPageCo

iOS 多页面嵌套JXCategoryView与WMPageCo

作者: Silence_xl | 来源:发表于2019-04-04 14:15 被阅读0次
image.png

多页面嵌套的实现方式
1、底部是一个UIScrollView,然后在UIScrollView上添加视图View;
2、底部是一个UICollectionView,然后在cell上添加各种视图View;

两种方式的区别就是,UICollectionView的重用机制,可以减小内存中读入的数据

3、底部是个UIController,然后添加UIScrollView,在UIController上添加目标UIController,在UIScrollView上添加目标UIController的view;
4、底部是个UIController,然后添加UICollectionView,在UIController上添加目标UIController,在UICollectionView上添加目标UIController的view;

可以保留UIcontroller的生命周期

JXCategoryView的实现

JXCategoryListContainerView继承与UIView

内部UI实现

initializeViews方法 创建UI视图

// 创建底层UIController

_containerVC = [[JXCategoryListContainerViewController alloc] init];

self.containerVC.view.backgroundColor = [UIColor clearColor];

[self addSubview:self.containerVC.view];

 

// 添加视图

UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];

    layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;

    layout.minimumLineSpacing = 0;

    layout.minimumInteritemSpacing = 0;

    if (self.delegate &&

        [self.delegate respondsToSelector:@selector(scrollViewClassInlistContainerView:)] &&

        [[self.delegate scrollViewClassInlistContainerView:self] isKindOfClass:object_getClass([UICollectionView class])]) {

        _collectionView = (UICollectionView *)[[[self.delegate scrollViewClassInlistContainerView:self] alloc] initWithFrame:CGRectZero collectionViewLayout:layout];

    }else {

        _collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout];

    }

    self.collectionView.pagingEnabled = YES;

    self.collectionView.showsHorizontalScrollIndicator = NO;

    self.collectionView.showsVerticalScrollIndicator = NO;

    self.collectionView.scrollsToTop = NO;

    self.collectionView.bounces = NO;

    self.collectionView.dataSource = self;

    self.collectionView.delegate = self;

    [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cell"];

    if (@available(iOS 10.0, *)) {

        self.collectionView.prefetchingEnabled = NO;

    }

    if (@available(iOS 11.0, *)) {

        self.collectionView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;

    }

    [self.containerVC.view addSubview:self.collectionView];

    //让外部统一访问scrollView

    _scrollView = _collectionView;
// 第一次读入视图的时候,添加UIController

list = [self.delegate listContainerView:self initListForIndex:index];

if ([list isKindOfClass:[UIViewController class]]) {

    [self.containerVC addChildViewController:(UIViewController *)list];

}

 

// 视图重用

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {

UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];

cell.contentView.backgroundColor = [UIColor whiteColor];

for (UIView *subview in cell.contentView.subviews) {

    [subview removeFromSuperview];

}

id<JXCategoryListContentViewDelegate> list = _validListDict[@(indexPath.item)];

[list listView].frame = cell.contentView.bounds;

[cell.contentView addSubview:[list listView]];

return cell;

 

// 触发目标Controller的生命周期

[listVC beginAppearanceTransition:YES animated:NO];

WMPageController

首先子视图要继承WMPageController类

内部创建一个UIScrollview用于加载,我们需要展示的子视图;

在每次需要展示视图时候,通过addChildViewController添加视图;

// 把视图添加到当前Controller上

- (void)wm_addCachedViewController:(UIViewController *)viewController atIndex:(NSInteger)index {

[self addChildViewController:viewController];

viewController.view.frame = [self.childViewFrames[index] CGRectValue];

[viewController didMoveToParentViewController:self];

[self.scrollView addSubview:viewController.view];

[self willEnterController:viewController atIndex:index];

[self.displayVC setObject:viewController forKey:@(index)];

}

在视图消失以后,通过removeFromParentViewController移除控制器;

- (void)wm_removeViewController:(UIViewController *)viewController atIndex:(NSInteger)index {

  [self wm_rememberPositionIfNeeded:viewController atIndex:index];

  [viewController.view removeFromSuperview];

  [viewController willMoveToParentViewController:nil];

  [viewController removeFromParentViewController]

  [self.displayVC removeObjectForKey:@(index)];

// 放入缓存

  if (self.cachePolicy == WMPageControllerCachePolicyDisabled) {

     return;

  }

 

  if (![self.memCache objectForKey:@(index)]) {

      [self willCachedController:viewController atIndex:index];

      [self.memCache setObject:viewController forKey:@(index)];

  }

}

横向对比
1:WMPageController 为了保持生命周期的完整性,每次都需要对UIController进行操作,增加了性能的消耗;
2:WMPageController底层为UIScrollView,没有进行视图的复用,如果作为首页,会占用较多的内存;
3:使用WMPageController必须要继承WMPageController,对工程的影响面较大,切入性要求较高;

相关文章

网友评论

    本文标题:iOS 多页面嵌套JXCategoryView与WMPageCo

    本文链接:https://www.haomeiwen.com/subject/cjwfiqtx.html