前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >UIScrollView视觉差动画

UIScrollView视觉差动画

作者头像
且行且珍惜_iOS
发布于 2018-05-22 09:29:01
发布于 2018-05-22 09:29:01
72400
代码可运行
举报
运行总次数:0
代码可运行

前言:看到凤凰新闻 头条栏目的编辑推荐新闻是这个效果,觉得不错,就想着实现一下,以下就是我的实现过程,示例代码请看这儿→UIScrollView视觉差动画

总效果

一、首先实现一个基本的图集浏览功能,如下图

该功能太基础,直接先贴一个UIScrollView,然后几个UIImageView啪啪啪往UIScrollView上面一扔.......Over,不在此啰嗦咯。

普通的浏览效果.gif

二、分析动画效果,提出解决方案

注意:这里的left和right是区分拖动中可见的两个视图。

    1. 分析效果

由总效果图和第一步的普通的浏览效果图对比可以看出,在拖拽过程中,第一步中的普通效果图是图片之间首尾相连,当前(left)的图片尾部连接下一个(right)的图片首部;而目标总效果图中的是图片之间首首相连,尾尾相连,且滑动过程中,当前可见的图片有渐进的裁剪效果;前者就像是平铺在一起的一行书,一块儿左右平移,而后者就像是翻书时看到的效果,当前页left内容由边到内逐渐消失,而下一页right内容由边缘到里逐渐显示。

    1. 解决思路

通过效果分析对比可知,我们需要在第一步的基础上把每一个图片视图ImageView包装在WSLAnimationView里,让WSLAnimationView去处理ImageView的动画效果,那问题来了,我们怎么处理呢?

  • 我们可以在拖拽过程中相对应的改变right/left图片在父视图WSLAnimationView上的X坐标,把right图片的坐标位置放到相对left图片的正下/偏右方位置,然后随着拖拽滑动逐渐改变right以及left图片的相对位置X坐标,直至复位,回到它们在WSLAnimationView上的初始位置X=0,超出父视图的部分裁剪掉,也是设置WSLAnimationView对象的clipsToBounds = YES。

思路示意图.png

三、代码实现
    1. 首先创建一个承载UIImageView的容器WSLAnimationView,用于渐进动画裁剪效果。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@interface WSLAnimationView ()
@property (nonatomic, strong) UIImageView * imageView;
/**
 imageView的横坐标 用于拖拽过程中的动画
 */
@property (nonatomic, assign) CGFloat contentX;
@end

@implementation WSLAnimationView

- (instancetype)initWithFrame:(CGRect)frame{
    
    if (self = [super initWithFrame:frame]) {
        self.clipsToBounds = YES;
        _imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)];
        [self addSubview:_imageView];
    }
    return self;
}
- (void)setContentX:(CGFloat)contentX{
    _contentX = contentX;
    _imageView.frame = CGRectMake(contentX, 0, self.frame.size.width, self.frame.size.height); 
}
    1. 在拖拽滑动过程中进行动画处理
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define SCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width)
#define SCREEN_HEIGHT ([UIScreen mainScreen].bounds.size.height)
#define SCROLLVIEW_WIDTH SCREEN_WIDTH
#define BaseTag 10
/**
 动画偏移量 是指rightView相对于leftView的偏移量
 */
#define AnimationOffset 100
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    
   CGFloat x = scrollView.contentOffset.x;
   NSInteger leftIndex = x/SCROLLVIEW_WIDTH;

   //这里的left和right是区分拖动中可见的两个视图
    WSLAnimationView * leftView = [scrollView viewWithTag:(leftIndex + BaseTag)];
    WSLAnimationView * rightView = [scrollView viewWithTag:(leftIndex + 1 + BaseTag)];

    leftView.contentX = ((SCROLLVIEW_WIDTH - AnimationOffset) + (x - ((leftIndex + 1) * SCROLLVIEW_WIDTH))/SCROLLVIEW_WIDTH * (SCROLLVIEW_WIDTH - AnimationOffset));
    rightView.contentX = -(SCROLLVIEW_WIDTH - AnimationOffset) + (x - (leftIndex * SCROLLVIEW_WIDTH))/SCROLLVIEW_WIDTH * (SCROLLVIEW_WIDTH - AnimationOffset);
}
    1. 代码处理逻辑说明

动画偏移量AnimationOffset = 0 时 即right图片的坐标位置放到相对left图片的正下方位置,此时的效果如下图所示;当AnimationOffset > 0 时就会出现目标总效果图了。

AnimationOffset = 0时的效果图

刚向左拖拽时的leftView和rightView视图结构示意图如下所示, 那么拖拽中,逐渐移动复位rightView上的RightImage的X坐标: rightView.contentX = 需要移动距离长度 - 移动百分比 * 需要移动距离长度 ; leftView.contentX 和这个类似,交由小伙伴们去思考。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
需要移动距离长度 =  SCROLLVIEW_WIDTH - AnimationOffset;
移动百分比 = 拖拽距离 /  一页宽度即屏幕宽度
拖拽距离 =   (偏移量X - leftView横坐标);
偏移量X = scrollView.contentOffset.x;
leftIndex = 偏移量X/SCROLLVIEW_WIDTH;
leftView横坐标 = leftIndex * SCROLLVIEW_WIDTH

刚向左拖拽时的结构示意图

以上就是我实现这个效果的过程,示例代码请看这儿UIScrollView视觉差动画;如果小伙伴们有其他的实现方法,欢迎再此留言交流??????

之前相关文章:

iOS 图片浏览的放大缩小

UIScrollerView当前显示3张图

UIPageViewController电子书翻页效果

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.03.25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
UIScrollView视觉差动画
那么拖拽中,逐渐移动复位rightView上的RightImage的X坐标:rightView.contentX = 需要移动距离长度 - 移动百分比 * 需要移动距离长度 ; leftView.contentX 和这个类似,交由小伙伴们去思考。
且行且珍惜_iOS
2018/05/21
8540
UIScrollView 和 UIPageControl 实现启动滑动图[通俗易懂]
更多的关于NSUserDefaults的介绍请看:NSUserDefaults 简介
全栈程序员站长
2022/07/20
6780
Swift日常开发随笔
提示:之所以为空白,是因为我把下拉列表中的tableView.reloadData()这行代码屏蔽掉了,加入的数组没有刷新。
编程怪才-凌雨画
2020/10/11
2K0
iOS开发之多图片无缝滚动组件封装与使用
  经常有园友会问"博主,有没有图片无限滚动的Demo呀?", 正儿八经的图片滚动的Demo我这儿还真没有,今天呢就封装一个可以在项目中直接使用的图片轮播。没看过其他iOS图片无限轮播的代码,也不了解他们的原理,我今天封装这个图片无限轮播是借鉴Web前端中的做法,因为之前写Web前端的时候,实现幻灯片就是这么做的,今天就在iPhone上搞搞。下面的东西是自己写的了,关于轮播的东西这个开源项目也是相当不错的https://github.com/nicklockwood/iCarousel ,感兴趣的可以看一下
lizelu
2018/01/11
1.8K0
iOS开发之多图片无缝滚动组件封装与使用
Swift-MVVM 简单演练(三)
Swift-MVVM 简单演练(一) Swift-MVVM 简单演练(二) Swift-MVVM 简单演练(四) 优化一些小细节 设置SVProgressHUD最小提示时间 在我们用SVProgressHUD的时候,它默认的显示时长可能会不符合你的使用规则。我们可以更改它显示的最小时间(setMinimumDismissTimeInterval) 像这种全局都能用到的东西,我们最好是设置在一个方便管理的地方,这里以在AppDelegate中设置 extension AppDelegate {
用户1890628
2018/05/10
2.6K0
iOS17适配指南之UIPageControl
YungFan
2023/07/24
4700
iOS17适配指南之UIPageControl
UIScrollerView当前显示3张图
WSLScrollView功能描述:这是在继承UIView的基础上利用UIScrollerView进行了封装,支持循环轮播、自动轮播、自定义时间间隔、图片间隔、当前页码和图片大小,采用Block返回当
且行且珍惜_iOS
2018/05/22
9010
iOS-UIScrollerView
xy_ss
2023/11/22
1890
iOS-UIScrollerView
iOS学习笔记——滚动视图(scrollView)
滚动视图:在根视图中添加UIScrollViewDelegate协议,声明一些对象属性
全栈程序员站长
2022/07/18
1.4K0
iOS_实现下来ScrollView放大轮播图
#define kWidth self.view.frame.size.width //屏幕宽
mikimo
2022/07/20
3420
xcode uiscrollview with paging and zoom
Here is a simple and sample code that demonstrate the photo slide function with zoom using uiscrollview.  image.png this is the first photo  image.png sliding image.png zooming in particular photo  1. first drag three photos to your project , size no
阿新
2018/04/12
1.1K0
xcode uiscrollview with paging and zoom
两个imageView实现图片轮播
前言 在不少的项目中,都会用到图片轮播这个功能,现在网上关于图片轮播的轮子也层出不穷,千奇百怪,笔者根据自己的思路,用两个imageView也实现了图片轮播,这里给大家介绍笔者的主要思路以及大概步骤。
Scott_Mr
2018/05/16
1.1K0
iOS开发中简单的图片浏览器
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/53010697
用户1451823
2018/09/13
1.1K0
UITableViewCell系列之(二)视觉差滚动效果前言
前言 之前在UITableViewCell系列之(一)让你的cell支持二次编辑中说过,很早就想系统的写一篇关于UITableViewCell的文章,目的是总结一下自己在项目开发中用过的一些关于UITableViewCell的特殊用法。但是苦于最近很忙,零碎的时间不够用,没有时间停留在文章的脉络和排版上,只能把我所想写的文章拆开,以短篇的形式拿出来。如下是我所要说的视觉差滚动效果(即:滚动tableView时候,每一行的图片都会根据滚动方向和滚动距离的不同进行移动,给人一种图片在移动的视觉体验),由于下面g
VV木公子
2018/06/05
6.1K0
iOS头部渐变的表格视图设计 原
        今天再来给大家带来一个开发中常用到的视图控制器,在很多应用中,可能都会遇到这样的一个需求:表视图控制器最上方有一个头图控件,当表格视图滑动在顶部时,导航栏透明,当表格视图逐渐向下滑动时,导航栏渐渐出现,并且在滑动期间,头图会展示相关的渐变动画效果。以前经常会遇到这样的需求,但从没有整理与封装完善,这次将其封装成完整的控件,无论有无导航,都可以很好的支持,方便以后使用也提供给需要的朋友。
珲少
2018/08/15
1.2K0
iOS头部渐变的表格视图设计
                                                                            原
iOS动画系列之一:带时分秒指针的时钟动画(上)1. 最终实现的效果以及思维导图2. CALayer3. 隐式动画
1. 最终实现的效果以及思维导图 实现的效果。不小心暴露了写文章的时间。-_-+++ 实现效果 实现的步骤思维导图: 思维导图.png 2. CALayer 其实今天分享的主角是CALayer。因为所
stanbai
2018/06/28
2.1K0
【IOS开发基础系列】UIScrollView专题
       在滚动过程当中,其实是在修改原点坐标。当手指触摸后,scroll view会暂时拦截触摸事件,使用一个计时器。假如在计时器到点后没有发生手指移动事件,那么scroll view 发送 tracking events 到被点击的subview。假如在计时器到点前发生了移动事件,那么 scroll view 取消tracking 自己发生滚动。
江中散人_Jun
2023/10/16
6870
【IOS开发基础系列】UIScrollView专题
iOS开发之多表视图滑动切换示例(仿"头条"客户端)
  好长时间没为大家带来iOS开发干货的东西了,今天给大家分享一个头条新闻客户端各个类别进行切换的一个示例。在Demo中对所需的组件进行的简单封装,在封装的组件中使用的是纯代码的形式,如果想要在项目中进行使用,稍微进行修改即可。   废话少说,先介绍一下功能点,下图是整个Demo的功能点,最上面左边的TabBarButtonItem是用来减少条目的,比如下图有三个按钮,点击减号会减少一个条目。右边的为增加一个条目。点击相应的按钮是切换到对应的表视图上,下方红色的是滑动的指示器,同时支持手势滑动。运行具体效果
lizelu
2018/01/11
3.8K0
iOS开发之多表视图滑动切换示例(仿"头条"客户端)
iOS_scrollView title and line view, 滚动的标题和线
废话不多说, 直接上代码 // // MOTitleLineView.h // MOTitleLineView // // Created by 莫小言 on 15/12/17. // Copyright © 2015年 莫小言. All rights reserved. // #import <UIKit/UIKit.h> // title 对齐type typedef NS_ENUM(NSUInteger, MOTitleLineViewType) { MOTitleLineViewTy
mikimo
2022/07/20
8910
iOS_scrollView title and line view, 滚动的标题和线
iOS流布局UICollectionView系列七——三维中的球型布局
        通过6篇的博客,从平面上最简单的规则摆放的布局,到不规则的瀑布流布局,再到平面中的圆环布局,我们突破了线性布局的局限,在后面,我们将布局扩展到了空间,在Z轴上进行了平移,我们实现了一个类似UIPickerView的布局模型,其实我们还可以再进一步,类比于平面布局,picKerView只是线性排列布局在空间上的旋转与平移,这次,我们更加充分了利用一下空间的尺寸,来设计一个圆球的布局模型。以下是前几篇博客地址:
珲少
2018/08/16
1.5K0
iOS流布局UICollectionView系列七——三维中的球型布局
相关推荐
UIScrollView视觉差动画
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文