亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

iOS菜單滾動聯動內容區域功能實現

2019-11-14 18:08:23
字體:
來源:轉載
供稿:網友

平時開發APP中關于此功能還是比較經常碰到,本實例借用三個開源的插件,并對其中一個進行修改調整實現出想要的效果;本文重點介紹修改的內容跟三個插件的運用,這三個插件還可以各自擴展到其它項目的運用;

效果圖:

 

本實例實現的效果:頂部的滾動菜單顯示出所有的類型,每個類型都對應一種展示,可以在頂部的菜單進行滾動,內容區域也會跟著改變,或者是內容區域左右滑動,則頂部的滾動菜單也會跟著更改,頂部菜單的最右邊有一個展示更多菜單的效果,用于彈出一個帶箭頭的窗;(源代碼下載)

 帶箭頭的彈出視圖插件 :https://github.com/xiekw2010/DXPopover

 內容區域滑動插件:https://github.com/nicklockwood/iCarousel

 及Codint.Net開源項目中的XTSegmentControl菜單滾動效果,此實例對它進行的修改

1:插件及頁面的初始化

#import "ViewController.h"#import "oldChildVewController.h"#import "ChildViewController.h"#import "newChildVewController.h"#import "XTSegmentControl.h"#import "iCarousel.h"#import "Masonry.h"#import "menuCollectionViewCell.h"#import "DXPopover.h"#define kScreen_Height [UIScreen mainScreen].bounds.size.height#define kScreen_Width [UIScreen mainScreen].bounds.size.width#define kMySegmentControl_Height 44.0@interface ViewController ()<UICollectionViewDataSource, UICollectionViewDelegate,iCarouselDataSource, iCarouselDelegate>@PRoperty (strong, nonatomic) XTSegmentControl *mySegmentControl;@property (strong, nonatomic) NSArray *titlesArray;@property (strong, nonatomic) iCarousel *myCarousel;@property(assign,nonatomic)NSInteger curSelectIndex;@property (nonatomic, strong) DXPopover *popover;@property(assign,nonatomic)CGFloat popoverWidth;@property (strong, nonatomic) UICollectionView *myCollectionView;@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];        self.view.backgroundColor=[UIColor whiteColor];        //初始化一個popover 用于彈窗效果的展示    self.popover = [DXPopover new];    _popoverWidth = kScreen_Width-20;        __weak typeof(self) weakSelf = self;    CGRect frame=self.view.bounds;        //內容區滾動效果插件    self.myCarousel = ({        iCarousel *icarousel = [[iCarousel alloc] initWithFrame:frame];        icarousel.dataSource = self;        icarousel.delegate = self;        icarousel.decelerationRate = 1.0;        icarousel.scrollSpeed = 1.0;        icarousel.type = iCarouselTypeLinear;        icarousel.pagingEnabled = YES;        icarousel.clipsToBounds = YES;        icarousel.bounceDistance = 0.2;        [self.view addSubview:icarousel];        [icarousel mas_makeConstraints:^(MASConstraintMaker *make) {            make.edges.equalTo(self.view).insets(UIEdgeInsetsMake(64, 0, 0, 0));        }];        icarousel;    });        //添加滑塊    __weak typeof(_myCarousel) weakCarousel = _myCarousel;    self.mySegmentControl = [[XTSegmentControl alloc] initWithFrame:CGRectMake(0, 20, kScreen_Width, 44) Items:self.titlesArray showRightButton:YES selectedBlock:^(NSInteger index) {        weakSelf.curSelectIndex=index;        weakCarousel.currentItemIndex=index;        [weakSelf.myCollectionView reloadData];    }];    //當有右邊鍵時 其響應的事件    self.mySegmentControl.rightButtonBlock= ^(CGRect rightButtomRect)    {        //彈出插件的運用        [weakSelf updateMyViewFrame];        CGPoint startPoint =        CGPointMake(CGRectGetMidX(rightButtomRect), CGRectGetMaxY(rightButtomRect) + 25);        [weakSelf.popover showAtPoint:startPoint                   popoverPostion:DXPopoverPositionDown                  withContentView:weakSelf.myCollectionView                           inView:weakSelf.view];    };    [self.view addSubview:self.mySegmentControl];        //用于展示彈出效果里面的列表    if (!_myCollectionView) {        UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];        self.myCollectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0,50,kScreen_Width-40, 200) collectionViewLayout:layout];        self.myCollectionView.backgroundColor=[UIColor whiteColor];        self.myCollectionView.showsHorizontalScrollIndicator=NO;        self.myCollectionView.showsVerticalScrollIndicator=NO;        [self.myCollectionView registerClass:[menuCollectionViewCell class] forCellWithReuseIdentifier:NSStringFromClass([menuCollectionViewCell class])];        self.myCollectionView.dataSource = self;        self.myCollectionView.delegate = self;    }}

其中XTSegmentControl為頂部菜單的創建,其中showRightButton是為了擴展是否顯示右邊更多菜單的事件,并把事件的響應Block到頁面進行實現,此事例就是響應彈出窗的效果展現,iCarousel為內容區域的滑動效果,DXPopover彈出窗的效果,UICollectionView則用于彈出窗里面的菜單列表

//popver一些屬性的設置-(void)updateMyViewFrame{    CGRect tableViewFrame = self.myCollectionView.frame;    tableViewFrame.size.width = _popoverWidth;    self.myCollectionView.frame = tableViewFrame;    self.popover.contentInset = UIEdgeInsetsZero;    self.popover.backgroundColor = [UIColor whiteColor];}#pragma mark - Getter/Setter- (NSArray*)titlesArray{    if (nil == _titlesArray) {            _titlesArray = @[@"全部", @"互動", @"開源控件", @"文檔", @"代碼", @"高爾夫",@"主題",@"軟件",@"股票"];    }    return _titlesArray;}

2插件iCarouselDataSource, iCarouselDelegate代碼實現

#pragma mark iCarousel M- (NSUInteger)numberOfItemsInCarousel:(iCarousel *)carousel{    return [self.titlesArray count];}//滾動時內容視圖的加載- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view{    [_mySegmentControl setScrollOffset:index];    UIViewController *childContrll=[[ChildViewController alloc]init];    UIView *my=childContrll.view;    switch (index) {        case 0:        {            my.backgroundColor=[UIColor blackColor];            break;        }        case 1:        {            my.backgroundColor=[UIColor redColor];            break;        }        default:            childContrll=[[newChildVewController alloc]init];            break;    }    return childContrll.view;}//滾動時 下劃線的位置更新- (void)carouselDidScroll:(iCarousel *)carousel{    if (_mySegmentControl) {        [_mySegmentControl moveIndexWithProgress];    }}//更新滾動其它兩個控件的位置- (void)carouselCurrentItemIndexDidChange:(iCarousel *)carousel{    self.curSelectIndex=carousel.currentItemIndex;    [self.myCollectionView reloadData];    if (_mySegmentControl) {        _mySegmentControl.currentIndex = carousel.currentItemIndex;    }}

注意:內容區域的視圖加載,及其滑動所響應的事件處理,原來的XTSegmentControl對于菜單字數不同時下劃線會出現一些異常,本實例對它進行修改了;

3:列表UICollectionViewDataSource, UICollectionViewDelegate功能的實現

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{    return self.titlesArray.count;}- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{    menuCollectionViewCell *ccell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([menuCollectionViewCell class]) forIndexPath:indexPath];    NSString *model=[self.titlesArray objectAtIndex:indexPath.row];    ccell.curMenuModel=model;    if (self.curSelectIndex==indexPath.row) {        ccell.backgroundColor=[UIColor blueColor];    }    else    {        ccell.backgroundColor=[UIColor whiteColor];    }    return ccell;}- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{    return CGSizeMake((kScreen_Width-40)/3, 40);}- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{    return UIEdgeInsetsZero;}- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section{    return 5;}- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section{    return 5;}- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{    self.curSelectIndex=indexPath.row;    //兩個滾動的位置更新    _myCarousel.currentItemIndex=self.curSelectIndex;    [_mySegmentControl selectIndex:self.curSelectIndex];    //隱藏彈出窗    [self.popover dismiss];}

注意:主要是在實現點擊時滾動位置跟內容的區域要進行調整,并把彈出窗進行收縮的操作;

4:XTSegmentControl下劃線調整

- (void)moveIndexWithProgress{    CGRect origionRect = [_itemFrames[_currentIndex] CGRectValue];        CGRect origionLineRect = CGRectMake(CGRectGetMinX(origionRect) + XTSegmentControlHspace, CGRectGetHeight(origionRect) - XTSegmentControlLineHeight, CGRectGetWidth(origionRect) - 2 * XTSegmentControlHspace, XTSegmentControlLineHeight);        //增加下劃線滾動的效果    [UIView animateWithDuration:0.5 animations:^{        _lineView.frame = origionLineRect;    } completion:^(BOOL finished) {            }];    }

5:擴展XTSegmentControl沒有右邊更多菜單的效果

    self.mySegmentControl = [[XTSegmentControl alloc] initWithFrame:CGRectMake(0, 20, kScreen_Width, 44) Items:self.titlesArray showRightButton:NO selectedBlock:^(NSInteger index) {        weakSelf.curSelectIndex=index;        weakCarousel.currentItemIndex=index;        [weakSelf.myCollectionView reloadData];    }];

效果圖:

 

6:補充關于popover這個插件的如果有模態時,它會出現整個屏幕,如果不想要這種效果,可以自個設置一個背景視圖效果,把popover模態效果關掉(self.popover.maskType=DXPopoverMaskTypeNone; //設置默認是否有模態);下面是寫的一個實例:

 

- (void)updateTableViewFrame {    CGRect tableViewFrame = self.tableView.frame;    tableViewFrame.size.width = _popoverWidth;    self.tableView.frame = tableViewFrame;    self.popover.contentInset = UIEdgeInsetsZero;    self.popover.maskType=DXPopoverMaskTypeNone; //設置默認是否有模態    self.popover.backgroundColor = [UIColor whiteColor];}- (void)showPopover {    [self updateTableViewFrame];    [self changeShowing];        CGPoint startPoint =        CGPointMake(CGRectGetMidX(self.btn.frame), CGRectGetMaxY(self.btn.frame) + 5);    [self.popover showAtPoint:startPoint               popoverPostion:DXPopoverPositionDown              withContentView:self.tableView                       inView:self.tabBarController.view];    __weak typeof(self) weakSelf = self;    self.popover.didDismissHandler = ^{        [weakSelf bounceTargetView:weakSelf.btn];    };}//自行增加一個背影層- (UIView *)myTapBackgroundView{    if (!_myTapBackgroundView) {        _myTapBackgroundView = ({            UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 64, [[UIScreen mainScreen] bounds].size.width, [[UIScreen mainScreen] bounds].size.height-64)];            view.backgroundColor = [UIColor clearColor];            UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(changeShowing)];            [view addGestureRecognizer:tap];            view;        });    }    return _myTapBackgroundView;}- (void)changeShowing{    if (self.isShowing) {//隱藏        [UIView animateWithDuration:0.3 animations:^{            self.myTapBackgroundView.backgroundColor = [UIColor colorWithWhite:0 alpha:0];        } completion:^(BOOL finished) {            [self.popover dismiss];            [self.myTapBackgroundView removeFromSuperview];            self.isShowing = NO;        }];    }else{//顯示        [self.view addSubview:self.myTapBackgroundView];        [UIView animateWithDuration:0.3 animations:^{            self.myTapBackgroundView.backgroundColor = [UIColor colorWithWhite:0 alpha:0.2];        } completion:^(BOOL finished) {            self.isShowing = YES;        }];    }}

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色香阁99久久精品久久久| 国产黑人绿帽在线第一区| 激情懂色av一区av二区av| 亚洲丝袜一区在线| 亚洲国产精品推荐| 国产91精品黑色丝袜高跟鞋| 奇门遁甲1982国语版免费观看高清| 91在线观看免费网站| 欧美性猛交xxxx偷拍洗澡| 欧美伦理91i| 欧美大片在线看免费观看| 国产国语刺激对白av不卡| 亚洲国产精品久久久| 亚洲欧美成人精品| 日韩精品日韩在线观看| 琪琪亚洲精品午夜在线| 日韩精品中文字幕视频在线| 欧洲成人性视频| 欧美精品久久久久久久久久| 亚洲自拍偷拍福利| 91精品久久久久久久久不口人| 国产成人aa精品一区在线播放| 亚洲精品国产综合久久| 亚洲第一视频网| 38少妇精品导航| 日韩av成人在线观看| 亚洲国产精品成人一区二区| 北条麻妃一区二区在线观看| 最近2019中文字幕在线高清| 欧美视频免费在线| 亚洲成人精品视频在线观看| 日韩三级影视基地| 国产日韩在线播放| 色妞欧美日韩在线| 欧美成人免费播放| 日韩av日韩在线观看| 自拍偷拍亚洲在线| 欧美成人激情视频| 日韩精品中文字幕有码专区| 免费不卡在线观看av| 成人性生交xxxxx网站| 亚洲免费视频网站| 久久亚洲精品一区| 日韩中文字幕久久| 久久国产精品久久久| 午夜精品久久久99热福利| 日韩欧美国产成人| 欧美午夜电影在线| 欧美wwwxxxx| 日韩av综合网站| 精品成人在线视频| 国产精品第一第二| 欧美寡妇偷汉性猛交| 欧美日韩一区二区三区在线免费观看| 色中色综合影院手机版在线观看| 久久国产精品电影| 久久亚洲精品中文字幕冲田杏梨| 日韩高清电影免费观看完整版| 日本a级片电影一区二区| 91九色蝌蚪国产| 国产精品大陆在线观看| 欧美中在线观看| 久久久精品久久久久| 国产成人中文字幕| 国产精品成人av在线| 国产精品人成电影| 亚洲欧美激情另类校园| 亚洲国产成人精品久久| 欧美日韩免费网站| 日韩经典中文字幕在线观看| 国产精品九九久久久久久久| www.99久久热国产日韩欧美.com| 98精品国产高清在线xxxx天堂| 精品国产乱码久久久久酒店| 亚洲影视中文字幕| 国产精品99久久久久久www| 欧美大片在线看| 在线精品国产成人综合| 成人av电影天堂| 中文字幕亚洲欧美日韩2019| 国产成人一区二区三区小说| 成人有码在线播放| 高清欧美一区二区三区| 日韩精品在线免费播放| 成人激情视频小说免费下载| 在线播放国产一区中文字幕剧情欧美| 欧美精品激情在线| 国产精品免费看久久久香蕉| 98午夜经典影视| 国产精品免费观看在线| 国产午夜一区二区| 日本在线观看天堂男亚洲| 97在线日本国产| 日本中文字幕不卡免费| 狠狠色噜噜狠狠狠狠97| 久久这里只有精品99| 国产99久久精品一区二区| 欧美麻豆久久久久久中文| 人人澡人人澡人人看欧美| 亚洲欧美综合v| 国产精品扒开腿爽爽爽视频| 精品在线小视频| 热99在线视频| 欧美日韩亚洲系列| 亚洲精美色品网站| 日韩欧美一区视频| 国产综合在线看| 欧美大奶子在线| 91成人在线视频| 欧美成人在线网站| 久久99精品久久久久久噜噜| 欧美一级视频一区二区| 国产精品亚洲片夜色在线| 国产精品男女猛烈高潮激情| 亚洲男女自偷自拍图片另类| 日韩暖暖在线视频| 国模私拍一区二区三区| 5566成人精品视频免费| 久久亚洲欧美日韩精品专区| 欧美日韩在线免费观看| 国产日韩专区在线| 国产精品免费久久久| 欧美成人午夜免费视在线看片| 欧美日韩国产精品一区二区三区四区| 亚洲第一精品夜夜躁人人躁| 欧美中文在线字幕| 国产精品成人久久久久| 在线成人激情视频| 欧美一级成年大片在线观看| 亚洲精品av在线播放| 亚洲大胆人体视频| 欧美激情在线一区| 26uuu另类亚洲欧美日本老年| 97人洗澡人人免费公开视频碰碰碰| 色噜噜亚洲精品中文字幕| 国产精品视频大全| 亚洲一区二区免费在线| 久久成人这里只有精品| 夜夜狂射影院欧美极品| 2018国产精品视频| 国产美女直播视频一区| 国产日韩av在线播放| 一本一道久久a久久精品逆3p| 亚洲福利在线播放| 亚洲国产精品99| 欧美综合一区第一页| 欧美精品久久一区二区| 亚洲精品一区二区三区不| 久久久久国色av免费观看性色| 成人激情综合网| 日韩av片永久免费网站| 日韩欧美国产成人| 亚洲第一精品夜夜躁人人爽| 伦伦影院午夜日韩欧美限制| 国产欧美日韩精品在线观看| 久久97精品久久久久久久不卡| 久久这里有精品| 亚洲欧洲国产一区| 亚洲国产精品视频在线观看| 日韩中文av在线| 亚洲第一av网站| 国产成人精品免费久久久久| 中文字幕久久精品| 欧美亚洲国产日本|