根据UIScrollView的contentOffset值精确控制动画

效果

原理

根据方程精确计算每一个view在位移值x变化的时候的输出值,并根据这个值实现各种逻辑。

源码

https://github.com/YouXianMing/Animations

//
// ScrollViewAnimationController.m
// Animations
//
// Created by YouXianMing on 16/3/13.
// Copyright © 2016年 YouXianMing. All rights reserved.
// #import "ScrollViewAnimationController.h"
#import "UIView+SetRect.h"
#import "ScrollComputingValue.h"
#import "ScrollTitleView.h" typedef enum : NSUInteger { kTitleViewTag = ,
kPictureTag = , } EScrollViewAnimationControllerValue; @interface ScrollViewAnimationController () <UIScrollViewDelegate> @property (nonatomic, strong) UIScrollView *scrollView;
@property (nonatomic, strong) UIView *redView;
@property (nonatomic, strong) UIView *titlesContentView; @property (nonatomic, strong) NSMutableArray *computingValuesArray;
@property (nonatomic, strong) NSArray *titles;
@property (nonatomic, strong) NSArray *pictures; @end @implementation ScrollViewAnimationController - (void)setup { [super setup]; self.scrollView = [[UIScrollView alloc] initWithFrame:self.contentView.bounds];
self.scrollView.contentSize = CGSizeMake(self.contentView.width * , self.contentView.height);
self.scrollView.pagingEnabled = YES;
self.scrollView.bounces = NO;
self.scrollView.showsHorizontalScrollIndicator = NO;
self.scrollView.delegate = self;
[self.contentView addSubview:self.scrollView]; self.titlesContentView = [[UIView alloc] initWithFrame:CGRectMake(, , Width, TabbarHeight)];
self.titlesContentView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.65f];
self.titlesContentView.userInteractionEnabled = NO;
self.titlesContentView.bottom = self.contentView.height;
[self.contentView addSubview:self.titlesContentView]; self.redView = [[UIView alloc] initWithFrame:CGRectMake(, , Width / .f, .f)];
self.redView.backgroundColor = [UIColor redColor];
[self.titlesContentView addSubview:self.redView]; self.computingValuesArray = [NSMutableArray array];
self.titles = @[@"Google", @"DeepMind", @"AlphaGo"];
self.pictures = @[@"", @"", @""];
for (int i = ; i < self.titles.count; i++) { // Setup pictures.
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(, , self.contentView.width, self.contentView.height)];
imageView.image = [UIImage imageNamed:_pictures[i]];
imageView.contentMode = UIViewContentModeScaleAspectFill;
imageView.tag = kPictureTag + i;
imageView.layer.masksToBounds = YES;
[self.contentView addSubview:imageView]; // Setup TitleViews.
ScrollTitleView *titleView = [[ScrollTitleView alloc] initWithFrame:CGRectMake(i * Width / .f, , Width / .f, self.titlesContentView.height)];
titleView.title = self.titles[i];
titleView.tag = kTitleViewTag + i;
[titleView buildSubViews];
[self.titlesContentView addSubview:titleView]; // Init values.
if (i == ) { titleView.inputValue = .f;
imageView.alpha = .f; } else { titleView.inputValue = .f;
imageView.alpha = .f;
} // Setup ScrollComputingValues.
ScrollComputingValue *value = [ScrollComputingValue new];
value.startValue = -Width + i * Width;
value.midValue = + i * Width;
value.endValue = +Width + i * Width;
[value makeTheSetupEffective];
[self.computingValuesArray addObject:value];
} [self.contentView bringSubviewToFront:self.titlesContentView];
} - (void)scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat offsetX = scrollView.contentOffset.x;
_redView.x = offsetX / .f; for (int i = ; i < _titles.count; i++) { ScrollTitleView *titleView = [_titlesContentView viewWithTag:kTitleViewTag + i];
UIImageView *imageView = [self.contentView viewWithTag:kPictureTag + i];
ScrollComputingValue *value = _computingValuesArray[i]; value.offsetValue = offsetX;
titleView.inputValue = value.outputValue;
imageView.alpha = value.outputValue;
}
} @end

细节

根据UIScrollView的contentOffset值精确控制动画的更多相关文章

  1. 【WPF学习笔记】之如何设置下拉框读取SqlServer数据库的值:动画系列之(一)

    先前条件:设置好数据库,需要三个文件CommandInfo.cs.DbHelperSQL.cs.myHelper.cs,需要修改命名空间,参照之前随笔http://www.cnblogs.com/Ow ...

  2. UIScrollView 原理详解

    转载此文章原因:web页面在ipad的app中总是有橡皮筋效果,使用iscroll虽然能解决橡皮筋想过,但是滚动层内的元素事件都无法触发.故同安卓和ios一样使用后台解决...红色的为解决方案.. S ...

  3. iOS - UIScrollView

    前言 NS_CLASS_AVAILABLE_IOS(2_0) @interface UIScrollView : UIView <NSCoding> @available(iOS 2.0, ...

  4. iOS开发UIScrollView的底层实现

    起始 做开发也有一段时间了,经历了第一次完成项目的激动,也经历了天天调用系统的API的枯燥,于是就有了探索底层实现的想法. 关于scrollView的思考 在iOS开发中我们会大量用到scrollVi ...

  5. 第二、UIScrollView的使用大全

    UIScrollView UIPageControl 的使用 2011-11-19 16:48 4690人阅读 评论(0) 收藏 举报 imagescrollspringiphone // //    ...

  6. [转]IOS 学习笔记(8) 滚动视图(UIScrollView)的使用方法

    下面介绍pageControl结合ScrollView实现连续滑动翻页的效果,ScrollView我们在应用开发中经常用到,以g这种翻页效果还是很好看的,如下图所示: 通过这个例子,我们重点学习UIS ...

  7. iOS基础 - UIScrollView

    一.UIScrollView使用引导思路. 1.之前我们所学的显示图片是用UIImageView 2.将UIImageView添加到根视图中,不显示的原因:没有设置位置 3.当图片比屏幕大时,直接放在 ...

  8. 【iOS系列】-UIScrollView的介绍及结合UIPageControl实现图片播放的实例

    [iOS系列]-UIScrollView的介绍及结合UIPageControl实现图片播放的实例 第一:UIScrollView的常用属性 //表示UIScrollView内容的尺寸,滚动范围 @pr ...

  9. 学习笔记之-------UIScrollView 基本用法 代理使用

    //contentSize.contentInset和contentOffset 是 scrollView三个基本的属性. // 滚动 self.ScrollView.contentSize =sel ...

随机推荐

  1. 20165203 Mypwd的解读与实现

    20165203 Mypwd的解读与实现 pwd 含义:在Linux层次结构中,想要知道当前所处的目录,可以用pwd命令,该命令显示整个路径名. 语法:pwd [option] 描述:pwd 命令将当 ...

  2. 前端如何在h5页面调用微信支付?

    在微信服务号开发的时候经常会遇到微信支付的功能实现,通过实际经验自己总结了一下,前端在H5页面调起微信支付有两种办法,一是利用内置对象,二是通过引用微信的js sdk,亲测都能支付成功,从写法上来看用 ...

  3. Scala 学习笔记(1)之入门篇

    Scala is pronounced skah-lah. Scala 全称为 scalable language,是一种面向对象(object)- 函数式(functional)静态类型(stati ...

  4. LINQ基本语句

    一.什么是LINQ 1.定义:LINQ是Language Integrate Query的缩写,它在对象和数据之间建立一种对应关系,可以使用访问内存对象的方式查询数据集合. 2.特点:由于LINQ中查 ...

  5. 【LOJ】#2110. 「JLOI2015」管道连接

    题解 我们先跑一个斯坦纳树出来 斯坦纳树是什么,是一个包含点集里的点联通所需要的最小的价值,显然他们联通的方式必然是一棵树 我们可以设一个状态为\(dis[i][S]\)表示以第i个点为根,点集为\( ...

  6. Redis集群主从复制(一主两从)搭建配置教程【Windows环境】

    如何学会在合适的场景使用合适的技术方案,这值得思考. 由于本地环境的使用,所以搭建一个本地的Redis集群,本篇讲解Redis主从复制集群的搭建,使用的平台是Windows,搭建的思路和Linux上基 ...

  7. [ 转载 ] Android JNI(一)——NDK与JNI基础

    Android JNI(一)——NDK与JNI基础 隔壁老李头 关注  4.4 2018.05.09 17:15* 字数 5481 阅读 11468评论 8喜欢 140 本系列文章如下: Androi ...

  8. ios网络编程(入门级别)-- 基础知识

    在学习ios的过程中,停留在UI控件很长时间,现在正在逐步的接触当中!!!!!!在这个过程中,小编学到了一些关于网络编程知识,并且有感而发,在此分享一下: 关于网络请求的重要性我想不用多说了吧!!!对 ...

  9. 「WC 2019」数树

    「WC 2019」数树 一道涨姿势的EGF好题,官方题解我并没有完全看懂,尝试用指数型生成函数和组合意义的角度推了一波.考场上只得了 44 分也暴露了我在数数的一些基本套路上的不足,后面的 \(\ex ...

  10. js的sort()方法

    说明 如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序.要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较. arra ...