用UIScrollView产生视差效果

效果:

高级效果:

源码:

MoreInfoView.h  +  MoreInfoView.m

//
//  MoreInfoView.h
//  YXCell
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface MoreInfoView : UIView

@property (nonatomic, strong) UIImageView *imageView;

@end
//
//  MoreInfoView.m
//  YXCell
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "MoreInfoView.h"

@implementation MoreInfoView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        CGRect rect = frame;
        self.layer.borderWidth = 0.5f;
        self.layer.borderColor = [UIColor blackColor].CGColor;
        self.layer.masksToBounds = YES;

        _imageView = [[UIImageView alloc] initWithFrame:CGRectMake(-50, 0,
                                                                   rect.size.width + 50*2,
                                                                   rect.size.height)];
        [self addSubview:_imageView];
    }
    return self;
}

@end

RootViewController.m

//
//  RootViewController.m
//  YXCell
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "RootViewController.h"
#import "MoreInfoView.h"

@interface RootViewController ()<UIScrollViewDelegate>

@property (nonatomic, strong) UIScrollView  *scrollView;
@property (nonatomic, assign) CGFloat        k;
@property (nonatomic, assign) CGFloat        b;

@end

@implementation RootViewController

- (void)linearFunctionPointA:(CGPoint)pointA
                      pointB:(CGPoint)pointB
{
    CGFloat x1 = pointA.x; CGFloat y1 = pointA.y;
    CGFloat x2 = pointB.x; CGFloat y2 = pointB.y;

    _k = calculateSlope(x1, y1, x2, y2);
    _b = calculateConstant(x1, y1, x2, y2);
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor blackColor];

    // 计算斜率
    [self linearFunctionPointA:CGPointMake(0, -50)
                        pointB:CGPointMake(320, 270)];

    _scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
    _scrollView.delegate      = self;
    _scrollView.pagingEnabled = YES;
    [self.view addSubview:_scrollView];

    NSArray *picArray = @[[UIImage imageNamed:@"1"],
                          [UIImage imageNamed:@"2"],
                          [UIImage imageNamed:@"3"],
                          [UIImage imageNamed:@"4"],
                          [UIImage imageNamed:@"5"]];

    [picArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        MoreInfoView *show =         [[MoreInfoView alloc] initWithFrame:CGRectMake(idx*self.view.bounds.size.width, 0,
                                                       self.view.bounds.size.width,
                                                       self.view.bounds.size.height)];
        show.imageView.image = obj;

        [_scrollView addSubview:show];
    }];

    _scrollView.contentSize = CGSizeMake(picArray.count*self.view.bounds.size.width,
                                         self.view.bounds.size.height);
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGFloat X = scrollView.contentOffset.x;

    [scrollView.subviews enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        MoreInfoView *tmp = obj;

        if ([tmp isKindOfClass:[MoreInfoView class]])
        {
            // 产生视差效果
            CGRect rect = tmp.imageView.frame;
            rect.origin.x = _k * (X - idx*320) + _b;
            tmp.imageView.frame = rect;
        }
    }];
}

// 计算用
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

需要注意的地方:

1. 这个地方的值不是随便设定的哦:)

2. 修改那个270的值来达到上图显示的各种效果

3. 下面的X - idx*320也是非常关键的哦

用UIScrollView产生视差效果

时间: 2024-10-27 11:27:01

用UIScrollView产生视差效果的相关文章

OCiOS动效设计:UITableView 实现滚动视差效果

前言 最近在使用'悦跑圈'这个App,其'跑鞋展厅'功能的滚动视差效果深深地吸引了我,在网上搜罗了大量的资料,如下,我将仿照该效果简单介绍实现方法. 效果演示 细节实现 OffsetImageCell.m - (void)cellOffset { // 1.获取cell在屏幕中的rect CGRect centerToWindow = [self convertRect:self.bounds toView:self.window]; // 2.获取cell中心点y轴坐标 CGFloat cen

使用UITableView实现图片视差效果

视差效果如下: 原理: 根据偏移量计算不同的移动速度,so easy! // // RootTableViewController.h // TableView // // Copyright (c) 2014年 Y.X. All rights reserved. // #import <UIKit/UIKit.h> @interface RootTableViewController : UITableViewController @end // // RootTableViewContro

基于Parallax设计HTML视差效果

年关将至,给大家拜年. 最近时间充裕了一点,给大家介绍一个比较有意思的控件:Parallax.它可以用来实现鼠标移动时,页面上的元素也做偏移的视差效果.在一些有表现层次,布局空旷的页面上,用来做Head最合适不过了,大家可以看这个官方Demo. 一.准备工作 如果不想用cdn的话,就下载 1.在github上下载parallax 2.下载jquery 二.实现效果 这里只介绍最简单的使用方法,先上代码: 1 <!DOCTYPE html> 2 <html> 3 <head&g

网页固定背景交替实现视差效果

视差滚动效果近年来很受大家的欢迎,但实现这个功能一般都需要javaScript,而且实现做起来有一定的难度.就这个问题,我们跟大家分享另外一种比较简单的视差滚动效果技术,只需要CSS就可以实现了.一起来看看吧. 该滚动效果特点是使用固定背景与色块内容交替,当访客向下滚动时,背景是fixed固定的.可学习HTML高级教程了解. 从上图可以看出,内容向上滚动时,第一张背景是固定的,不会跟着向上滚动.即:固定背景 + 色块内容 + 固定背景 + 色块内容…这样的交替方式,从而产生视差效果. 兼容性 I

使用NestedScrollView+ViewPager+RecyclerView+SmartRefreshLayout打造酷炫下拉视差效果并解决各种滑动冲突

使用NestedScrollView+ViewPager+RecyclerView+SmartRefreshLayout打造酷炫下拉视差效果并解决各种冲突 如果你还在为处理滑动冲突而发愁,那么你需要静下心来看看这边文章,如果你能彻底理解这篇文章中使用的技术,那么,一切滑动冲突的问题解决起来就轻而易举了:先扔一个最终实现的效果图 先分析下效果图中实现的功能点 顶部下拉时背景图形成视差效果 上拉时标题栏透明切换显示 底部实现TabLayout+ViewPager+Fragment+RecyclerV

Swift - 用UIScrollView实现视差动画效果

效果 源码 https://github.com/YouXianMing/Swift-Animations // // MoreInfoView.swift // Swift-Animations // // Created by YouXianMing on 16/8/18. // Copyright © 2016年 YouXianMing. All rights reserved. // import UIKit class MoreInfoView: UIView { var imageV

Unity3d游戏开发之主场景视差效果开发心得

效果图 分析 什么是视差滚动?度娘的解释:让多层背景以不同的速度移动,形成立体的运动效果.从效果图可以看出,主场景背景大致分为3层,草地.山河还有云彩,每一层的速度都不一样.接着分析,虽然度娘的解释是以速度来阐述,但用速度来计算并不合适,因为主层(即草地层)的滚动是跟随我们手指的移动,所以应该把速度转换为位移来计算.既然用位移来计算,每一层的位移不同,怎么样才能把多个层同步起来,我使用了归一化方法,把整个场景的滚动看作是0~1之间的归一化位移,每个层的滚动只需乘以各自层的最大位移.有了归一化位移

仿QQ空间视差效果,ListView.setHeader( )

根据listview的手指移动事件,动态设置listview上面的图片的宽高,并在手指放开的时候 实现图片的动画(随时间变化的动画值) ValueAnimator.ofInt ( ) import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Bitmap; import android.util.AttributeSet; import android.util.

视差效果原理 background-attachment:fixed

<html> <head> <style type="text/css"> body { background-image:url('http://images2015.cnblogs.com/blog/441096/201610/441096-20161013163910781-1393436376.jpg'); background-repeat:no-repeat; background-attachment:fixed; background