使用UITableView实现图片视差效果

使用UITableView实现图片视差效果

使用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

就是这么简单:)

 

 

 

你可能感兴趣的:(UITableView)