UITableView实现格瓦拉飞天投票模块

2024-02-03 18:40

本文主要是介绍UITableView实现格瓦拉飞天投票模块,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载自:http://www.cocoachina.com/ios/20160823/17410.html?utm_source=tuicool&utm_medium=referral

格瓦拉目前来说动画效果确实做的还比较好,虽然不是说很炫但做到精致,这次就模仿了它投票的模块。其实想到要实现它还是有很多方法,不过这次我还是采用了苹果自带控件UITableView简简单单来实现它,再次认识它的强大一面。

Github地址:https://github.com/ZFbaby/ZFVoteViewDemo(欢迎star~谢谢)

接着先上效果:

1471874745265739.gif

1471874747303152.gif

实现步骤:

* 数据回来的时候就要根据数据算出每一行的高度并且算出总高,总高就是tableview的高度

1
2
3
4
5
6
7
8
9
10
-(void)setTitle:(NSString *)title
{
     //根据数据算出每行cell的实际高度
     _title = title;
     CGFloat title_H = [title boundingRectWithSize:CGSizeMake(ZFVoteTableViewMax_W - percentLable_W - thumbUpView_WH - 85, 100)
     options:NSStringDrawingUsesFontLeading|NSStringDrawingUsesLineFragmentOrigin
     attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:15.0]}
     context:nil].size.height;
     self.voteCell_H = title_H + 30;
}

* 设置cell的内边距离及x值,利用setFrame:方法改变原来父类算好的frame实现cell有内边距离,达到实现相邻两条cell不连接在一起的效果

1
2
3
4
5
6
7
8
9
10
11
12
-(void)setFrame:(CGRect)frame{
     if  (frame.size.width == ZFVoteTableViewMax_W) { //初始化就设置cell的内边距
         frame = UIEdgeInsetsInsetRect(frame,
         UIEdgeInsetsMake(ZFVoteCellTopBottomInset,
         ZFVoteCellLeftRightInset,
         ZFVoteCellTopBottomInset,
         ZFVoteCellLeftRightInset));
     } else { //重复利用的时候改变它的x值
         frame.origin.x += ZFVoteCellLeftRightInset;
     }
     [ super  setFrame:frame];
}

* 创建投票主控件并添加到cell上,投票主控件就是所有要展示动画效果的控件集合,有cell了为什么还需要它,其实说白了它就是打酱油的,只是为了呈现动画的一种载体,在看下面一条就了解了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-(void)initSubviews{
     ZFPercentBar *bar = [[ZFPercentBar alloc]initWithFrame:self.bounds];
     self.bar = bar;
     [self addSubview:bar];
     UIImageView *thumbUpView = [[UIImageView alloc]init];
     self.thumbUpView = thumbUpView;
     [self addSubview:thumbUpView];
     UILabel *percentLable = [UILabel labelWithFont:[UIFont systemFontOfSize:13.0]
     textColor:[UIColor lightGrayColor]
     textAlignment:NSTextAlignmentRight
     numberOfLines:1];
     self.percentLable = percentLable;
     [self addSubview:percentLable];
     UILabel *voteLabel = [UILabel labelWithFont:[UIFont systemFontOfSize:15.0]
     textColor:[UIColor blackColor]
     textAlignment:NSTextAlignmentLeft
     numberOfLines:0];
     self.voteLabel = voteLabel;
     [self addSubview:voteLabel];
}

* 每次点击选择一个cell的时候创建个投票主控件,然后隐藏被选择的cell,改变主控件的形变添加阴影效果使它看起来有浮动效果,改变主控件坐标到当前tableView的第一行cell的位置,在利用tableview本身自带的功能交换行实现的方法就完成了cell之间的交换效果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
ZFVoteView *voteView = [[ZFVoteView alloc]initWithFrame:selectedCell.frame
voteView:voteModel];
voteView.layer.masksToBounds = NO;
[self.tableView addSubview:voteView];
self.tableView.userInteractionEnabled = NO;
[UIView animateWithDuration:0.4
animations:^{
     voteView.transform = CGAffineTransformMakeScale(1.05, 1.05);
}
completion:^(BOOL finished) 
{
         [UIView animateWithDuration:0.7
         animations:^{
             [self.list removeObject:voteModel];
             [self.list insertObject:voteModel atIndex:0];
             [self.tableView moveRowAtIndexPath:indexPath
             toIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
             voteView.centerY = selectedCell.centerY;
             voteView.centerX = selectedCell.centerX;
         }completion:^(BOOL finished) {
             [UIView animateWithDuration:0.4
         animations:^{
             voteView.transform = CGAffineTransformIdentity;
         }completion:^(BOOL finished) {
             [voteView removeFromSuperview];
             self.tableView.userInteractionEnabled = YES;
         }];
     }];
}];

说到这核心的东西也是差不多了,当然很有很多细节在里边,也还有很多需要完善的地方。

以上只是个人的对该模块按自己的想法和思路实现,最后还要感谢GraphKit作者,demo中部分绘图动画功能引用至它的方法及进行了小部分修改,

Github地址:https://github.com/ZFbaby/ZFVoteViewDemo

这篇关于UITableView实现格瓦拉飞天投票模块的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/675037

相关文章

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

Python实现精确小数计算的完全指南

《Python实现精确小数计算的完全指南》在金融计算、科学实验和工程领域,浮点数精度问题一直是开发者面临的重大挑战,本文将深入解析Python精确小数计算技术体系,感兴趣的小伙伴可以了解一下... 目录引言:小数精度问题的核心挑战一、浮点数精度问题分析1.1 浮点数精度陷阱1.2 浮点数误差来源二、基础解决

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo