欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS应用新特性界面

程序员文章站 2022-03-23 14:00:49
// // xtxguideviewcontroller.m // 新特性界面 // // copyright ? 2016年 longchuang. all rights...

iOS应用新特性界面
iOS应用新特性界面
iOS应用新特性界面

//
//  xtxguideviewcontroller.m
//  新特性界面
//
//  copyright ? 2016年 longchuang. all rights reserved.
//

#import "xtxguideviewcontroller.h"
// 1.导入第三方框架
#import "masonry.h"
// 2.导入视图头文件
#import "xtxguideview.h"
#define xtximagecount  4
// 自定义sb视图类
@interface xtxguideviewcontroller ()

@end

@implementation xtxguideviewcontroller

- (void)viewdidload {
    [super viewdidload];
    // do any additional setup after loading the view.

    // 设置主背景图片
    [self setupui];

    [self addguideview];

}

-(void)setupui
{
    // 创建主界面图片
    uiimageview *imageview = [[uiimageview alloc]init];

    // 添加图片
    imageview.image = [uiimage imagenamed:@"cozy-control-car"];

    // 设置图片填充模式
    imageview.contentmode = uiviewcontentmodescaleaspectfit;

    // 添加到父控件
     [self.view addsubview:imageview];

    // 给imageview添加约束,添加约束前imageview一定要被添加到父控件上
    [imageview mas_makeconstraints:^(masconstraintmaker *make) {
        [make center];
        make.width.equalto(self.view.mas_width);
        make.height.equalto(self.view.mas_height);
    }];
}

-(nsarray *)loaddata
{
    // 根据图片数量开辟对应大小的空间
    nsmutablearray *arrm = [nsmutablearray arraywithcapacity:xtximagecount];
    // 读取图片名字

    for (nsinteger i = 1; i <=xtximagecount; i++) {
        nsstring *imagename = [nsstring stringwithformat:@"common_h%zd.jpg",i];
        [arrm addobject:imagename];
    }
    return arrm;
}

-(void)addguideview
{
    // 创建自定义界面,并同时创建滚动视图
    // self = guide view controller
    xtxguideview *guideview = [[xtxguideview alloc]initwithframe:self.view.bounds];
    // 此处暂未使用数据模型保存数据
    guideview.imagename = [self loaddata];

    [self.view addsubview:guideview];
}

@end
//  xtxguideview.h
//  新特性界面
//
//  copyright ? 2016年 longchuang. all rights reserved.
//
#import 
@interface xtxguideview : uiview
// 用于接收控制界面传过来的数据
@property(nonatomic,strong)nsarray *imagename;
@end
//
//  xtxguideview.m
//  新特性界面
//
//  copyright ? 2016年 longchuang. all rights reserved.
//

#import "xtxguideview.h"
#import "masonry.h"
@interface xtxguideview()

// 滚动视图
@property(nonatomic,weak)uiscrollview *scrollview;
// 翻页控制器
@property(nonatomic,weak)uipagecontrol *pagecontrol;

@end

@implementation xtxguideview

// 创建自定义view视图的时候,同时创建scrollview
-(instancetype)initwithframe:(cgrect)frame
{
    self = [super initwithframe:frame];
    if (self) {
        [self setupui];
    }
    return self;
}


-(void)setupui
{
    uiscrollview *scrollview = [[uiscrollview alloc]initwithframe:self.bounds];
    [self  addsubview:scrollview];
    self.scrollview = scrollview;
    // 隐藏两个滑动条
    scrollview.showsverticalscrollindicator = no;
    scrollview.showshorizontalscrollindicator = no;

    // 设置分页
    scrollview.pagingenabled = yes;

    // 关闭弹簧效果
    scrollview.bounces =yes;

    // 设置scrollview代理
    scrollview.delegate = self;

    // 创建分页指示器
    uipagecontrol *pagecontrol = [[uipagecontrol alloc]init];

    // 给属性赋值
    self.pagecontrol = pagecontrol;


    // 设置当前页
    pagecontrol.currentpage = 0;

    // 设置其他页的颜色
    pagecontrol.pageindicatortintcolor = [uicolor blackcolor];

    // 设置当前页的颜色
    pagecontrol.currentpageindicatortintcolor = [uicolor yellowcolor];

    // 把分页指示器添加到自定义视图上不要加在scrollview上
    [self addsubview:pagecontrol];

    // 设置分页指示器的偏移
    [pagecontrol mas_makeconstraints:^(masconstraintmaker *make) {
        // 设置x与父物体x对齐
        [make centerx];
        // 下部向上偏移20
        make.bottom.offset(-20);
    }];

    // 设置分页指示器不能点击
    pagecontrol.enabled = no;
}

// 控制器视图中通过model层的保存的数据给view层赋值的时候,调用改set方法
-(void)setimagename:(nsarray *)imagename
{
    _imagename = imagename;
    for (nsinteger i = 0 ; i < imagename.count; i++) {
        uiimageview *imageview = [[uiimageview alloc]init];
        // uiimageview的图片以及大小
        imageview.frame = cgrectoffset(self.bounds, i*self.bounds.size.width, 0);
        imageview.image = [uiimage imagenamed:imagename[i]];
        [self.scrollview addsubview:imageview];
        // 开启交互
        imageview.userinteractionenabled = yes;
        // 添加按钮
        [self makeloadmorebtn:imageview];

    }
    // 多出一页,用于显示主页面,为其增加可滑动的条件
    self.scrollview.contentsize = cgsizemake((imagename.count + 1) * self.bounds.size.width, 0);

    // 三 设置分页指示器的总个数
    self.pagecontrol.numberofpages = imagename.count;
}


// 添加按钮
- (void)makeloadmorebtn:(uiimageview *)imageview {
    // 1.创建按钮
    uibutton *loadmorebtn = [[uibutton alloc] init];
    // 2.设置图片
    [loadmorebtn setimage:[uiimage imagenamed:@"common_more_black"] forstate:uicontrolstatenormal];
    [loadmorebtn setimage:[uiimage imagenamed:@"common_more_white"] forstate:uicontrolstatehighlighted];

    // 3.添加到父控件上
    [imageview addsubview:loadmorebtn];
    // 让按钮的尺寸根据图片的大小自适应
    [loadmorebtn sizetofit];

    // 4.给加载更多按钮添加约束
    [loadmorebtn mas_makeconstraints:^(masconstraintmaker *make) {
        make.right.offset(-20);
        make.bottom.offset(-50);
    }];


    // 5.给加载更多按钮添加监听事件
    [loadmorebtn addtarget:self action:@selector(loadmorebtnclick:) forcontrolevents:uicontroleventtouchupinside];

}
#pragma mark - 加载更多按钮监听方法
- (void)loadmorebtnclick:(uibutton *)btn {
    // 1.把当前被点击的加载更多按钮隐藏
    btn.hidden = yes;
    // 2.动画的方式让imageview放大及完全透明
    [uiview animatewithduration:0.2 animations:^{
        // 让按钮的父控件,也就当前点击的按钮所在的imageview放大
        btn.superview.transform = cgaffinetransformmakescale(2, 2);
        // 让imageview透明
        btn.superview.alpha = 0;
    } completion:^(bool finished) {
        // 让新特性界面自定义视图直接从父控件上移除
        // 3.动画完成之后把自定义的新特性view直接从父控件中移除
        [self removefromsuperview];
    }];




}

#pragma mark - uiscrollviewdelegate
// 正在滚动中一直会调用此方法
- (void)scrollviewdidscroll:(uiscrollview *)scrollview {

    cgfloat page = scrollview.contentoffset.x / scrollview.bounds.size.width;
    // 当新的一页已经出来一大半就让分页指示器显示到新的一页
    nsinteger pageno = page + 0.4999;
    self.pagecontrol.currentpage = pageno;

    // 把当前的页数设置给scrollview的tag
    scrollview.tag = pageno;

    self.pagecontrol.hidden = (pageno == _imagename.count);
}

#pragma mark - 手动拖拽并且有降速过程,降速完成之后就会来调用此方法
- (void)scrollviewdidenddecelerating:(uiscrollview *)scrollview {

    // 如果滚动到最后一页并停在了空白的这一页上时,把自定义新特性界面移除
    if (scrollview.tag == _imagename.count) {
        [self removefromsuperview];
    }
}
@end