UIScrollView视觉差动画

169 阅读1分钟
#import "ViewController.h"
#import "HHAnimationView.h"

#define screen_W ([UIScreen mainScreen].bounds.size.width)
#define screen_H ([UIScreen mainScreen].bounds.size.height)
#define scrollView_W screen_W
#define animationViewTag 1000
#define AnimationOffset 100//动画偏移量 是指rightView相对于leftView的偏移量

@interface ViewController ()<UIScrollViewDelegate>

@property (strong, nonatomic) UIScrollView *scrollView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self.navigationController setNavigationBarHidden:YES animated:NO];
    [self.view addSubview:self.scrollView];
}

- (UIScrollView *)scrollView {
    if (!_scrollView) {
        _scrollView = [[UIScrollView alloc] init];
        _scrollView.frame = CGRectMake(0, 100, screen_W, 400);
        _scrollView.delegate = self;
        _scrollView.pagingEnabled = YES;
        _scrollView.contentSize = CGSizeMake(screen_W * 4, 400);
        _scrollView.bounces = NO;
        _scrollView.showsHorizontalScrollIndicator = NO;
        _scrollView.showsHorizontalScrollIndicator = NO;
        for (NSInteger i = 0; i < 4 ; i++) {
            HHAnimationView *animationView = [[HHAnimationView alloc] initWithFrame:CGRectMake(i * scrollView_W, 0, scrollView_W, 400)];
            animationView.imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%ld",i]];
            [_scrollView addSubview:animationView];
            animationView.tag = animationViewTag + i;
        }
    }
    return _scrollView;
}


- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGFloat x = scrollView.contentOffset.x;
    NSInteger leftIndex = x/scrollView_W;
    
    //这里的left和right是区分拖动中可见的两个视图
    HHAnimationView *leftView = [scrollView viewWithTag:(leftIndex + animationViewTag)];
    HHAnimationView *rightView = [scrollView viewWithTag:(leftIndex + 1 + animationViewTag)];
    
    rightView.contentX = -(scrollView_W - AnimationOffset) + (x - (leftIndex * scrollView_W))/scrollView_W * (scrollView_W - AnimationOffset);
    leftView.contentX = ((scrollView_W - AnimationOffset) + (x - ((leftIndex + 1) * scrollView_W))/scrollView_W * (scrollView_W - AnimationOffset));
}

@end