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

根据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 = 1000,
    kPictureTag   = 2000,

} 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 * 3, 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(0, 0, 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(0, 0, Width / 3.f, 1.f)];
    self.redView.backgroundColor = [UIColor redColor];
    [self.titlesContentView addSubview:self.redView];

    self.computingValuesArray = [NSMutableArray array];
    self.titles               = @[@"Google", @"DeepMind", @"AlphaGo"];
    self.pictures             = @[@"1", @"2", @"3"];
    for (int i = 0; i < self.titles.count; i++) {

        // Setup pictures.
        UIImageView *imageView        = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 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 / 3.f, 0, Width / 3.f, self.titlesContentView.height)];
        titleView.title            = self.titles[i];
        titleView.tag              = kTitleViewTag + i;
        [titleView buildSubViews];
        [self.titlesContentView addSubview:titleView];

        // Init values.
        if (i == 0) {

            titleView.inputValue = 1.f;
            imageView.alpha      = 1.f;

        } else {

            titleView.inputValue = 0.f;
            imageView.alpha      = 0.f;
        }

        // Setup ScrollComputingValues.
        ScrollComputingValue *value = [ScrollComputingValue new];
        value.startValue            = -Width + i * Width;
        value.midValue              = 0      + 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 / 3.f;

    for (int i = 0; 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

细节

 

时间: 2024-09-21 02:20:12

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

jquery根据锚点offset值实现动画切换

 下面分享一个小技巧,根据锚点offset值来实现动画切换   01 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 02 <html xmlns="http://www.w3.org/1999/xhtml"> 03 <he

jquery根据锚点offset值实现动画切换_javascript技巧

锚点相信大家都使用过吧!点击后僵硬的切换是不是很不爽呢? 下面分享一个小技巧,根据锚点offset值来实现动画切换 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml

iOS开发中使用UIScrollView实现无限循环的图片浏览器_IOS

一.概述 UIKit框架中有大量的控件供开发者使用,在iOS开发中不仅可以直接使用这些控件还可以在这些控件的基础上进行扩展打造自己的控件.在这个系列中如果每个控件都介绍一遍确实没有必要,所谓授人以鱼不如授人以渔,这里会尽可能让大家明白其中的原理,找一些典型的控件进行说明,这样一来大家就可以触类旁通.今天我们主要来看一下UIScrollView的内容: UIView UIScrollView 实战--图片浏览器 二.UIView 在熟悉UIScrollView之前很有必要说一下UIView的内容.

UIScrollView的属性总结

                        属性                                                            作用 CGPoint contentOffSet                                                  监控目前滚动的位置 CGSize contentSize                                                        滚动范围的大

UIScrollView 和 UIPageControl 实现启动滑动图

一.使用NSUserDefaults 判断滑动图有没有出现过,加载滑动图 NSUserDefaults 简介: NSUserDefaults可以将数据永久的保存在手机中,他是一个单例,用起来很方便,所以很适合用于保存简单的数据和为数据做标记. 更多的关于NSUserDefaults的介绍请看:NSUserDefaults 简介 你可以选择在AppDelegate.m中的didFinishLaunchingWithOptions 方法或者"初始界面"(加载的第一个viewControll

iOS - UIScrollView

前言 NS_CLASS_AVAILABLE_IOS(2_0) @interface UIScrollView : UIView <NSCoding> @available(iOS 2.0, *) public class UIScrollView : UIView, NSCoding 移动设备的屏幕大小是极其有限的,因此直接展示在用户眼前的内容也相当有限.当展示的内容较多,超出一个屏幕时,用户可通过滚动手势来查看屏幕以外的内容.普通的 UIView 不具备滚动功能,不适合显示过多的内容,UIS

动画

概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画.关键帧动画.动画组.转场动画,如何通过UIView的装饰方法对这些动画操作进行简化等.在今天的文章里您可以看到动画操作在iOS中是如何简单和高效,很多原来想做但是苦于没有思路的动画在iOS中将变得越发简单: CALayer CALayer简介 CALayer常用属性 CALayer绘图 Core Animat

React实现动画效果

流畅.有意义的动画对于移动应用用户体验来说是非常必要的.和React Native的其他部分一样,动画API也还在积极开发中,不过我们已经可以联合使用两个互补的系统:用于全局的布局动画LayoutAnimation,和用于创建更精细的交互控制的动画Animated. Animated Animated库使得开发者可以非常容易地实现各种各样的动画和交互方式,并且具备极高的性能.Animated仅关注动画的输入与输出声明,在其中建立一个可配置的变化函数,然后使用简单的start/stop方法来控制动

UILabel混合显示动画效果

UILabel混合显示动画效果   效果   源码 https://github.com/YouXianMing/Animations // // MixedColorProgressViewController.m // Animations // // Created by YouXianMing on 16/1/5. // Copyright 2016年 YouXianMing. All rights reserved. // #import "MixedColorProgressView