dismiss ios pop效果_iOS 动画框架pop使用方法

pop支持4种动画类型:弹簧动画效果、衰减动画效果、基本动画效果和自定义动画效果。

弹簧动画效果

1.效果图如下:

8edcf27b7971

2.控制器代码如下,首先用pod安装导入pop框架:

#import "ViewController.h"

#import

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

CALayer *layer = [CALayer layer];

layer.frame = CGRectMake(0, 0, 50, 50);

layer.backgroundColor = [UIColor cyanColor].CGColor;

layer.cornerRadius = 25.f;

layer.position = self.view.center;

[self.view.layer addSublayer:layer];

// 弹簧动画

POPSpringAnimation *anim = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerScaleXY];

anim.toValue = [NSValue valueWithCGPoint:CGPointMake(3.f, 3.f)];

anim.springSpeed = 0.f;

[layer pop_addAnimation:anim forKey:nil];

}

@end

3.上述代码设置了弹簧对象的速度(springSpeed)、最终值大小(toValue),最后图层对象layer添加弹簧对象。

衰减动画

1.衰减动画效果

8edcf27b7971

2.实现代码:

#import "ViewController.h"

#import

@interface ViewController ()

@property(nonatomic) UIControl *dragView;

@end

@implementation ViewController

- (void)viewDidLoad

{

[super viewDidLoad];

// 初始化dragView

self.dragView = [[UIControl alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];

self.dragView.center = self.view.center;

self.dragView.layer.cornerRadius = CGRectGetWidth(self.dragView.bounds)/2;

self.dragView.backgroundColor = [UIColor cyanColor];

[self.view addSubview:self.dragView];

[self.dragView addTarget:self

action:@selector(touchDown:)

forControlEvents:UIControlEventTouchDown];

// 添加手势

UIPanGestureRecognizer *recognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self

action:@selector(handlePan:)];

[self.dragView addGestureRecognizer:recognizer];

}

- (void)touchDown:(UIControl *)sender {

[sender.layer pop_removeAllAnimations];

}

- (void)handlePan:(UIPanGestureRecognizer *)recognizer {

// 拖拽

CGPoint translation = [recognizer translationInView:self.view];

recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x,

recognizer.view.center.y + translation.y);

[recognizer setTranslation:CGPointMake(0, 0) inView:self.view];

// 拖拽动作结束

if(recognizer.state == UIGestureRecognizerStateEnded)

{

// 计算出移动的速度

CGPoint velocity = [recognizer velocityInView:self.view];

// 衰退减速动画

POPDecayAnimation *positionAnimation = \

[POPDecayAnimation animationWithPropertyNamed:kPOPLayerPosition];

// 设置代理

positionAnimation.delegate = self;

// 设置速度动画

positionAnimation.velocity = [NSValue valueWithCGPoint:velocity];

// 添加动画

[recognizer.view.layer pop_addAnimation:positionAnimation

forKey:nil];

}

}

@end

3.对拖拽对象添加了pan手势,根据手势的位置移动拖拽对象,recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x,recognizer.view.center.y + translation.y)之后要清零相对位置,即调用[recognizer setTranslation:CGPointMake(0, 0) inView:self.view]。在拖拽动作结束的时候,计算出相对速度设置给衰减动画对象。

基本动画效果

1.基本动画效果如下:

8edcf27b7971

2.代码如下:

#import "ViewController.h"

#import

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad

{

[super viewDidLoad];

// 创建view

UIView *showView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];

showView.alpha = 0.f;

showView.layer.cornerRadius = 50.f;

showView.center = self.view.center;

showView.backgroundColor = [UIColor cyanColor];

[self.view addSubview:showView];

// 执行基本动画效果

POPBasicAnimation *anim = [POPBasicAnimation animationWithPropertyNamed:kPOPViewAlpha];

anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

anim.fromValue = @(0.0);

anim.toValue = @(1.0);

anim.duration = 4.f;

[showView pop_addAnimation:anim forKey:nil];

}

@end

3.基本动画对象只需要设置起始值(fromValue)和最终值(toValue)以及持续时间(duration)就可以了。

POP动画综合实战

1.动画效果如下:

8edcf27b7971

2.点击中间红色按钮,6个按钮从上面坠落。点击取消,6个按钮又从上边掉下消失。代码实现如下:

#import "BSPublishController.h"

#import "BSVerticalButton.h"

#import

@interface BSPublishController ()

@property(nonatomic,weak)UIImageView *sloganView;

@end

@implementation BSPublishController

- (void)viewDidLoad {

[super viewDidLoad];

//添加6个按钮

NSArray *name = @[@"发视频",@"发图片",@"发段子",@"发声音",@"审帖",@"离线下载"];

NSArray *imageName = @[@"publish-video",@"publish-picture",@"publish-text",@"publish-audio",@"publish-review",@"publish-offline"];

NSUInteger count = name.count;

NSUInteger maxCols = 3;

CGFloat buttonW = 72;

CGFloat buttonH = buttonW + 50;

CGFloat buttonStartX = 20;

CGFloat buttonStartY = (BSScreenH-2*buttonH)*0.5;

CGFloat buttonMargin = (BSScreenW-2*buttonStartX-buttonW*maxCols)/(maxCols-1);

for (NSUInteger i = 0; i < count; i++) {

BSVerticalButton *button = [[BSVerticalButton alloc]init];

[button setImage:[UIImage imageNamed:imageName[i]] forState:UIControlStateNormal];

[button setTitle:name[i] forState:UIControlStateNormal];

[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];

button.titleLabel.font = [UIFont systemFontOfSize:14];

button.tag = i;

[button addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];

[self.view addSubview:button];

//计算frame

NSUInteger row = i/maxCols;

NSUInteger col = i%maxCols;

CGFloat buttonX = buttonStartX + col*(buttonW+buttonMargin);

CGFloat buttonY = buttonStartY + row*buttonH;

//使用pop框架,改变frame往下掉,而且不需要再设置frame了,因为pop改变了frame

POPSpringAnimation *anim = [POPSpringAnimation animationWithPropertyNamed:kPOPViewFrame];

anim.fromValue = [NSValue valueWithCGRect:CGRectMake(buttonX, buttonY-BSScreenH, buttonW, buttonH)];

anim.toValue = [NSValue valueWithCGRect:CGRectMake(buttonX, buttonY, buttonW, buttonH)];

anim.springBounciness = 8;

anim.springSpeed = 8;

anim.beginTime = CACurrentMediaTime()+0.1*i;

[button pop_addAnimation:anim forKey:nil];

}

//添加顶部图片

UIImageView *slogan = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"app_slogan"]];

self.sloganView = slogan;

[self.view addSubview:slogan];

//中心约束

POPSpringAnimation *anim = [POPSpringAnimation animationWithPropertyNamed:kPOPViewCenter];

anim.fromValue = [NSValue valueWithCGPoint:CGPointMake(BSScreenW*0.5, BSScreenH*0.2-BSScreenH)];

anim.toValue = [NSValue valueWithCGPoint:CGPointMake(BSScreenW*0.5, BSScreenH*0.2)];

anim.springBounciness = 8;

anim.springSpeed = 8;

anim.beginTime = CACurrentMediaTime()+0.1*count;

[slogan pop_addAnimation:anim forKey:nil];

}

上面没有单独设置按钮的frame,而是在pop对象的属性(fromValue和toValue)里进行了设置。这里重写了Button按钮,重写的代码如下:

#import "BSVerticalButton.h"

@implementation BSVerticalButton

- (instancetype)initWithFrame:(CGRect)frame {

if (self == [super initWithFrame:frame]) {

self.titleLabel.textAlignment = NSTextAlignmentCenter;

}

return self;

}

- (void)awakeFromNib {

self.titleLabel.textAlignment = NSTextAlignmentCenter;

}

//这个是控件重新布局,所以要调用layoutSubviews,而修改控件大小,是调用setFrame

- (void)layoutSubviews {

[super layoutSubviews];

self.imageView.x = 0;

self.imageView.y = 0;

self.imageView.width = self.width;

self.imageView.height = self.imageView.width;

self.titleLabel.x = 0;

self.titleLabel.y = self.imageView.height;

self.titleLabel.width = self.width;

self.titleLabel.height = self.height - self.width;

}

- (void)setFrame:(CGRect)frame {

[super setFrame:frame];

}

@end

点击取消6个按钮从上面掉下来,代码如下:

- (void)cancel:(void(^)(int))completeion{

//让按钮往下掉

NSUInteger index = 2;

NSUInteger count = self.view.subviews.count;

for (NSUInteger i = index; i

UIView *subview = self.view.subviews[i];

//这里不需要计算frame,因为已经添加到view中,只需要设置最后的位置

POPBasicAnimation *anim = [POPBasicAnimation animationWithPropertyNamed:kPOPViewCenter];

anim.toValue = [NSValue valueWithCGPoint:CGPointMake(subview.centerX, subview.centerY+BSScreenH)];

anim.beginTime = CACurrentMediaTime()+0.1*i;

[subview pop_addAnimation:anim forKey:nil];

if (i == count-1) {

//最后一个控件pop完退出控制器,写在外面会直接退出

[anim setCompletionBlock:^(POPAnimation *anim, BOOL finished) {

if (completeion) {

}

[self dismissViewControllerAnimated:NO completion:nil];

}];

}

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/487567.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

万亿新基建,AI“芯”机遇在哪?| CCF-GAIR 2020

新基建中的5G、AI和智能计算等新一代高端芯片属于新赛道&#xff0c;需要构建全新生态。”来源&#xff1a;雷锋网自今年3月份提出&#xff0c;新基建就迅速成为了焦点。新基建涵盖5G基建、特高压、大数据中心、人工智能、工业互联网等七大领域。与以往基础设施建设的“铁公基”…

重磅!库克官宣苹果放弃英特尔,全面采用自研芯片,MAC迎来历史转折点

物联网智库 整理发布转载请注明来源和出处导 读苹果并没有完全放弃Intel平台的Mac&#xff0c;未来还会继续推出Intel版的Mac&#xff0c;两种平台会并行发展。不过&#xff0c;随着苹果陆续将英特尔处理器换成自研ARM芯片&#xff0c;两年过渡期后的苹果仍启用英特尔处理器的…

微信小程序开源Demo精选

来自&#xff1a;http://www.jianshu.com/p/0ecf5aba79e1 文&#xff0f;weapphome&#xff08;简书作者&#xff09; 原文链接&#xff1a;http://www.jianshu.com/p/0ecf5aba79e1 著作权归作者所有&#xff0c;转载请联系作者获得授权&#xff0c;并标注“简书作者”。 1. 仿…

不输GPS!30颗卫星全部就位!北斗三号全球卫星导航星座部署顺利收官

随着此次发射的成功&#xff0c;北斗三号30颗组网卫星已全部到位&#xff0c;北斗三号全球卫星导航系统星座部署全面完成。来源&#xff1a;澎湃新闻视频&#xff1a;多角度直击北斗三号全球系统“收官之星”发射瞬间&#xff0c;时长约1分12秒6月23日&#xff0c;由中国航天科…

Django ORM 数据库操作

比较有用 转自 http://blog.csdn.net/fgf00/article/details/53678205 一、DjangoORM 创建基本类型及生成数据库表结构 1、简介 2、创建数据库 表结构 二、Django ORM基本增删改查 1、表数据增删改查 2、表结构修改 三、Django ORM 字段类型 1、字段类型介绍 2、字段参数介绍 3…

AI芯片的另一条路

来源&#xff1a;半导体行业观察在先进工艺和架构的协同下&#xff0c;芯片的性能在过去几年获得了爆发性的增长&#xff0c;尤其是在最近几年火热的人工智能行业&#xff0c;这个取得的成就是有目共睹的。据OpenAI在2018年年中发表的报告&#xff0c;自 2012 年以来&#xff0…

JavaScript之event事件

目录 1&#xff1a;事件驱动1 2&#xff1a;事件分类2 3&#xff1a;事件对象event3 4&#xff1a;关于鼠标事件对象属性3 应用&#xff1a;5 5&#xff1a;关于键盘事件对象的属性6 6&#xff1a;目标事件源对象7 7. 事件冒泡7 应用&#xff1a;8 CSS模拟下拉菜单。8 综合应用…

四大全球卫星导航系统都能提供什么服务?

来源&#xff1a;远望智库预见未来远望智库特约专家 陈刘成卫星导航系统是人类发明的最为重要的时间和空间测量工具。没有测量就没有科学&#xff0c;没有测量就没有管理。卫星导航系统价值集中体现在帮助人类精确感知、认知、控制物质、能量、信息的时空运行与分布。目前已经建…

一文了解72名图灵奖获得者的成就

来源&#xff1a;图灵教育今天是计算机科学之父、人工智能之父 艾伦麦席森图灵 诞辰 108 周年。作为“图灵意志”的传承者&#xff0c;依照惯例&#xff0c;在今日纪念这位伟人。从“图灵机”到“图灵测试”&#xff0c;从破译德军的 Enigma 到自杀之谜&#xff0c;图灵一生都是…

安卓修改wifi已停用_手机连不上wifi显示已保存怎么回事【原因介绍】

问&#xff1a;为什么手机连不上wifi显示已保存?手机在连接WiFi的时候&#xff0c;WiFi显示已保存&#xff0c;手机连接不上wifi信号。请问这是什么原因引起的&#xff0c;应该怎么解决这个问题。答&#xff1a;如果手机连接wifi时&#xff0c;显示已保存&#xff0c;手机连接…

机器人智能抓取系统:目前几种主流的解决方案

文章来源&#xff1a;COBOT机器人大脑、新机器视觉机器人学习中的经典问题之一便是分拣&#xff1a;在一堆无序摆放的物品堆中&#xff0c;取出目标物品。在快递分拣员看来&#xff0c;这几乎是一个不需要思考的过程&#xff0c;但对于机械臂而言&#xff0c;这意味着复杂的矩阵…

bzoj1018 [SHOI2008]堵塞的交通traffic

题目链接 分析&#xff1a; 这道题的题解很长&#xff0c;所以就不粘题面了&#xff0c;我们一点一点讲明白这道题 很荣幸&#xff0c;我看了题面之后 想到了这道题 可以很高兴的发现10w是线段树能够承受的范围 我们可以利用线段树维护连通性&#xff0c;每个节点内我们要维…

Science重磅!人类特有基因触发猴子长出更强大的大脑

本文系生物谷原创编译&#xff0c;欢迎分享&#xff0c;转载须授权&#xff01;人类大脑在进化过程中的扩张&#xff0c;特别是新大脑皮层的扩张&#xff0c;与诸如推理和语言等认知能力有关。有一种叫做ARHGAP11B的基因&#xff0c;只在人类身上表达&#xff0c;它能触发大脑干…

『实践』Matlab实现Flyod求最短距离及存储最优路径

Matlab实现Flyod求最短距离及存储最优路径 一、实际数据 已知图中所有节点的X、Y坐标。 图中的节点编号&#xff1a;矩阵中的编号 J01-J62:1-62; F01-F60:63-122; Z01-Z06:123-128; D01-D02:129-130. 二、Floyd求所有节点间的最小距离及通过矩阵存储最优路径的节点 1 function …

MIT Technology Review 2020年“十大突破性技术”解读 【中国科学基金】2020年第3期发布...

来源&#xff1a;国家自然科学基金委员会MIT Technology Review 2020年“十大突破性技术”解读&#xff3b;编者按&#xff3d; 2020年2月26日&#xff0c;MIT Technology Review一年一度的“十大突破性技术”榜单正式发布。自2001年起&#xff0c;该杂志每年都会评选出当年的…

大数据是怎么知道你去过新发地的?

来源&#xff1a;科学加&#xff08;北京科技报记者&#xff1a;赵天宇&#xff09;“经过全市大数据分析&#xff0c;您可能在5月30日(含)以后去过新发地批发市场……”随着新发地市场新冠源头被锁定&#xff0c;近日来&#xff0c;大数据筛查&#xff0c;成为不少北京市民在朋…

口罩巨头挑战“量子霸权”,3个月造出的『最强量子计算机』靠谱不?

摘要霍尼韦尔(Honeywell)最近可是非常忙活。作为全球数一数二的口罩厂商&#xff0c;疫情期间霍尼韦尔一直在努力生产口罩&#xff0c;大家对它的印象也多停留在口罩生产者的层面。但是事实上&#xff0c;人家是正经的多元化高科技制造企业&#xff0c;航空产品、汽车产品、涡轮…

三极管稳压管组成的线性电源关键理解

1. A点电压为20V.B点电压是稳压管电压5.6V.则A到B的电流是固定的。 2. 加电后在调整三极管&#xff0c;负载&#xff0c; 稳压管的电流回路如图。&#xff08;注意电流方向&#xff0c;a->b电流方向和大小都是基本不变的。&#xff09; 转载于:https://www.cnblogs.com/ture…

oci连接mysql_使用 OCILIB 连接并操作 Oracle 数据库

OCILIB是一个跨平台的Oracle驱动程序&#xff0c;可提供非常快速和可靠地访问Oracle数据库。它提供了一个丰富&#xff0c;功能齐全&#xff0c;并易于使用的APIOCILIB是一个跨平台的Oracle驱动程序&#xff0c;&#xff0c;可提供非常快速和可靠地访问Oracle数据库。它提供了一…

万字长文:2020智源大会总结-多角度看AI的未来

来源&#xff1a;混沌巡洋舰导读&#xff1a;智源大会2020 聚焦AI的未来&#xff0c;大家都知道&#xff0c; 2010是深度学习的时代&#xff0c; 我们经历了AI从巅峰进入到瓶颈的过程。那么什么是2020这个十年AI的中心&#xff1f;近一段大家逐步从各个不同的角度切入到这个主题…