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

相关文章

C#借助Spire.XLS for .NET实现在Excel中添加文档属性

《C#借助Spire.XLSfor.NET实现在Excel中添加文档属性》在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色,本文将深入探讨如何在C#中借助强大的第三方库Spire.... 目录为什么需要程序化添加Excel文档属性使用Spire.XLS for .NET库实现文档属性管理Sp

Python+FFmpeg实现视频自动化处理的完整指南

《Python+FFmpeg实现视频自动化处理的完整指南》本文总结了一套在Python中使用subprocess.run调用FFmpeg进行视频自动化处理的解决方案,涵盖了跨平台硬件加速、中间素材处理... 目录一、 跨平台硬件加速:统一接口设计1. 核心映射逻辑2. python 实现代码二、 中间素材处

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

Python实现快速扫描目标主机的开放端口和服务

《Python实现快速扫描目标主机的开放端口和服务》这篇文章主要为大家详细介绍了如何使用Python编写一个功能强大的端口扫描器脚本,实现快速扫描目标主机的开放端口和服务,感兴趣的小伙伴可以了解下... 目录功能介绍场景应用1. 网络安全审计2. 系统管理维护3. 网络故障排查4. 合规性检查报错处理1.

Python轻松实现Word到Markdown的转换

《Python轻松实现Word到Markdown的转换》在文档管理、内容发布等场景中,将Word转换为Markdown格式是常见需求,本文将介绍如何使用FreeSpire.DocforPython实现... 目录一、工具简介二、核心转换实现1. 基础单文件转换2. 批量转换Word文件三、工具特性分析优点局

Springboot3统一返回类设计全过程(从问题到实现)

《Springboot3统一返回类设计全过程(从问题到实现)》文章介绍了如何在SpringBoot3中设计一个统一返回类,以实现前后端接口返回格式的一致性,该类包含状态码、描述信息、业务数据和时间戳,... 目录Spring Boot 3 统一返回类设计:从问题到实现一、核心需求:统一返回类要解决什么问题?

Java使用Spire.Doc for Java实现Word自动化插入图片

《Java使用Spire.DocforJava实现Word自动化插入图片》在日常工作中,Word文档是不可或缺的工具,而图片作为信息传达的重要载体,其在文档中的插入与布局显得尤为关键,下面我们就来... 目录1. Spire.Doc for Java库介绍与安装2. 使用特定的环绕方式插入图片3. 在指定位

Java使用Spire.Barcode for Java实现条形码生成与识别

《Java使用Spire.BarcodeforJava实现条形码生成与识别》在现代商业和技术领域,条形码无处不在,本教程将引导您深入了解如何在您的Java项目中利用Spire.Barcodefor... 目录1. Spire.Barcode for Java 简介与环境配置2. 使用 Spire.Barco

Java利用Spire.Doc for Java实现在模板的基础上创建Word文档

《Java利用Spire.DocforJava实现在模板的基础上创建Word文档》在日常开发中,我们经常需要根据特定数据动态生成Word文档,本文将深入探讨如何利用强大的Java库Spire.Do... 目录1. Spire.Doc for Java 库介绍与安装特点与优势Maven 依赖配置2. 通过替换

Android使用java实现网络连通性检查详解

《Android使用java实现网络连通性检查详解》这篇文章主要为大家详细介绍了Android使用java实现网络连通性检查的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录NetCheck.Java(可直接拷贝)使用示例(Activity/Fragment 内)权限要求