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

就是这么简单:)

时间: 2025-01-30 06:14:12

使用UITableView实现图片视差效果的相关文章

使用CSS3来实现滚动视差效果的教程

  "视差(parallax)"效果现在在互联网上越来越流行了.如果你还没听说过什么是视差效果,它其实就是利用图片形成不同的层,分别以不同的速度,不同的方向移动产生的效果.这会产生出很奇妙的视觉效果,能有力的吸引住浏览者的目光. 观看演示 在web设计中,最常见的实现视差效果的方式是使用jQuery插件.但这种方法有一些弊端.这些插件大多都是在window对象的scroll事件上放置监听器.这会导致JavaScript需要处理大量的事件触发(处理scroll事件很容易造成浏览器性能问题

再分享70+免费的jquery 图片滑块效果插件和教程_jquery

jQuery Slider插件一般是由滑块与滑动按钮组成,也有一些带暂停和继续按钮的.一般使用的Slider滑块插件,按照展示方式,可以分为两种:一种是为水平滑动:另一种是垂直滑动.当然具体的特效就有很多种了,不一一解释了.大部分的都是一些类似幻灯片的效果,也有带视差效果的.实现方式也大都是基于jQuery+html5+CSS3,大部分插件的兼容性都不错. 之前其实已经分享过28款免费实用的 JQuery 图片和内容滑块插件,但是今天发现之前的草稿里面也存了一些不错的jQuery插件,而且数量还

Android实现有视差效果的ListView_Android

视差效果是什么? 所谓的视差效果在Web设计和移动应用中都非常常见,我们在一些主要的平台都可以发现它的身影,从Windows Phone到iOS乃至Android.按照维基百科的说法,视差滚动是计算机图形学中的一种特殊的滚动技术,在此相机移动背景图像比前景图像慢,从而引起了视觉深度的假象. 那么到底什么是视差效果呢?一起来看效果图就知道了: 我们可以看到 ListView 的 HeaderView 会跟随 ListView 的滑动而变大,HeaderView里的图片会有缩放效果.这些可以使用属性

不通过JavaScript实现的自动滚动视差效果_经验交流

这个效果是仿照Chirs Coyier的视差教程实现的,经过Chirs的允许使用了其中的星空背景. 运行效果:在这里观看:http://www.fofronline.com/experiments/parallax/该效果可以在Safari 4 Beta和Google Chrome中正常预览,实现该效果无需JavaScript.(但是在IE7及以下版本中无法观看) 实现方法:这个页面的HTML代码非常简单,通过一个div来定义背景,另一个div来定义内容,这里使用了CSS3中的多重背景技术,所以

Android实现有视差效果的ListView

视差效果是什么? 所谓的视差效果在Web设计和移动应用中都非常常见,我们在一些主要的平台都可以发现它的身影,从Windows Phone到iOS乃至Android.按照维基百科的说法,视差滚动是计算机图形学中的一种特殊的滚动技术,在此相机移动背景图像比前景图像慢,从而引起了视觉深度的假象. 那么到底什么是视差效果呢?一起来看效果图就知道了: 我们可以看到 ListView 的 HeaderView 会跟随 ListView 的滑动而变大,HeaderView里的图片会有缩放效果.这些可以使用属性

ImageZoom 图片放大效果(扩展篇)

上一篇ImageZoom 已经对图片放大效果做了详细的分析,这次在ImageZoom的基础上进行扩展,实现更多的效果. 主要扩展了原图和显示框的展示模式,有以下几种模式: "follow" 跟随模式:显示框能跟随鼠标移动的效果: "handle" 拖柄模式:原图上有一个拖柄来标记显示范围: "cropper" 切割模式:原图用不透明的来标记显示范围,其他部分用半透明显示: "handle-cropper" 拖柄切割模式:拖柄模

jQuery实例教程:jQuery网页图片切换效果

文章简介:假设你有一组作品,你想不用转跳到另外一个页面就可以显示多个图片,你可以将JPG图片载入到目标元素中去.下面是jQuery图片切换效果示例. 假设你有一组作品,你想不用转跳到另外一个页面就可以显示多个图片,你可以将JPG图片载入到目标元素中去.下面是jQuery图片切换效果示例: 该示例的核心jQuery代码: $(document).ready(function() { $("h2").append("<em></em>") $(&

PPT图片切换效果研究PPT图片切换效果研究

有很多朋友都会问PPT里有大量的图片,那么如何才更好的去展示呢?我个人觉得方法有很多,而且要分清楚你的PPT所要应用的场合,那么今天借用<PPT图片切换效果研究>一文来讲解一下PPT图片切换的新思路. 现在进入正题,了解iPhone的朋友都知道其图片的浏览切换效果是非常出色的,不了解的或者没有iPhone的同志可以和我一样泪奔一下.好啦好啦,接着说,PPT中也经常会有连续图片的展示我们不妨来模拟一下iPhone的图片切换效果,虽然只用了切入切出的效果,是非常非常简单的效果,但一定会给你的PPT

jQuery+CSS制作的图片展示效果

jQuery+CSS的图片展示效果,可以拖动图片,兼容浏览器,可以做成个人相册或者作品展示 摆放效果 点击效果 Dome Download