看到code 4APP上有一个折叠的UITAbleViewCell,不过是swift的,所以自己尝试做一个简单的可折叠的UITAbleViewCell

主要实现一个可以折叠的UITAbleViewCell

效果图如下:

用到下面这些知识点:

1.单边圆角:

我们经常会遇到一些情况需要进行单边圆角或者边界线的设置,我简单封装了一个类别,github网址

2.锚点的更改

项目中主要围绕view上边界进行3d旋转,所以在动画之前需要进行锚点的设置。

关于锚点的详细概念,可以参考我的另一篇博客:点击这里

因为锚点改变时,frame也会变动,所以在改变锚点时需要重新设置frame。

我这里主要用下面的代码进行锚点的更改:

- (void)setAnchorPointTo:(CGPoint)point view:(UIView*)view{

/*    

    CGRect frame = view.frame;
frame.origin.x+=(point.x - view.layer.anchorPoint.x) * view.frame.size.width;
frame.origin.y+=(point.y - view.layer.anchorPoint.y) * view.frame.size.height;
view.frame = frame;
view.layer.anchorPoint = point; */
//和上面注销掉的代码一个意思
view.frame = CGRectOffset(view.frame, (point.x - view.layer.anchorPoint.x) * view.frame.size.width, (point.y - view.layer.anchorPoint.y) * view.frame.size.height);
view.layer.anchorPoint = point;
}

3.旋转动画;

关于旋转动画,我用的是下面的方法:

[UIView animateWithDuration:0.3 animations:^{
self.ThirdView.layer.transform=CATransform3DMakeRotation(M_PI_2, , , ); }completion:^(BOOL finished) { }];

当然你也可以用这个方法:

    CABasicAnimation* rotationAnimation;
rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.x"];
[self setAnchorPointTo:CGPointMake(0.5, ) view:self.secondView];
rotationAnimation.fromValue = [NSNumber numberWithFloat: M_PI ];
rotationAnimation.toValue = [NSNumber numberWithFloat: ];
rotationAnimation.duration = ;
rotationAnimation.cumulative = YES;
rotationAnimation.repeatCount = ;

4.md34

利用md34属性进行类似于翻页效果的设置,关于md34属性网上有很多文章说明,这里不做详细解释。

具体代码为:

//给containView添加偏移
CATransform3D transfrom3d = CATransform3DIdentity;
transfrom3d.m34 = -0.002;
self.InnerView.layer.sublayerTransform = transfrom3d;

5.阴影:

-(void)setShadow:(UIView*)targetView{
//阴影
targetView.layer.shadowOpacity = 1.0;// 阴影透明度
targetView.layer.shadowColor = [UIColor grayColor].CGColor;// 阴影的颜色
targetView.layer.shadowRadius = ;// 阴影扩散的范围控制
targetView.layer.shadowOffset = CGSizeMake(, );// 阴影的范围
}

Demo地址:点击这里

有什么bug,还请告知。

自定义一个可以动态折叠的UITAbleViewCell的更多相关文章

  1. JSTL,自定义一个标签的功能案例

    1.自定义一个带有两个属性的标签<max>,用于计算并输出两个数的最大值: 2.自定义一个带有一个属性的标签<lxn:readFile  src=“”>,用于输出指定文件的内容 ...

  2. springboot+zuul(一)------实现自定义过滤器、动态路由、动态负载。

    参考:https://blog.csdn.net/u014091123/article/details/75433656 https://blog.csdn.net/u013815546/articl ...

  3. 在Dynamics CRM中自定义一个通用的查看编辑注释页面

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复162或者20151016可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 注释在CRM中的显示是比较特别, ...

  4. SpringMVC 自定义一个拦截器

    自定义一个拦截器方法,实现HandlerInterceptor方法 public class FirstInterceptor implements HandlerInterceptor{ /** * ...

  5. jQuery Validate 表单验证插件----自定义一个验证方法

    一.下载依赖包 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW  访问密码 f224 二.引入依赖包 <script src="../../scripts/j ...

  6. Spring自定义一个拦截器类SomeInterceptor,实现HandlerInterceptor接口及其方法的实例

    利用Spring的拦截器可以在处理器Controller方法执行前和后增加逻辑代码,了解拦截器中preHandle.postHandle和afterCompletion方法执行时机. 自定义一个拦截器 ...

  7. 自定义View(7)官方教程:自定义View(含onMeasure),自定义一个Layout(混合组件),重写一个现有组件

    Custom Components In this document The Basic Approach Fully Customized Components Compound Controls ...

  8. Volley HTTP库系列教程(5)自定义一个Volley请求

    Implementing a Custom Request Previous  Next This lesson teaches you to Write a Custom Request parse ...

  9. 在String()构造器不存在的情况下自定义一个MyString()函数,实现如下内建String()方法和属性:

    在String()构造器不存在的情况下自定义一个MyString()函数,实现如下内建String()方法和属性: var s = new MyString("hello"); s ...

随机推荐

  1. 迁移桌面程序到MS Store(4)——桌面程序调用Win10 API

    上一篇我们讨论了如何在转制的桌面程序中,通过StartupTask来实现转制版本的开机自启动.实际操作中,我们通过编辑Packaging工程中的Package.appxmanifest文件,来添加自启 ...

  2. 背水一战 Windows 10 (45) - 控件(图标类): IconElement, SymbolIcon, FontIcon, PathIcon, BitmapIcon

    [源码下载] 背水一战 Windows 10 (45) - 控件(图标类): IconElement, SymbolIcon, FontIcon, PathIcon, BitmapIcon 作者:we ...

  3. “全栈2019”Java多线程第三十六章:如何设置线程的等待截止时间

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 下一章 "全栈2019"J ...

  4. Python MySQL - 创建/查询/删除数据库

    #coding=utf-8 import mysql.connector import importlib import sys #连接数据库的信息 mydb = mysql.connector.co ...

  5. javap 反汇编class文件

    用法: javap 参数 class文件路径 其中, 可能的选项包括: -help --help -? 输出此用法消息 -version 版本信息 -v -verbose 输出附加信息 -l 输出行号 ...

  6. Mac OSX配置XAMP虚拟主机

    在前端工作中,有时候需要配置下环境,这篇文章主要是记录了在wamp中配置虚拟主机 首先需要下载wamp软件和navicat数据库管理软件进行管理,下面默认已经下载好所需软件.并且打开服务. 第一步:把 ...

  7. 关于UUID

    UUID是通用唯一识别码的缩写,其目的,是让分布式系统中的所有元素,都能有唯一的辨识信息. UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的. 在做后台管理的时候,经常会碰 ...

  8. vue教程3-06 vue路由嵌套(多层路由),路由其他信息

    多层嵌套: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  9. netcore高性能Web服务器Kestrel分析

    Kestrel是aspnetcore中的web服务器之一,其本身有跨平台,轻量级,高性能的特点 在 ryzen 1600 12核cpu 测试环境中,瞬间每秒处理请求数能达到2w5以上,与netty不相 ...

  10. eclipse maven jdk全局设置

    <profile> <id>jdk-1.8</id> <activation> <activeByDefault>true</acti ...