iOS综合练习 哈欠阅读

来源:互联网 发布:free源码解析 编辑:程序博客网 时间:2024/04/30 15:29

常用第三方库:

pod "AFNetworking", “3.0.1”
pod 'MJExtension', '~> 3.0.10'   字典模型
pod 'Masonry', '~> 1.0.0'
pod 'SDWebImage', '~> 3.7.5'
pod 'IQKeyboardManager'         键盘
pod 'TZImagePickerController'   相册、拍照


DOPDropDownMenu - Enhanced  下拉菜单

SDAutoLayout   自适应高度宽度

SDCycleScrollView  轮播

SDRefeshView 上拉刷新

LZCartViewController  购物车

涉及知识点:table表偏移量,购物车利用block回传数值,个人资料出生日期选择,选择相册

#import "HomeViewController.h"

#import "SDCycleScrollView.h"

#import "HomeModels.h"

#import "HomeCell.h"

@interface HomeViewController ()<UITableViewDelegate,UITableViewDataSource>{

    NSArray *photoArray;

    SDRefreshFooterView *_refreshFooter;

}

@property (nonatomic,strong)NSArray *dataArray;

@property(nonatomic,retain)UITableView *tableView;

@property (nonatomic,assign)NSInteger rowCount;

@end


@implementation HomeViewController

#pragma mark - 加载数据

- (NSArray *)dataArray{

    if (_dataArray ==nil) {

        //路径

        NSString *path = [[NSBundlemainBundle]pathForResource:@"Books"ofType:@"plist"];

        

        //读取

        NSArray *tempArray = [NSArrayarrayWithContentsOfFile:path];

        

        //可变

        NSMutableArray *mutableArray = [NSMutableArrayarray];

        NSLog(@"%@",mutableArray);

        

        //转换

        for (NSDictionary *dictin tempArray) {

            HomeModels *homeModels = [HomeModelsmj_objectWithKeyValues:dict];

            [mutableArray addObject:homeModels];

            NSLog(@"homeModels = %@",homeModels);

        }

        

        //赋值

        _dataArray = mutableArray;

    }

    return_dataArray;

}


- (void)viewDidLoad {

    [superviewDidLoad];

    self.view.backgroundColor = [UIColorwhiteColor];

    

    self.tableView = [[UITableViewalloc]initWithFrame:self.view.framestyle:UITableViewStylePlain];

    [self.viewaddSubview:self.tableView];


    UIView *headView = [[UIViewalloc]initWithFrame:CGRectMake(0,0,kMainScreenWidth,kMainScreenWidth+kMainScreenHeight/3)];

    self.tableView.tableHeaderView = headView;

    // 本地加载 ---创建不带标题的图片轮播器

    NSArray *imageArray =@[@"DSC_2709.JPG",@"DSC_2792.JPG"];

    SDCycleScrollView *cycleScrollView = [SDCycleScrollViewcycleScrollViewWithFrame:CGRectMake(0,0,kMainScreenWidth,kMainScreenHeight/3)shouldInfiniteLoop:YESimageNamesGroup:imageArray];

    //    cycleScrollView.delegate = self;

//    cycleScrollView.pageControlStyle = SDCycleScrollViewPageContolStyleAnimated;

    [headView addSubview:cycleScrollView];


    //--- 轮播时间间隔,默认1.0秒,可自定义

    //cycleScrollView.autoScrollTimeInterval = 4.0;

    

    //4张图片按钮

    NSArray *btnPhotos =@[@"DSC_2749.JPG",@"DSC_2784.JPG",@"DSC_2794.JPG",@"DSC_2712.JPG"];

    

    for (int i =0; i<4; i++) {

        float x = (i%2)*(kMainScreenWidth/2);

        float y =CGRectGetMaxY(cycleScrollView.frame)+(i/2)*(kMainScreenWidth/2);

        

        UIButton *imageBtn = [[UIButtonalloc]initWithFrame:CGRectMake(x, y,kMainScreenWidth/2,kMainScreenWidth/2)];

        [imageBtn setImage:[UIImageimageNamed:btnPhotos[i]]forState:UIControlStateNormal];

//        imageBtn.backgroundColor = [UIColor orangeColor];

        imageBtn.tag = i;

        [imageBtn addTarget:selfaction:@selector(getImageBtn:)forControlEvents:UIControlEventTouchUpInside];

        [headView addSubview:imageBtn];

    }

    

    self.tableView.delegate =self;

    self.tableView.dataSource =self;

    

//    [self creatModelsWithCount:18];

    _rowCount = (long)6;

    [self.tableViewregisterClass:[HomeCellclass]forCellReuseIdentifier:NSStringFromClass([HomeCellclass])];

    

    __weaktypeof(self) weakSelf =self;

    

    // 上拉加载

    _refreshFooter = [SDRefreshFooterViewrefreshView];

    [_refreshFooteraddToScrollView:self.tableView];

    __weaktypeof(_refreshFooter) weakRefreshFooter =_refreshFooter;

    _refreshFooter.beginRefreshingOperation = ^() {

        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 *NSEC_PER_SEC)),dispatch_get_main_queue(), ^{

//            [weakSelf creatModelsWithCount:10];

            weakSelf.rowCount +=6;

            [weakSelf.tableViewreloadData];

            [weakRefreshFooter endRefreshing];

        });

    };

    [self.tableViewreloadData];

    

}


-(void)getImageBtn:(UIButton *)imageBtn{


}


- (void)cycleScrollView{

    // 本地加载 ---创建不带标题的图片轮播器

    NSArray *imageArray =@[@"DSC_2709.JPG",@"DSC_2749.JPG",@"DSC_2792.JPG"];

    SDCycleScrollView *cycleScrollView = [SDCycleScrollViewcycleScrollViewWithFrame:CGRectMake(0,0,kMainScreenWidth,kMainScreenHeight/3)shouldInfiniteLoop:YESimageNamesGroup:imageArray];

//    cycleScrollView.delegate = self;

    cycleScrollView.pageControlStyle =SDCycleScrollViewPageContolStyleAnimated;

    [self.viewaddSubview:cycleScrollView];

//    [self.view addSubview:cycleScrollView];

//    cycleScrollView.scrollDirection = UICollectionViewScrollDirectionVertical;

    //         --- 轮播时间间隔,默认1.0秒,可自定义

    //cycleScrollView.autoScrollTimeInterval = 4.0;

}


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

#warning Incomplete implementation, return the number of sections

    return1;

}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

#warning Incomplete implementation, return the number of rows

    returnself.dataArray.count;

}


 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

     Class currentClass = [HomeCellclass];

     HomeCell *cell =nil;     

     HomeModels *model =_dataArray[indexPath.row];

     cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass(currentClass)];

     

     cell.model = model; 

 return cell;

}


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

{

    Class currentClass = [HomeCellclass];    

    HomeModels *model =_dataArray[indexPath.row];

    /*

     普通版也可实现一步设置搞定高度自适应,不再推荐使用此套方法,具体参看“UITableView+SDAutoTableViewCellHeight”头文件

     return [self.tableView cellHeightForIndexPath:indexPath model:model keyPath:@"model" cellClass:currentClass];

     */

    

    // 推荐使用此普通简化版方法(一步设置搞定高度自适应,性能好,易用性好)

    return [self.tableViewcellHeightForIndexPath:indexPathmodel:modelkeyPath:@"model"cellClass:currentClasscontentViewWidth:[selfcellContentViewWith]];

}


- (CGFloat)cellContentViewWith

{

    CGFloat width = [UIScreenmainScreen].bounds.size.width;    

    // 适配ios7横屏

    if ([UIApplicationsharedApplication].statusBarOrientation !=UIInterfaceOrientationPortrait && [[UIDevicecurrentDevice].systemVersionfloatValue] < 8) {

        width = [UIScreenmainScreen].bounds.size.height;

    }

    return width;

}



#import "HomeCell.h"

#import "HomeModels.h"

@implementation HomeCell

{

    UILabel *_titleLabel;

    UIImageView *_imageView;

    UILabel *_price;

}


- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier

{

    if (self = [superinitWithStyle:stylereuseIdentifier:reuseIdentifier]) {

        [selfsetup];

    }

    returnself;

}


- (void)setup

{

    _titleLabel = [UILabelnew];

    [self.contentViewaddSubview:_titleLabel];

    _titleLabel.textColor = [UIColordarkGrayColor];

    _titleLabel.font = [UIFontsystemFontOfSize:15];

    _titleLabel.numberOfLines =0;

    

    _imageView = [UIImageViewnew];

    [self.contentViewaddSubview:_imageView];

    _imageView.layer.borderColor = [UIColorgrayColor].CGColor;

    _imageView.layer.borderWidth =1;

    

    _price = [UILabelnew];

    [self.contentViewaddSubview:_price];

    

    CGFloat margin =15;

    UIView *contentView =self.contentView;

    

    _imageView.sd_layout

    .topSpaceToView(contentView, margin)//距离顶

    .leftSpaceToView(contentView, margin)//左边

    .widthIs(60)//宽度长

    .autoHeightRatio (1.2);//高度自适应与宽比例

    

    _titleLabel.sd_layout

    .leftSpaceToView(_imageView, margin)

    .topSpaceToView(contentView, margin)

    .rightSpaceToView(contentView, margin)

    .autoHeightRatio(0);

    

    _price.sd_layout

    .leftSpaceToView(_imageView, margin)

    .bottomEqualToView(_imageView//与图片底平

    .rightSpaceToView(contentView, margin)

    .heightIs(20);

    

    // 当你不确定哪个view在自动布局之后会排布在cell最下方的时候可以调用次方法将所有可能在最下方的view都传过去

    [selfsetupAutoHeightWithBottomViewsArray:@[_imageView,_titleLabel,_price]bottomMargin:margin];

}


- (void)setModel:(HomeModels *)model

{

    _model = model;    

    _titleLabel.text = model.name;

    NSString *str = model.icon;

    _price.text =[NSStringstringWithFormat:@"%ld",model.price];

    _imageView.image = [UIImageimageNamed:str];

}



#import "EnjoyViewController.h"

#import "HomeModels.h"

#import "EnjoyCell.h"

#import "LZCartViewController.h"

#import "ShoppingViewController.h"

#import "LZCartModel.h"

#import "DOPDropDownMenu.h"


@interface EnjoyViewController ()<UITableViewDelegate,UITableViewDataSource,UITableViewDataSource,UISearchBarDelegate,DOPDropDownMenuDelegate,DOPDropDownMenuDataSource>{

    NSArray *photoArray;

    SDRefreshFooterView *_refreshFooter;

    UIView *headerView;

    UISearchBar *searchbar;

    float _oldOffset;//记录上次的偏移量

    UIButton *bubbleBtn;

    NSMutableArray *searchArray;//搜索后数组

}

@property (nonatomic,strong)NSArray *dataArray;

@property(nonatomic,retain)UITableView *tableView;

@property (nonatomic,assign)NSInteger rowCount;

@property (nonatomic,strong)NSMutableArray *selectArray;


//下拉菜单栏使用数组

@property (nonatomic,strong)NSArray *classifys;

@property (nonatomic,strong)NSArray *areas;

@property (nonatomic,strong)NSArray *sorts;

@property (nonatomic,weak)DOPDropDownMenu *menu;


//购物车动画

@property (nonatomic,strong)UIBezierPath *path;//购物车动画轨迹

@property (nonatomic,strong)CALayer *dotLayer;

@property (nonatomic,assign)CGFloat endPointX;

@property (nonatomic,assign)CGFloat endPointY;



@end


@implementation EnjoyViewController


#pragma mark - 加载数据

- (NSArray *)dataArray{

    if (_dataArray ==nil) {

        //路径

        NSString *path = [[NSBundlemainBundle]pathForResource:@"Books"ofType:@"plist"];

        

        //读取

        NSArray *tempArray = [NSArrayarrayWithContentsOfFile:path];

        

        //可变

        NSMutableArray *mutableArray = [NSMutableArrayarray];

        NSLog(@"%@",mutableArray);

        

        //转换

        for (NSDictionary *dictin tempArray) {

            HomeModels *homeModels = [HomeModelsmj_objectWithKeyValues:dict];

            [mutableArray addObject:homeModels];

            NSLog(@"homeModels = %@",homeModels);

        }

        

        //赋值

        _dataArray = mutableArray;

    }

    return_dataArray;

}


-(void)viewWillAppear:(BOOL)animated{

    [superviewWillAppear:animated];

    self.tabBarController.tabBar.hidden = NO;

    

    //刷新下拉菜单栏

    self.classifys =@[@"全部",@"乐享"];

    [_menureloadData];

    

}


- (void)viewDidLoad {

    [superviewDidLoad];

    _selectArray = [NSMutableArrayarray];

    searchArray =[NSMutableArrayarray];

    [searchArraysetArray:self.dataArray];

    _oldOffset =0//记录上次的偏移量

    self.view.backgroundColor = [UIColorwhiteColor];

    self.tableView = [[UITableViewalloc]initWithFrame:CGRectMake(0,74, kMainScreenWidth, kMainScreenHeight)style:UITableViewStylePlain];

    [self.viewaddSubview:self.tableView];

    

    self.tableView.delegate =self;

    self.tableView.dataSource =self;

    

    //搜索框

    [selfsearchBar];

    

    //下拉菜单

    [selfdropDownMenu];


    //悬浮购物车按钮

    [selfaddCarBtn];


    //表尾部视图

    UILabel *footerLb=[[UILabelalloc]initWithFrame:CGRectMake(0,10, kMainScreenWidth,40)];

    footerLb.text =@"已全部加载完成";

    footerLb.textAlignment =NSTextAlignmentCenter;

    footerLb.textColor = [UIColorgrayColor];

    footerLb.layer.borderColor = [UIColorgrayColor].CGColor;

    footerLb.layer.borderWidth =0.5;

    self.tableView.tableFooterView = footerLb;

}


//搜索框

-(void)searchBar{

    searchbar = [[UISearchBaralloc]initWithFrame:CGRectMake(10,64,kMainScreenWidth-20,40)];

    searchbar.delegate =self;

    searchbar.placeholder =@"请输入商品名称关键字";

    searchbar.searchBarStyle =UISearchBarStyleMinimal;

    searchbar.backgroundColor = [UIColorwhiteColor];

    [self.viewinsertSubview:searchbaraboveSubview:self.tableView];

}


//悬浮购物车按钮与提示数量的气泡按钮

- (void)addCarBtn

{

    UIButton *carBtn = [UIButtonnew];

    carBtn.frame =CGRectMake(0,kMainScreenHeight/2,30,30);

    carBtn.layer.cornerRadius =15;

    carBtn.layer.masksToBounds =YES;

    carBtn.alpha =0.7;

    [carBtn setImage:[UIImageimageNamed:@"car"]forState:UIControlStateNormal];

    [carBtn addTarget:selfaction:@selector(clickBtn:)forControlEvents:UIControlEventTouchUpInside];

    [self.viewaddSubview:carBtn];

    

    CGRect rect = carBtn.frame;

    _endPointX = rect.origin.x +15;

    _endPointY = rect.origin.y +15;

    

    //添加气泡

    bubbleBtn = [UIButtonnew];

    bubbleBtn.frame =CGRectMake(20,kMainScreenHeight/2-15,30,30);

    [bubbleBtnsetBackgroundImage:[UIImageimageNamed:@"bubble"]forState:UIControlStateNormal];

    [bubbleBtnsetTitleColor:[UIColorwhiteColor]forState:UIControlStateNormal];

    bubbleBtn.titleLabel.font = [UIFont systemFontOfSize:13];

    [self.viewinsertSubview:bubbleBtnaboveSubview:carBtn];

//    bubbleBtn.contentEdgeInsets = UIEdgeInsetsMake(0, 0, 0, 0);

//    bubbleBtn.center = CGPointMake(0, 0);

    [bubbleBtnsizeToFit];

    bubbleBtn.hidden =YES;


//    bubbleBtn.layer.anchorPoint = CGPointMake(1, 1);

    bubbleBtn.userInteractionEnabled =NO;

}


//下拉菜单

-(void)dropDownMenu{

    // 数据

    self.classifys =@[@"全部",@"乐享"];

    self.areas =@[@"全部距离",@"离我最近",@"<200m",@"500m",@"1000m",@"2000m",@">2000m"];

    self.sorts =@[@"默认排序",@"价格↑",@"价格↓",@"销量↓",@"最新上架"];

    

    // 添加下拉菜单

    DOPDropDownMenu *menu = [[DOPDropDownMenualloc]initWithOrigin:CGPointMake(0,94)andHeight:44];

    menu.delegate =self;

    menu.dataSource =self;

    menu.textSelectedColor = [UIColorredColor];//选中文字颜色

    _menu = menu;


    //将下拉菜单加在View上,重叠于表视图上方

    [self.viewinsertSubview:_menuaboveSubview:self.tableView];

    

    // 创建menu第一次显示不会调用点击代理,可以用这个手动调用

    [menu selectDefalutIndexPath];

}


-(void)clickBtn:(UIButton *)carBtn{

    NSLog(@"---------");

    LZCartViewController *cartVC = [[LZCartViewControlleralloc]init];

    cartVC.shoppingArray = [self.selectArraycopy];   

    // block回调接收传来的购物车中商品数组

    cartVC.block = ^(NSMutableArray *dataCarArray){

        [self.selectArrayremoveAllObjects];//清空上次存放选中商品的数组

        for (int i=0; i<dataCarArray.count; i++) {

            LZCartModel *carModel = [[LZCartModelalloc]init];

            carModel = dataCarArray[i];

            [_selectArrayaddObject:carModel];

        }

        

        //购物车商品类型数值显示与隐藏

        if (_selectArray.count !=0) {

            bubbleBtn.hidden =NO;

            [bubbleBtnsetTitle:[NSStringstringWithFormat:@"%lu",(unsignedlong)self.selectArray.count]forState:UIControlStateNormal];

        }else{

            bubbleBtn.hidden =YES;

        }

        

        NSLog(@"_selectArray%@",_selectArray);

    };

    

    [selfpresentViewController:cartVCanimated:YEScompletion:nil];

}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

#warning Incomplete implementation, return the number of rows

    returnself.dataArray.count;

}



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    Class currentClass = [EnjoyCell class];

    EnjoyCell *cell =nil;

    

    HomeModels *model =_dataArray[indexPath.row];

    

    cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass(currentClass)];

    

    cell.model = model;

    cell.shoppingCar.tag = indexPath.row;

    

    // Block 回调

    __weak__typeof(&*cell) weakCell = cell;

    cell.block = ^(NSInteger nCount){

        

        //购物车动画

        CGRect parentRect = [weakCellconvertRect:weakCell.shoppingCar.frametoView:self.view];

        

        // 这里是动画开始的方法

        [selfjoinCartAnimationWithRect:parentRect];


        //获取选择数据

        LZCartModel *carModel = [[LZCartModelalloc]init];

        carModel.price = [NSStringstringWithFormat:@"%.02f",(double)model.price];

        carModel.nameStr = model.name;

        carModel.image = [UIImageimageNamed:model.icon];

        carModel.goodsId = model.goodsId;

        carModel.number = nCount;

        carModel.dateStr =@"2016.9.1";

        carModel.sizeStr =@"18*20cm";        


        BOOL isSame =NO;//记录是否购物车是否有相同商品

        LZCartModel *models = [[LZCartModelalloc]init];

        for (int i =0; i<self.selectArray.count; i++) {

            models = self.selectArray[i];

            if (models.goodsId == carModel.goodsId){

                carModel.number = models.number;

                carModel.number++; //修改模型中变量值

                self.selectArray[i]= carModel;//修改数组中已有模型值

                isSame = YES;

                return;

            }

        }

        

        if (!isSame) {

            carModel.number =1;

            [self.selectArrayaddObject:carModel];

        }

        

        NSLog(@"%@",self.selectArray);

        

        bubbleBtn.hidden =NO;

        [bubbleBtnsetTitle:[NSStringstringWithFormat:@"%lu",(unsignedlong)self.selectArray.count]forState:UIControlStateNormal];

    };

    return cell;

}


//当用户选择某一行时

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    ShoppingViewController *shoppingVC = [[ShoppingViewControlleralloc]init];

    //获取选择的内容


    HomeModels *homeModel =_dataArray[indexPath.row];

    shoppingVC.bookName = homeModel.name;

    shoppingVC.bookImage = homeModel.icon;

    shoppingVC.price = homeModel.price;

    shoppingVC.intro =homeModel.intro;

    [self.navigationControllerpushViewController:shoppingVCanimated:YES];


//    [self presentViewController:shoppingVC animated:YES completion:nil];

    

}


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

{

    Class currentClass = [EnjoyCell class];

    

    HomeModels *model =_dataArray[indexPath.row];

    

    /*

     普通版也可实现一步设置搞定高度自适应,不再推荐使用此套方法,具体参看“UITableView+SDAutoTableViewCellHeight”头文件

     return [self.tableView cellHeightForIndexPath:indexPath model:model keyPath:@"model" cellClass:currentClass];

     */

    

    // 推荐使用此普通简化版方法(一步设置搞定高度自适应,性能好,易用性好)

    return [self.tableViewcellHeightForIndexPath:indexPathmodel:modelkeyPath:@"model"cellClass:currentClasscontentViewWidth:[selfcellContentViewWith]];

}


- (CGFloat)cellContentViewWith

{

    CGFloat width = [UIScreenmainScreen].bounds.size.width;

    

    // 适配ios7横屏

    if ([UIApplicationsharedApplication].statusBarOrientation !=UIInterfaceOrientationPortrait && [[UIDevicecurrentDevice].systemVersionfloatValue] < 8) {

        width = [UIScreenmainScreen].bounds.size.height;

    }

    return width;

}


#pragma mark - DOPDropDownMenu

//设置列数

- (NSInteger)numberOfColumnsInMenu:(DOPDropDownMenu *)menu

{

    return3;

}


//设置每列几行

- (NSInteger)menu:(DOPDropDownMenu *)menu numberOfRowsInColumn:(NSInteger)column

{

    if (column ==0) {

        returnself.classifys.count;

    }elseif (column ==1){

        returnself.areas.count;

    }else {

        returnself.sorts.count;

    }

}


//返回 menucolumn每行title

- (NSString *)menu:(DOPDropDownMenu *)menu titleForRowAtIndexPath:(DOPIndexPath *)indexPath

{

    if (indexPath.column ==0) {

        returnself.classifys[indexPath.row];

    } elseif (indexPath.column ==1){

        returnself.areas[indexPath.row];

    } else {

        returnself.sorts[indexPath.row];

    }

}


//点击菜单时响应

- (void)menu:(DOPDropDownMenu *)menu didSelectRowAtIndexPath:(DOPIndexPath *)indexPath

{

    NSLog(@"点击了 %ld - %ld项目",indexPath.column,indexPath.row);

}


#pragma mark - scrollViewDelegate

//导航栏、搜索框、商品列表显示与隐藏

- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView {

    NSUInteger options =UIViewAnimationOptionAllowUserInteraction |UIViewAnimationCurveEaseIn;

    NSLog(@"_oldOffset22222%f",_oldOffset);

    if (self.tableView.contentOffset.y  > 0 )  {

        [UIViewanimateKeyframesWithDuration:0.1fdelay:0.0options:optionsanimations:^{

            

            self.navigationController.navigationBarHidden = YES;

            searchbar.transform =CGAffineTransformTranslate(searchbar.transform,0, -148);//能够多次变化,每次变化都是以上一次的状态进行的变化

            self.menu.transform =CGAffineTransformTranslate(self.menu.transform,0, -148);

            self.tableView.frame = CGRectMake(0,-54,kMainScreenWidth,kMainScreenHeight);

        } completion:^(BOOL finished) {

        }];

    }

    if (self.tableView.contentOffset.y  <  _oldOffset)  { //与上次偏移量进行比较

        [UIViewanimateKeyframesWithDuration:0.1fdelay:0.0options:optionsanimations:^{

            self.navigationController.navigationBarHidden = NO;

            searchbar.transform =CGAffineTransformMakeTranslation(0,0);

            self.menu.transform = CGAffineTransformMakeTranslation(0,0);

            self.tableView.frame = CGRectMake(0,74,kMainScreenWidth, kMainScreenHeight);

        } completion:^(BOOL finished) {

        }];

    }

    _oldOffset = scrollView.contentOffset.y;//将当前位移变成缓存位移

    NSLog(@"_oldOffset%f",_oldOffset);


}


#pragma mark -加入购物车动画

-(void) joinCartAnimationWithRect:(CGRect)rect

{

    CGFloat startX = rect.origin.x;

    CGFloat startY = rect.origin.y;

    

    _path= [UIBezierPathbezierPath];

    [_pathmoveToPoint:CGPointMake(startX, startY)];

    //三点曲线

    [_pathaddCurveToPoint:CGPointMake(_endPointX,_endPointY)

             controlPoint1:CGPointMake(startX, startY)

             controlPoint2:CGPointMake(startX-180, startY -200)];

    

    _dotLayer = [CALayerlayer];

    _dotLayer.backgroundColor = [UIColorredColor].CGColor;

    _dotLayer.frame =CGRectMake(0,0,15,15);

    _dotLayer.cornerRadius = (15 +15) /4;

    [self.view.layeraddSublayer:_dotLayer];

    [selfgroupAnimation];

    

}


#pragma mark - 组合动画

-(void)groupAnimation

{

    CAKeyframeAnimation *animation = [CAKeyframeAnimationanimationWithKeyPath:@"position"];

    animation.path =_path.CGPath;

    animation.rotationMode =kCAAnimationRotateAuto;

    

    CABasicAnimation *alphaAnimation = [CABasicAnimationanimationWithKeyPath:@"alpha"];

    alphaAnimation.duration =0.5f;

    alphaAnimation.fromValue = [NSNumbernumberWithFloat:1.0];

    alphaAnimation.toValue = [NSNumbernumberWithFloat:0.1];

    alphaAnimation.timingFunction = [CAMediaTimingFunctionfunctionWithName:kCAMediaTimingFunctionEaseOut];

    

    CAAnimationGroup *groups = [CAAnimationGroupanimation];

    groups.animations =@[animation,alphaAnimation];

    groups.duration =0.8f;

    groups.removedOnCompletion =NO;

    groups.fillMode =kCAFillModeForwards;

    groups.delegate =self;

    [groups setValue:@"groupsAnimation"forKey:@"animationName"];

    [_dotLayeraddAnimation:groupsforKey:nil];

    

    [selfperformSelector:@selector(removeFromLayer:)withObject:_dotLayerafterDelay:0.8f];    

}


//移聊购物车动画

- (void)removeFromLayer:(CALayer *)layerAnimation{

    

    [layerAnimation removeFromSuperlayer];

}


#pragma mark - UISearchBarDelegate

//监听搜索框内容变化

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{

    [self.dataArrayremoveAllObjects];

    

    for (int i =0; i<searchArray.count; i++) {

        HomeModels *models = [[HomeModelsalloc]init];

        models = searchArray[i];

        NSPredicate *predicate = [NSPredicatepredicateWithFormat:@"SELF CONTAINS[c] %@", searchText];

        BOOL ret = [predicateevaluateWithObject:models.name];//判断是否包含

        if (ret) {

            [self.dataArrayaddObject:models];

        }

    }

    [self.tableViewreloadData];

}


//添加搜索框事件:

-(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{

    [searchBar setShowsCancelButton:YESanimated:YES];

//    self.tableView.allowsSelection=NO;

//    self.tableView.scrollEnabled=NO;

}


//添加Cancel事件:

-(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{

    searchBar.text=@"";

    [searchBar setShowsCancelButton:NOanimated:YES];

    [searchBar resignFirstResponder];

    [self.dataArrayremoveAllObjects];

    [self.dataArrayaddObjectsFromArray:searchArray];

    [self.tableViewreloadData];

//    self.tableView.allowsSelection=YES;君主论会

//    self.tableView.scrollEnabled=YES;

}




#import "PersonalDataViewController.h"

#import "PersonalModels.h"

#import "PersonalCell.h"

@interface PersonalDataViewController ()<UITableViewDelegate,UITableViewDataSource,UITextFieldDelegate,UIPickerViewDelegate,UIPickerViewDataSource,UIActionSheetDelegate>{

    UITableView *tableView;

    NSDictionary *userDic;

    NSArray *pickerData;

    

    UIImage *iconImage;//头像

    NSString *name; //昵称

    NSString *iphoneNumber; //登录的手机号

    NSString *birthday; //出生日期

    NSString *gender; //性别

    NSString *signature; //签名

    

    NSString *iphoneN; //变更手机号

    NSString *password; //支付密码

}

@property(retain,nonatomic)UIDatePicker *datePicker;


@end


@implementation PersonalDataViewController


- (void)viewDidLoad {

    [superviewDidLoad];

    self.navigationItem.title =@"个人资料";

    self.view.backgroundColor = [UIColorgrayColor];

    

    tableView = [[UITableViewalloc]init];

    [self.viewaddSubview:tableView];

    tableView.delegate =self;

    tableView.dataSource =self;

    tableView.sd_layout

    .topEqualToView(self.view)

    .leftEqualToView(self.view)

    .rightEqualToView(self.view)

    .heightIs(kMainScreenHeight);

    

    //设置假数据

    [selfuserDic];


    //读取假数据

    PersonalModels *model = [PersonalModelsmj_objectWithKeyValues:userDic];

    iconImage = [UIImageimageNamed:model.iconImage];

    name = model.name;

    iphoneNumber = model.iphoneNumber;

    birthday = model.birthday;

    gender = model.gender;

    signature = model.signature;

    iphoneN = model.iphoneN;

    password = model.password;    

}


//设置数据

-(void)userDic{

    PersonalModels *model = [PersonalModelsnew];

    model.iconImage =@"tab_btn_user_nor";

    model.iphoneNumber =@"13770937387";

    model.gender =@"";

    

    userDic = [NSDictionarydictionary];

    userDic = [modelmj_keyValues];

}


-(void)exit{

    [self.navigationControllerpopViewControllerAnimated:YES];

}


#pragma mark - UItableViewDataSoure

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{

    return3;

}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    switch (section) {

        case0:

            return6;

            break;

        case1:

            return2;

            break;

        case2:

            return1;

            break;

        default:

            break;

    }

    return0;

}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    staticNSString *cellID =@"cell";

    PersonalCell *cell = [[PersonalCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:cellID];

    cell.accessoryType =UITableViewCellAccessoryDisclosureIndicator;//箭头

    if (indexPath.section ==0) {

        switch (indexPath.row) {

            case0:

                cell.contentLb.text =@"头像";

                cell.iconImage.image =iconImage;

                cell.iconImage.backgroundColor = [UIColorwhiteColor];

                cell.iconImage.layer.cornerRadius =30;

                cell.iconImage.layer.masksToBounds =YES;

                cell.iconImage.layer.borderWidth =0.5;

                cell.iconImage.layer.borderColor = [UIColorblackColor].CGColor;                      [cell.titileTFremoveFromSuperview];

                break;

            case1:

                cell.contentLb.text =@"昵称";

                cell.titileTF.text =name;

                cell.titileTF.tag =100;

                break;

            case2:

                cell.contentLb.text =@"登录手机号";

                cell.titileTF.text =iphoneNumber;

                cell.titileTF.tag =200;

                break;

            case3:

                cell.contentLb.text =@"出生日期";

                cell.titileTF.text =birthday;

                cell.titileTF.tag =300;

                break;

            case4:

                cell.contentLb.text =@"性别";

                cell.titileTF.text =gender;

                cell.titileTF.tag =400;

                break;

            case5:

                cell.contentLb.text =@"个性签名";

                cell.titileTF.text =signature;

                cell.titileTF.tag =500;

                break;

            default:

                break;

        }

    }elseif (indexPath.section ==1 ){

        switch (indexPath.row) {

            case0:

                cell.contentLb.text =@"变更手机号";

                cell.titileTF.text =iphoneN;

                cell.titileTF.tag =700;

                break;

            case1:

                cell.contentLb.text =@"设置支付密码";

                cell.titileTF.text =password;

                cell.titileTF.tag =800;

                break;

            default:

                break;

        }

    }else

    {

        cell.accessoryType =UITableViewCellAccessoryNone;

        UIButton *exitBtn = [[UIButtonalloc]initWithFrame:CGRectMake(30,10,kMainScreenWidth-60,40)];

        [exitBtn setTitle:@"退出"forState:UIControlStateNormal];

        exitBtn.backgroundColor = [UIColorgreenColor];

        [exitBtn addTarget:selfaction:@selector(exit)forControlEvents:UIControlEventTouchUpInside];

        [cell.contentViewaddSubview:exitBtn];

        return cell;

    }

    cell.titileTF.delegate =self;

    return cell;

}


//当用户选择某一行时

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    if (indexPath.section ==0 &&indexPath.row ==0) {

        //创建一个对话框对象

        UIAlertController *alert =[UIAlertControlleralertControllerWithTitle:nilmessage:nilpreferredStyle:UIAlertControllerStyleActionSheet];        

        //创建按钮

        UIAlertAction *ok = [UIAlertActionactionWithTitle:@"拍照或照片图库"style:UIAlertActionStyleDefaulthandler:^(UIAlertAction *_Nonnull action) {

            TZImagePickerController  *imagePC = [[TZImagePickerControlleralloc]initWithMaxImagesCount:1delegate:self];

            [imagePC setDidFinishPickingPhotosHandle:^(NSArray<UIImage *> *photos, NSArray *assets,BOOL isSelectOriginalPhoto) {

                iconImage = photos[0];

                [tableView reloadData];

            }];

            [selfpresentViewController:imagePCanimated:YEScompletion:nil];

        }];        

        //创建取消按钮

        UIAlertAction *cancle = [UIAlertActionactionWithTitle:@"取消"style:UIAlertActionStyleCancelhandler:nil];

        

        //把这两个按钮添加到提示框中

        [alert addAction:ok];

        [alert addAction:cancle];

        

        //弹出提示框

        [selfpresentViewController:alertanimated:YEScompletion:nil];

    }    

}


#pragma mark TZImagePickerControllerDelegate

// 用户点击了取消

- (void)imagePickerControllerDidCancel:(TZImagePickerController *)picker {    

}


// 用户选择好了图片,如果assets非空,则用户选择了原图。

- (void)imagePickerController:(TZImagePickerController *)picker didFinishPickingPhotos:(NSArray *)photos sourceAssets:(NSArray *)assets isSelectOriginalPhoto:(BOOL)isSelectOriginalPhoto {  

}


// 用户选择好了视频

- (void)imagePickerController:(TZImagePickerController *)picker didFinishPickingVideo:(UIImage *)coverImage sourceAssets:(id)asset {

}


#pragma mark - textFieldDelegate

- (void)textFieldDidBeginEditing:(UITextField *)textField{

    if (textField.tag ==100) {

        //        textField =nickNameTextFd;

    }elseif (textField.tag ==300){

        //出生日期

        UIDatePicker *datePicker=[[UIDatePickeralloc]initWithFrame:CGRectMake(0,kMainScreenHeight-400,0,0)];

        _datePicker = datePicker;

        // 只显示时间

        datePicker. datePickerMode =UIDatePickerModeDate ;

        // 显示中文

        datePicker. locale = [NSLocalelocaleWithLocaleIdentifier :@"zh" ];

        // 设置弹出日期视图

        textField.inputView = datePicker;

        // 监听值得改变

        [datePicker addTarget:selfaction:@selector(datePickerValueChanged:)forControlEvents:UIControlEventValueChanged];

    }elseif (textField.tag ==400) {

        //性别

        UIPickerView *pickerView = [[UIPickerViewalloc]initWithFrame:CGRectMake(0,kMainScreenHeight-400,0,0)];

        pickerView.delegate =self;

        pickerView.dataSource =self;

        pickerView.showsSelectionIndicator =YES;

        pickerView.tag =100;

        //设置弹出视图(不弹键盘弹图片)

        textField.inputView = pickerView;

        //获取plist文件路径,两种方式

        NSArray *dataArray = [[NSArrayalloc]initWithObjects:@"",@"",nil];

        pickerData = dataArray;

    }

}


#pragma mark - datePicker

- ( void )datePickerValueChanged:(UIDatePicker *)datePicker

{

    NSDateFormatter *formatter = [[NSDateFormatteralloc ]init ];

    // 格式化日期格式

    formatter. dateFormat =@"yyyy-MM-dd" ;

    NSString *date = [formatterstringFromDate :datePicker.date ];

    // 显示时间

    birthday = date;

    [tableViewreloadData];//刷新表格

}


#pragma mark - PickerView

//列数

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{

    if (pickerView.tag ==300) {

        return3;

    }else{

        return1;

    }

}


//行数

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{

    return [pickerDatacount];

}


//返回当前行的内容,此处是将数组中数值添加到滚动的那个显示栏上

- (nullableNSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{

    return [pickerDataobjectAtIndex:row];

}


//选择行事件,监听轮子的移动

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component

{

    if (pickerView.tag ==100) {

    //性别

    NSInteger row =[pickerViewselectedRowInComponent:0];

    NSString *selected = [pickerDataobjectAtIndex:row];

        gender =selected;

    }

    [tableViewreloadData];//刷新表格

}


//设置section底部的高度

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{

    if (section ==2) {

        return100;

    }

    return0;

}


//设置section头部的高度

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{

    return10;

}


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

{

    if (indexPath.section ==0 &&indexPath.row == 0) {

        return70;

    }

    return44;

}

  


0 0