美文网首页
多控制器切换 根据标题的宽度来设置一屏占几个,只有两个标题情况

多控制器切换 根据标题的宽度来设置一屏占几个,只有两个标题情况

作者: 糖糖本尊 | 来源:发表于2017-03-23 17:47 被阅读26次
    1510469-ca91e2a3ad507111.png
    
    #import "LLSwitchBaseViewController.h"
    #import "LLSwitchHead.h"
    #import "UIView+Frame.h"
    #import "LLSwitchViewController.h"
    @interface LLSwitchBaseViewController ()<UIScrollViewDelegate>
    
    @property (nonatomic,strong)  NSArray * titleArr;
    
    @property (nonatomic,strong)  NSMutableArray  *titleWidths ;
    @property (nonatomic,strong)  NSMutableArray * titleLableArr;
    
    @property (nonatomic,assign)  CGFloat  titleMargin;
    
    @property (nonatomic,strong)  UIScrollView * titleScroll;
    
    @property (nonatomic,strong)  UIScrollView * contentScroll;
    
    /** 下标视图 */
    @property (nonatomic, strong) UIView *underLine;
    /** 记录上一次内容滚动视图偏移量 */
    @property (nonatomic, assign) CGFloat lastOffsetX;
    @end
    
    @implementation LLSwitchBaseViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.view.backgroundColor = [UIColor whiteColor];
        self.automaticallyAdjustsScrollViewInsets = false;
        [self setupUI];
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    -(void)setupUI {
        [self.view addSubview:self.titleScroll];
        [self.view addSubview:self.contentScroll];
        
        [self setUpTitleWidth];
        [self setUpAllTitle];
        
    
    }
    
    // 设置所有标题
    - (void)setUpAllTitle
    {
        
        // 遍历所有的子控制器
        NSUInteger count = self.titleArr.count;
        
        // 添加所有的标题
        CGFloat labelW = 0;
        CGFloat labelH = 45;
        CGFloat labelX = 0;
        CGFloat labelY = 0;
        
        for (int i = 0; i < count; i++) {
            UILabel *label = [[UILabel alloc] init];
            
            label.tag = i;
            
            label.userInteractionEnabled = true;
            
            // 设置按钮的文字颜色
            label.textColor = [UIColor darkGrayColor];
            
            label.font = LLTitleFont;
            
            label.textAlignment = NSTextAlignmentCenter;
            // 设置按钮标题
            label.text = self.titleArr[i];
            
            // 设置按钮位置
            UILabel *lastLabel = [self.titleLableArr lastObject];
            //如果标题栏只有两个的话,则设置屏幕各占一半
            if (count < 3) {
                
                labelW = LLScreenW / 2;
                labelX = i * labelW;
            }else {
                labelW = [self.titleWidths[i] floatValue];
                labelX = _titleMargin + CGRectGetMaxX(lastLabel.frame);
                
            }
    
            label.frame = CGRectMake(labelX, labelY, labelW, labelH);
            
            // 监听标题的点击
            UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(titleClick:)];
            [label addGestureRecognizer:tap];
            
            // 保存到数组
            [self.titleLableArr addObject:label];
            
            [self.titleScroll addSubview:label];
            
            //添加对应的子控制器
            LLSwitchViewController * switchVc = [LLSwitchViewController new];
            switchVc.title = self.titleArr[i];
            [self addChildViewController:switchVc];
            //设置第一个
            if (i == 0) {
                [self titleClick:tap];
            }
            
           
            
        }
        
        // 设置标题滚动视图的内容范围
        UILabel *lastLabel = self.titleLableArr.lastObject;
        _titleScroll.contentSize = CGSizeMake(CGRectGetMaxX(lastLabel.frame), 0);
        _titleScroll.showsHorizontalScrollIndicator = NO;
        _contentScroll.contentSize = CGSizeMake(count * LLScreenW, 0);
        
    }
    
    // 标题按钮点击
    - (void)titleClick:(UITapGestureRecognizer *)tap
    {
     
        for (UILabel * lable in self.titleLableArr) {
            lable.textColor = [UIColor darkGrayColor];
        }
        // 获取对应标题label
        UILabel *label = (UILabel *)tap.view;
        //设置文字跟随滚动
        [self setLabelTitleCenter:label];
        //设置下表跟随滚动
        [self setUpUnderLine:label];
        // 获取当前角标
        NSInteger i = label.tag;
        
        // 选中label
        label.textColor = [UIColor purpleColor];
        // 内容滚动视图滚动到对应位置
        CGFloat offsetX = i * LLScreenW;
        LLSwitchViewController * switchVc = self.childViewControllers[i];
        [self.contentScroll addSubview:switchVc.view];
        switchVc.view.frame = self.contentScroll.bounds;
        
        self.contentScroll.contentOffset = CGPointMake(offsetX, 0);
        
        // 记录上一次偏移量,因为点击的时候不会调用scrollView代理记录,因此需要主动记录
        _lastOffsetX = offsetX;
        
        
    }
    // 设置下标的位置
    - (void)setUpUnderLine:(UILabel *)label
    {
       
        CGFloat underLineH = 2;
        
        self.underLine.yz_y = label.yz_height - underLineH;
        self.underLine.yz_height = underLineH;
        
        // 点击时候需要动画
        [UIView animateWithDuration:0.25 animations:^{
            
            if (self.titleArr.count  < 3) {
                self.underLine.yz_width = LLScreenW / 2;
                
            }else {
                self.underLine.yz_width = label.yz_width;
                
            }
            self.underLine.yz_centerX = label.yz_centerX;
    
        }];
        
    }
    
    
    // 让选中的按钮居中显示
    - (void)setLabelTitleCenter:(UILabel *)label
    {
        
        // 设置标题滚动区域的偏移量
        CGFloat offsetX = label.center.x - LLScreenW * 0.5;
        
        if (offsetX < 0) {
            offsetX = 0;
        }
        
        // 计算下最大的标题视图滚动区域
        CGFloat maxOffsetX = self.titleScroll.contentSize.width - LLScreenW + _titleMargin;
        if (self.titleArr.count < 3) { //有两个标题情况,不设置
            maxOffsetX = self.titleScroll.contentSize.width - LLScreenW ;
            
        }
    
        if (maxOffsetX < 0) {
            maxOffsetX = 0;
        }
        
        if (offsetX > maxOffsetX) {
            offsetX = maxOffsetX;
        }
        
        // 滚动区域
        [self.titleScroll setContentOffset:CGPointMake(offsetX, 0) animated:YES];
        
    }
      /// MARK: ---- scrollViewDidEndDecelerating
    -(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
        
        CGFloat offsetX = scrollView.contentOffset.x;
        NSInteger offsetXInt = offsetX;
        NSInteger screenWInt = LLScreenW;
        
        NSInteger extre = offsetXInt % screenWInt;
        if (extre > LLScreenW * 0.5) {
            // 往右边移动
            offsetX = offsetX + (LLScreenW - extre);
            [self.contentScroll setContentOffset:CGPointMake(offsetX, 0) animated:YES];
        }else if (extre < LLScreenW * 0.5 && extre > 0){
            // 往左边移动
            offsetX =  offsetX - extre;
            [self.contentScroll setContentOffset:CGPointMake(offsetX, 0) animated:YES];
        }
        
        // 获取角标
        NSInteger i = offsetX / LLScreenW;
        UILabel * currentLable = self.titleLableArr[i];
        // 选中标题
        [self titleClick:currentLable.gestureRecognizers.firstObject ];
    
    }
    
    #pragma mark - 计算所有标题宽度
    // 计算所有标题宽度
    - (void)setUpTitleWidth
    {
        // 判断是否能占据整个屏幕
        NSUInteger count = self.titleArr.count;
    
        CGFloat totalWidth = 0;
        
        // 计算所有标题的宽度
        for (NSString *title in self.titleArr) {
        
            CGRect titleBounds = [title boundingRectWithSize:CGSizeMake(MAXFLOAT, 0) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:LLTitleFont} context:nil];
            
            CGFloat width = titleBounds.size.width + 20;
            
            [self.titleWidths addObject:@(width)];
            
            totalWidth += width;
        }
        
        if (totalWidth > LLScreenW) {
            
            _titleMargin = LLMargin;
            
            self.titleScroll.contentInset = UIEdgeInsetsMake(0, 0, 0, _titleMargin);
            
            return;
        }
        
        CGFloat titleMargin = (LLScreenW - totalWidth) / (count + 1);
        
        _titleMargin = titleMargin < LLMargin? LLMargin: titleMargin;
        
        self.titleScroll.contentInset = UIEdgeInsetsMake(0, 0, 0, _titleMargin);
    }
    
    
    
      /// MARK: ----  懒加载方法
    
    - (NSMutableArray *)titleWidths {
        if (_titleWidths == nil) {
            _titleWidths = [NSMutableArray array];
        }
        return _titleWidths;
    }
    -(UIScrollView *)titleScroll {
        if (_titleScroll == nil) {
            _titleScroll = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 64, LLScreenW, 45)];
        }
        return _titleScroll;
    }
    -(UIScrollView *)contentScroll {
        if (_contentScroll == nil) {
            _contentScroll = [[UIScrollView alloc]initWithFrame:CGRectMake(0, CGRectGetMaxY(self.titleScroll.frame), LLScreenW, LLScreenH - 64 - 45)];
            _contentScroll.delegate = self;
            _contentScroll.pagingEnabled = true;
        }
        return _contentScroll;
    
    }
    -(NSArray *)titleArr {
        
        if (_titleArr == nil) {
            _titleArr = @[@"要闻专题视频",@"你你你你我饿我饿我饿",@"每每大",@"懒懒的",@"很爱很爱"];
        }
        return _titleArr;
    }
    -(NSMutableArray *)titleLableArr {
        if (_titleLableArr == nil) {
            _titleLableArr = [NSMutableArray array];
        }
        return _titleLableArr;
    }
    
    - (UIView *)underLine
    {
        if (_underLine == nil) {
            
            _underLine = [[UIView alloc] init];
            
            _underLine.backgroundColor = [UIColor redColor];
            
            [self.titleScroll addSubview:_underLine];
    
            
        }
        return _underLine ;
    }
    
    @end
    
    

    相关文章

      网友评论

          本文标题:多控制器切换 根据标题的宽度来设置一屏占几个,只有两个标题情况

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