今天在写动画库的时候,突然想起来以前做一个美文软件 首页动画的时候,处理的很糟糕(那是年轻),实现上拉下拉切换的时候,是一直的创建新的ImageView ,remove旧的,这样很吃资源。
所以今天我就把那个动画重写了个Demo,源码就放在这里了,一直是两个ImageView之间切换,重用,写的很仓促,也没时间在这里码字了,简单的注释了下,你们凑合看,我弄了个gif,效果就那样吧。
接口是随便找的一个,我把添加点击手势去除掉了,做相关跳转的话,自行添加。
导入两个库。
1.AFnetWorking
2.sdWebImage
//
// ViewController.m
// YYAnimation
//
// Created by JackYang on 15/10/13.
// Copyright © 2015年 JackYang. All rights reserved.
//
#import "ViewController.h"
#import "AFNetworking.h"
#import "UIImageView+WebCache.h"
#define RANDOM_COLOR [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1]
#define kScreen_W [UIScreen mainScreen].bounds.size.width
#define kScreen_H [UIScreen mainScreen].bounds.size.height
#define FIRST_W kScreen_W-2*PADDING
#define FIRST_H (FIRST_W)*4/3
#define PADDING 40
#define kFirstUrl @"http://api.meitianapp.com/api/v1/articles?filter=isHomepage&start=0&limit=50"
typedef enum {
ADD,
SUB
}myType;
@interface ViewController ()
{
UIImageView * oneImageView;
UIImageView * anotherImageView;
}
@property UIImageView * firstView;
@property UIImageView * secondView;
@property NSMutableArray * dataSource;
@property AFHTTPRequestOperationManager * manager;
@property BOOL isFirstViewTop;
@property int index;//判断是数组第几位
@property BOOL canUp;
@property BOOL canDown;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor blackColor];
[self fetchData];
[self createUI];
// Do any additional setup after loading the view, typically from a nib.
}
//实验性获取数据。
-(void)fetchData{
self.index = 0;
self.canUp = YES;
self.canDown = NO;
self.dataSource = [NSMutableArray array];
NSString * url = @"http://wenyijcc.com/services/wenyiapp/noteshandler.ashx?action=catalog";
_manager = [AFHTTPRequestOperationManager manager];
_manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"];
[_manager GET:url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSArray * ary = responseObject[@"datas"];
for (NSDictionary * dict in ary) {
NSArray * arr = dict[@"ImageList"];
NSDictionary * dicc = arr[0];
NSString * url = dicc[@"ImageUrl"];
[self.dataSource addObject:url];
}
[self.firstView sd_setImageWithURL:[NSURL URLWithString:self.dataSource[_index]]];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@",error);
}];
}
-(void)createUI{
self.firstView = [[UIImageView alloc]init];
self.firstView.userInteractionEnabled = YES;
self.secondView = [[UIImageView alloc]init];
self.secondView.userInteractionEnabled = YES;
self.firstView.frame = CGRectMake(PADDING, PADDING, FIRST_W, FIRST_H);
self.secondView.frame = CGRectMake(2*PADDING, 2*PADDING, FIRST_W-4*PADDING, FIRST_H-4*PADDING);
self.firstView.backgroundColor = RANDOM_COLOR;
self.secondView.backgroundColor = RANDOM_COLOR;
[self addgesture:self.firstView];
[self addgesture:self.secondView];
[self.view addSubview:self.secondView];
[self.view addSubview:self.firstView];
//[self.view bringSubviewToFront:self.firstView];
self.isFirstViewTop = YES;
}
//获取当前index
-(int)getindex:(myType)type{
if(type == ADD){
if(self.index<self.dataSource.count-2){
_canUp = YES;
_canDown = YES;
return ++self.index;
}
else if(self.index == self.dataSource.count-2){
_canUp = NO;
_canDown = YES;
return ++self.index;
}
return (int)self.dataSource.count-1;
}
else if(type == SUB){
if(_index > 1){
_canUp = YES;
_canDown = YES;
return --self.index;
}
else if (_index == 1){
_canDown = NO;
_canUp =YES;
return --self.index;
}
else{
_canUp = YES;
_canDown = NO;
return 0;
}
}
return 0;
}
//加载图片
-(UIImageView *)getImageWithIndex:(myType)type withImageVew:(UIImageView *)imageView{
int a = [self getindex:type];
NSLog(@"%d",a);
NSString * url = self.dataSource[a];
[imageView sd_setImageWithURL:[NSURL URLWithString:url]];
return imageView;
}
//添加手势
- (void)addgesture:(UIImageView*)imageView{
UISwipeGestureRecognizer *upGesture = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeUp:)];
upGesture.direction = UISwipeGestureRecognizerDirectionUp;
UISwipeGestureRecognizer *downGesture = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeDown:)];
downGesture.direction = UISwipeGestureRecognizerDirectionDown;
//添加点击手势,
// UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(detailPage:)];
[imageView addGestureRecognizer:upGesture];
[imageView addGestureRecognizer:downGesture];
// [imageView addGestureRecognizer:tapGesture];
}
//上推
-(void)swipeUp:(UISwipeGestureRecognizer*)swipe{
if (self.canUp) {
[self arrangeImageViews:CGRectMake(2*PADDING, 2*PADDING, FIRST_W-2*PADDING, FIRST_H-2*PADDING)andAlpha:1 andType:ADD];
[UIView animateWithDuration:0.5 animations:^{
oneImageView.frame = CGRectMake(PADDING, PADDING-600, FIRST_W, FIRST_H);
oneImageView.alpha = 0;
}completion:^(BOOL finished) {
[self.view bringSubviewToFront:anotherImageView];
}];
[UIView animateWithDuration:0.5 animations:^{
anotherImageView.frame = CGRectMake(PADDING, PADDING, FIRST_W, FIRST_H);
}];
}
}
//排列图片
-(void)arrangeImageViews:(CGRect)rect andAlpha:(int)p andType:(myType)type{
if(self.isFirstViewTop){
oneImageView = _firstView;
anotherImageView = _secondView;
}
else{
oneImageView = _secondView;
anotherImageView = _firstView;
}
self.isFirstViewTop = !self.isFirstViewTop;
//[self.view bringSubviewToFront:oneImageView];
anotherImageView.frame = rect;
anotherImageView.alpha = p;
[self getImageWithIndex:type withImageVew:anotherImageView];
anotherImageView.backgroundColor = RANDOM_COLOR;
}
//下拉
-(void)swipeDown:(UISwipeGestureRecognizer*)swipe{
if(self.canDown){
[self arrangeImageViews:CGRectMake(2*PADDING, 2*PADDING-600, FIRST_W-2*PADDING, FIRST_H-2*PADDING) andAlpha:00. andType:SUB];
[self.view bringSubviewToFront:anotherImageView];
[UIView animateWithDuration:0.5 animations:^{
anotherImageView.frame = CGRectMake(PADDING, PADDING, FIRST_W, FIRST_H);
anotherImageView.alpha = 1;
}completion:^(BOOL finished) {
}];
[UIView animateWithDuration:0.5 animations:^{
oneImageView.frame = CGRectMake(2*PADDING, 2*PADDING, FIRST_W-2*PADDING, FIRST_H-2*PADDING);
}];
}
}
@end