使用UITableView实现图片视差效果
视差效果如下:
原理:
根据偏移量计算不同的移动速度,so easy!
// // RootTableViewController.h // TableView // // Copyright (c) 2014年 Y.X. All rights reserved. // #import <UIKit/UIKit.h> @interface RootTableViewController : UITableViewController @end
// // RootTableViewController.m // TableView // // Copyright (c) 2014年 Y.X. All rights reserved. // #import "RootTableViewController.h" #import "ImageCell.h" #import "UIImage+ImageEffects.h" #import "FrameAccessor.h" #define IMAGE [UIImage imageNamed:@"girl"] #define IMAGE_HEIGHT [IMAGE scaleWithFixedWidth:320.f].size.height @interface RootTableViewController ()<UIScrollViewDelegate> @property (nonatomic, strong) ImageCell *showImageCell; @property (nonatomic, strong) UIImage *rootImage; @end @implementation RootTableViewController - (void)viewDidLoad { [super viewDidLoad]; _rootImage = [IMAGE scaleWithFixedWidth:320.f]; } #pragma mark - Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { // Return the number of sections. return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // Return the number of rows in the section. return 10; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.row == 0) { static NSString *reusedLableImage = @"Image"; ImageCell *cell = [tableView dequeueReusableCellWithIdentifier:reusedLableImage]; if (cell == nil) { cell = [[ImageCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reusedLableImage]; } _showImageCell = cell; cell.showImageView.image = _rootImage; cell.showImageView.viewSize = _rootImage.size; return cell; } else { static NSString *reusedLableOne = @"Normal"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reusedLableOne]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reusedLableOne]; cell.backgroundColor = [UIColor whiteColor]; cell.textLabel.text = @"YouXianMing"; cell.textLabel.font = [UIFont fontWithName:@"HelveticaNeue-Thin" size:20.f]; } return cell; } } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { // 返回图片高度 if (indexPath.row == 0) { return [IMAGE scaleWithFixedWidth:320.f].size.height; } return 70; } - (void)scrollViewDidScroll:(UIScrollView *)scrollView { // 防止出现bug if (scrollView.contentOffset.y <= 0) { _showImageCell.layer.masksToBounds = NO; } else { _showImageCell.layer.masksToBounds = YES; } // 计算偏移量 _showImageCell.showImageView.y \ = calculateSlope(0, 0, 200, 100)*scrollView.contentOffset.y + calculateConstant(0, 0, 200, 100); } CGFloat calculateSlope(CGFloat x1, CGFloat y1, CGFloat x2, CGFloat y2) { return (y2 - y1) / (x2 - x1); } CGFloat calculateConstant(CGFloat x1, CGFloat y1, CGFloat x2, CGFloat y2) { return (y1*(x2 - x1) - x1*(y2 - y1)) / (x2 - x1); } @end
// // ImageCell.h // TableView // // Copyright (c) 2014年 Y.X. All rights reserved. // #import <UIKit/UIKit.h> @interface ImageCell : UITableViewCell @property (nonatomic, strong) UIImageView *showImageView; @end
// // ImageCell.m // TableView // // Copyright (c) 2014年 Y.X. All rights reserved. // #import "ImageCell.h" #import "FrameAccessor.h" @implementation ImageCell - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if (self) { _showImageView = [[UIImageView alloc] init]; _showImageView.frame = (CGRect){CGPointZero, CGSizeZero}; [self addSubview:_showImageView]; } return self; } @end
好吧,止足于这种效果的话就太简单了,来点复杂的:)
// // RootTableViewController.h // TableView // // Copyright (c) 2014年 Y.X. All rights reserved. // #import <UIKit/UIKit.h> @interface RootTableViewController : UITableViewController @end
// // RootTableViewController.m // TableView // // Copyright (c) 2014年 Y.X. All rights reserved. // #import "RootTableViewController.h" #import "ImageCell.h" #import "UIImage+ImageEffects.h" #import "FrameAccessor.h" #define IMAGE [UIImage imageNamed:@"girl"] #define IMAGE_HEIGHT [IMAGE scaleWithFixedWidth:320.f].size.height @interface RootTableViewController ()<UIScrollViewDelegate> @property (nonatomic, strong) ImageCell *showImageCell; @property (nonatomic, strong) UIImage *rootImage; @property (nonatomic, strong) UIImage *rootBlurImage; @end @implementation RootTableViewController - (void)viewDidLoad { [super viewDidLoad]; _rootImage = [IMAGE scaleWithFixedWidth:320.f]; _rootBlurImage = [[IMAGE scaleWithFixedWidth:320.f] grayScale]; } #pragma mark - Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { // Return the number of sections. return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // Return the number of rows in the section. return 10; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.row == 0) { static NSString *reusedLableImage = @"Image"; ImageCell *cell = [tableView dequeueReusableCellWithIdentifier:reusedLableImage]; if (cell == nil) { cell = [[ImageCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reusedLableImage]; } _showImageCell = cell; cell.showImageView.image = _rootImage; cell.showImageView.viewSize = _rootImage.size; cell.showBlurImageView.image = _rootBlurImage; cell.showBlurImageView.viewSize = _rootBlurImage.size; return cell; } else { static NSString *reusedLableOne = @"Normal"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reusedLableOne]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reusedLableOne]; cell.backgroundColor = [UIColor whiteColor]; cell.textLabel.text = @"YouXianMing"; cell.textLabel.font = [UIFont fontWithName:@"HelveticaNeue-Thin" size:20.f]; } return cell; } } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { // 返回图片高度 if (indexPath.row == 0) { return [IMAGE scaleWithFixedWidth:320.f].size.height; } return 70; } - (void)scrollViewDidScroll:(UIScrollView *)scrollView { // 防止出现bug if (scrollView.contentOffset.y <= 0) { _showImageCell.layer.masksToBounds = NO; } else { _showImageCell.layer.masksToBounds = YES; } // 计算偏移量 _showImageCell.showImageView.y \ = calculateSlope(0, 0, 200, 100)*scrollView.contentOffset.y + calculateConstant(0, 0, 200, 100); // 计算偏移量 _showImageCell.showBlurImageView.y \ = calculateSlope(0, 0, 200, 100)*scrollView.contentOffset.y + calculateConstant(0, 0, 200, 100); // 计算偏移量 _showImageCell.showBlurImageView.alpha \ = calculateSlope(0, 0, 200, 1)*scrollView.contentOffset.y + calculateConstant(0, 0, 200, 1); } CGFloat calculateSlope(CGFloat x1, CGFloat y1, CGFloat x2, CGFloat y2) { return (y2 - y1) / (x2 - x1); } CGFloat calculateConstant(CGFloat x1, CGFloat y1, CGFloat x2, CGFloat y2) { return (y1*(x2 - x1) - x1*(y2 - y1)) / (x2 - x1); } @end
// // ImageCell.h // TableView // // Copyright (c) 2014年 Y.X. All rights reserved. // #import <UIKit/UIKit.h> @interface ImageCell : UITableViewCell @property (nonatomic, strong) UIImageView *showImageView; @property (nonatomic, strong) UIImageView *showBlurImageView; @end
// // ImageCell.m // TableView // // Copyright (c) 2014年 Y.X. All rights reserved. // #import "ImageCell.h" #import "FrameAccessor.h" @implementation ImageCell - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if (self) { _showImageView = [[UIImageView alloc] init]; _showImageView.frame = (CGRect){CGPointZero, CGSizeZero}; [self addSubview:_showImageView]; _showBlurImageView = [[UIImageView alloc] init]; _showBlurImageView.frame = (CGRect){CGPointZero, CGSizeZero}; _showBlurImageView.alpha = 0.f; [self addSubview:_showBlurImageView]; } return self; } @end
就是这么简单:)