iOS出门必备之CoreAnimation(核心动画)

iOS开发必备第三方库全解析与实战指南 在移动开发领域,第三方库作为基础架构组件,通过封装通用功能模块显著提升工程效率。其核心原理是基于模块化设计思想,提供标准化API接口,开发者无需重复实现底层逻辑。从技术价值看,优秀的第三方库能降低开发复杂度,提升代码质量,典型如AFNetworking简化网络请求、SDWebImage优化图片加载。在iOS生态中,这些工具广泛应用于UI渲染、数据持久化、状态管理等场景。本文重点解析主流库的选型标准,结合Masonry布局框架和ReactiveCocoa响应式编程等热词,分享实际项目中的性能调优经验与避坑指南 阅读详情

CoreAnimation

  • 前段时间接触到了一个牛逼的动画框架POP,本来想来装装逼,突然发现,苹果大大的CoreAnimation我还不会用呢!
  • 依稀记得乔帮主在2007年的WWDC大会上亲自为你演示Core Animation的强大:点击查看视频(不好意思,又装逼了)
  • 言归正传,我只是来温习一下CoreAnimation,还望路过的大神不要吐槽我太low

一、Core Animation简介

  • Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍。也就是说,使用少量的代码就可以实现非常强大的功能。
  • Core Animation可以用在Mac OS X和iOS平台。
  • Core Animation的动画执行过程都是在后台操作的,不会阻塞主线程。
  • 要注意的是,Core Animation是直接作用在CALayer上的,并非UIView
  • 通过调用CALayer的addAnimation:forKey:方法增加CAAnimation对象到CALayer中,这样就能开始执行动画了
  • 通过调用CALayer的removeAnimationForKey:方法可以停止CALayer中的动画

二. Core Animation及其相关属性

  • 要想执行动画,就必须初始化一个CAAnimation对象。
  • 一般情况下,我们使用的比较多的是CAAnimation的子类,因此,先大致看看CAAnimation的继承结构
  • 黑线代表继承,黑色文字代表类名,白色文字代表属性。其中CAMediaTiming是一个协议(protocol)

Core Animation结构划分.png

1.需要注意的是

  • CAAnimation是所有动画类的父类,但是它不能直接使用,应该使用它的子类
  • CAPropertyAnimation也是不能直接使用的,也要使用它的子类
  • 能用的动画类只剩下4个:CABasicAnimation、CAKeyframeAnimation、CATransition、CAAnimationGroup

2.常用属性

1). removedOnCompletion:默认为true,代表动画执行完毕后就从图层上移除
- 图形会恢复到动画执行前的状态。如果想让图层保持显示动画执行后的状态,那就设置为false,不过还要设置fillMode为kCAFillModeForwards

2). timingFunction:控制动画运行的节奏

/** timingFunction可选的值 **/
@available(iOS 2.0, *)
public let kCAMediaTimingFunctionLinear: String
//1.(匀速): 在整个动画时间内动画都是以一个相同的速度来改变

@available(iOS 2.0, *)
public let kCAMediaTimingFunctionEaseIn: String
//2. (渐进): 缓慢进入, 加速离开

@available(iOS 2.0, *)
public let kCAMediaTimingFunctionEaseOut: String
//3. (渐出): 快速进入, 减速离开

@available(iOS 2.0, *)
public let kCAMediaTimingFunctionEaseInEaseOut: String
//4. (渐进渐出): 缓慢进入, 中间加速, 减速离开

@available(iOS 3.0, *)
public let kCAMediaTimingFunctionDefault: String
//5. (默认): 效果基本等同于EaseOut(渐出)

3). fillMode决定当前对象在非active时间段的行为。
- 要想fillMode有效,需设置removedOnCompletion = false
- fillMode可选的值

/* `fillMode' options. */
@available(iOS 2.0, *)
public let kCAFillModeForwards: String
//1. 当动画结束后,layer会一直保持着动画最后的状态

@available(iOS 2.0, *)
public let kCAFillModeBackwards: String
//2. 设置为该值,将会立即执行动画的第一帧,不论是否设置了 beginTime属性。观察发现,设置该值,刚开始视图不见,还不知道应用在哪里

@available(iOS 2.0, *)
public let kCAFillModeBoth: String
//3. 该值是 kCAFillModeForwards 和 kCAFillModeBackwards的组合状态; 动画加入后开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状态

@available(iOS 2.0, *)
public let kCAFillModeRemoved: String
//4. 默认值,动画将在设置的 beginTime 开始执行(如没有设置beginTime属性,则动画立即执行),动画执行完成后会将layer的改变恢复原状

4). delegate:动画代理,用来监听动画的执行过程


public protocol CAAnimationDelegate : NSObjectProtocol {

    // 动画开始执行的时候触发这个方法
    @available(iOS 2.0, *)
    optional public func animationDidStart(_ anim: CAAnimation)

    // 动画执行完毕的时候触发这个方法
    @available(iOS 2.0, *)
    optional public func animationDidStop(_ anim: CAAnimation, finished flag: Bool)
}

5). 其他相关属性

duration    动画的时长
repeatCount    重复的次数。不停重复设置为 HUGE_VALF
repeatDuration    设置动画的时间。在该时间内动画一直执行,不计次数。
beginTime    指定动画开始的时间。从开始延迟几秒的话,设置为【CACurrentMediaTime() + 秒数】 的方式
timingFunction    设置动画的速度变化
autoreverses    动画结束时是否执行逆动画
fromValue    所改变属性的起始值(Swift中为Any类型,OC中要包装成NSValue对象)
toValue    所改变属性的结束时的值(类型与fromValue相同)
byValue    所改变属性相同起始值的改变量(类型与fromValue相同)

三. CABasicAnimation

  • CABasicAnimation是CAPropertyAnimation的子类,使用它可以实现一些基本的动画效果,它可以让CALayer的某个属性从某个值渐变到另一个值。下面就用CABasicAnimation实现几个简单的动画

1. 平移动画

方法一: 改变label的position
let caBasic = CABasicAnimation(keyPath: "position")
caBasic.duration = 2
caBasic.fromValue = redLabel.layer.position
caBasic.toValue = CGPoint(x: kScreenWidth - 50, y: 200)
caBasic.delegate = self
caBasic.isRemovedOnCompletion = false
caBasic.fillMode = kCAFillModeForwards
redLabel.layer.add(caBasic, forKey: "redLabel1")
  • 初始化方法中是”position”,说明要修改的是CALayer的position属性,也就是会执行平移动画
  • 默认情况下,动画执行完毕后,动画会自动从CALayer上移除,CALayer又会回到原来的状态。为了保持动画执行后的状态,可以加入第6、7行代码
  • 第8行后面的@”redLabel1”是给动画对象起个名称,以后可以调用CALayer的removeAnimationForKey:方法根据动画名称停止相应的动画
  • 遵循的代理方法
extension ViewController: CAAnimationDelegate {
    //开始执行
    func animationDidStart(_ anim: CAAnimation) {
        print("开始动画--layer:", redLabel.layer.position)
    }
    //结束之行
    func animationDidStop(_ anim: CAAnimation, finished flag: Bool) {
        print("结束动画--layer:", redLabel.layer.position)
    }
}


//打印结果为:
//开始动画--layer: (35.0, 213.0)
//结束动画--layer: (35.0, 213.0)

从打印信息可以看出,实际上,动画执行完毕后,并没有真正改变CALayer的position属性的值!

方法二.
 let basic = CABasicAnimation(keyPath: "transform")
basic.duration = 2
let form = CATransform3DMakeTranslation(350, 400, 0)
basic.toValue = form
blueLabel.layer.add(basic, forKey: "blueLabel")

2. 旋转动画

let basic1 = CABasicAnimation(keyPath: "transform")
basic1.duration = 1
basic1.toValue = CATransform3DMakeRotation(0.25, 0, 0, 1)
basic1.isRemovedOnCompletion = false
basic1.fillMode = kCAFillModeForwards
blueLabel.layer.add(basic1, forKey: "basic1")
  • 可以不用设置fromValue,这里只设置了toValue

3. 缩放动画

  • CALayer的宽度从0.5倍变为2倍
  • CALayer的高度从0.5倍变为1.5倍
let basic1 = CABasicAnimation(keyPath: "transform")
basic1.duration = 1
basic1.toValue = CATransform3DMakeScale(0.5, 0.5, 1)
basic1.toValue = CATransform3DMakeScale(2, 1.5, 1)
basic1.isRemovedOnCompletion = false
basic1.fillMode = kCAFillModeForwards
blueLabel.layer.add(basic1, forKey: "basic1")
  • CABasicAnimation虽然能够做很多基本的动画效果,但是有个局限性,只能让CALayer的属性从某个值渐变到另一个值,仅仅是在2个值之间渐变
  • 总结一些常用的animationKeyPath值的
值说明使用形式
transform.scale比例转化0.5
transform.scale.x宽的比例0.5
transform.rotation.x围绕x轴旋转@(M_PI_4)(OC), 0.25(Swift)
cornerRadius圆角的设置30
backgroundColor背景颜色的变化UIColor.purpleColor.cgColor
bounds大小,中心不变CGRect
position位置(中心点的改变)CGPoint
contents内容,比如UIImageView的图片imageAnima.toValue = UIImage(named: “toImage”)?.cgImage
opacity透明度0.7
contentsRect.size.width横向拉伸缩放最好是0~1之间的

四. CAKeyframeAnimation——关键帧动画

  • 关键帧动画,也是CAPropertyAnimation的子类,与CABasicAnimation的区别是:
    • CABasicAnimation只能从一个数值(fromValue)变到另一个数值(toValue)
    • 而CAKeyframeAnimation会使用一个Array保存这些数值
  • 属性说明:
    • values:上述的Array对象。里面的元素称为“关键帧”(keyframe)。动画对象会在指定的时间(duration)内,依次显示values数组中的每一个关键帧
    • path:可以设置一个CGPathRef、CGMutablePathRef,让图层按照路径轨迹移动。path只对CALayer的anchorPoint和position起作用。如果设置了path,那么values将被忽略
    • keyTimes:可以为对应的关键帧指定对应的时间点,其取值范围为0到1.0,keyTimes中的每一个时间值都对应values中的每一帧。如果没有设置keyTimes,各个关键帧的时间是平分的
    • calculationMode: 该属性决定了物体在每个子路径下是跳着走还是匀速走,跟timeFunctions属性有点类似
    • kCAAnimationLinear默认值,表示当关键帧为座标点的时候,关键帧之间直接直线相连进行插值计算;
    • kCAAnimationDiscrete 离散的,就是不进行插值计算,所有关键帧直接逐个进行显示;
    • kCAAnimationPaced 使得动画均匀进行,而不是按keyTimes设置的或者按关键帧平分时间,此时keyTimes和timingFunctions无效;</li>
      <li>
      kCAAnimationCubic对关键帧为座标点的关键帧进行圆滑曲线相连后插值计算,对于曲线的形状还可以通过tensionValues,continuityValues,biasValues来进行调整自定义主要目的是使得运行的轨迹变得圆滑;</li>
      <li>
      kCAAnimationCubicPaced看这个名字就知道和kCAAnimationCubic有一定联系,其实就是在kCAAnimationCubic的基础上使得动画运行变得均匀,就是系统时间内运动的距离相同,此时keyTimes以及timingFunctions`也是无效的.
  • CABasicAnimation可看做是只有2个关键帧的CAKeyframeAnimation

values方式

let key = CAKeyframeAnimation(keyPath: "position")
key.duration = 3
key.repeatCount = HUGE //无线循环
key.calculationMode = kCAAnimationPaced
key.values = [redLabel.frame.origin, CGPoint(x: 180, y: 70), CGPoint(x: 180, y: 200), redLabel.frame.origin]
key.keyTimes = [NSNumber(value: 0.0), NSNumber(value: 0.6), NSNumber(value: 0.7), NSNumber(value: 0.8)]
redLabel.layer.add(key, forKey: "key")

五. CASpringAnimation

  • CASpringAnimation是iOS 9 新出的
  • CASpringAnimation 继承于CABaseAnimation
  • CASpringAnimation是苹果专门解决开发者关于弹簧动画的这个需求而封装的类。

1. CASpringAnimation相关属性

//1. 质量,影响图层运动时的弹簧惯性,质量越大,弹簧拉伸和压缩的幅度越大, 默认值: 1
open var mass: CGFloat

//2. 刚度系数(劲度系数/弹性系数),刚度系数越大,形变产生的力就越大,运动越快(默认值: 100)
open var stiffness: CGFloat

//3. 阻尼系数,阻止弹簧伸缩的系数,阻尼系数越大,停止越快(默认值: 10)
open var damping: CGFloat

//4. 初始速率,动画视图的初始速度大小, 默认0
//速率为正数时,速度方向与运动方向一致,速率为负数时,速度方向与运动方向相反(默认值: 0)
open var initialVelocity: CGFloat

//5. 估算时间 返回弹簧动画到停止时的估算时间,根据当前的动画参数估算(只读)
open var settlingDuration: CFTimeInterval { get }

2. 示例代码

let spring = CASpringAnimation(keyPath: "position.y")
spring.mass = 5
spring.stiffness = 100
spring.damping = 5
spring.initialVelocity = 2
spring.fromValue = blueLabel.layer.position.y
spring.toValue = kScreenHeight - 150
spring.duration = spring.settlingDuration
blueLabel.layer.add(spring, forKey: "spring")

六. CAAnimationGroup动画组

  • 是CAAnimation的子类,可以保存一组动画对象,将CAAnimationGroup对象加入层后,组中所有动画对象可以同时并发运行
  • 属性说明:
    • animations:用来保存一组动画对象的Array
  • 默认情况下,一组动画对象是同时运行的,也可以通过设置动画对象的beginTime属性来更改动画的开始时间

代码示例:

  • 同时执行:平移、缩放、位移动画 -> 使用动画组
    //动画组
    fileprivate func getCAAnimationGroup(){
        //0. 初始化动画组
        let group = CAAnimationGroup()

        //1. 平移动画
        let basic1 = CABasicAnimation(keyPath: "position")
        basic1.fromValue = blueLabel.layer.position
        basic1.toValue = CGPoint(x: CGFloat(arc4random_uniform(200)), y: CGFloat(arc4random_uniform(500)))

        //2. 缩放动画
        let basic2 = CABasicAnimation(keyPath: "transform.scale")
        var scale: CGFloat = 0.1
        scale = scale < 1 ? 1.5 : 0.5
        basic2.toValue = scale

        //3. 旋转动画
        let basic3 = CABasicAnimation(keyPath: "transform.rotation")
        basic3.toValue = CGFloat(arc4random_uniform(360)) / 180.0

        //4. 添加到动画组
        group.animations = [basic1, basic2, basic3]
        //取消反弹
        group.isRemovedOnCompletion = false
        group.fillMode = kCAFillModeForwards
        group.duration = 0.5
        blueLabel.layer.add(group, forKey: "group")
    }

七. 转场动画——CATransition

  • CATransition是CAAnimation的子类,用于做转场动画,能够为layer层提供移出屏幕和移入屏幕的动画效果。
  • iOS比Mac OS X的转场动画效果少一点
    UINavigationController就是通过CATransition实现了将控制器的视图推入屏幕的动画效果
  • 动画属性:
    • type:动画过渡类型
    • subtype:动画过渡方向
    • startProgress:动画起点(在整体动画的百分比)
    • endProgress:动画终点(在整体动画的百分比)

1. type和subtype属性说明

/* type类型 */
@available(iOS 2.0, *)
public let kCATransitionFade: String
//交叉淡化过渡

@available(iOS 2.0, *)
public let kCATransitionMoveIn: String
//新视图移到旧视图上面

@available(iOS 2.0, *)
public let kCATransitionPush: String
//新视图把旧视图推出去

@available(iOS 2.0, *)
public let kCATransitionReveal: String
//将旧视图移开,显示下面的新视图


/* subtypes类型 */
@available(iOS 2.0, *)
public let kCATransitionFromRight: String
//从右侧转场

@available(iOS 2.0, *)
public let kCATransitionFromLeft: String
//从左侧转场

@available(iOS 2.0, *)
public let kCATransitionFromTop: String
//从上部转场

@available(iOS 2.0, *)
public let kCATransitionFromBottom: String
//从底部转场

注意:
- 除了上述四种效果之外,还有很多私有API效果,使用的时候要小心,可能会导致app审核不被通过
- 使用的时候要以字符串的形式

cube     //立方体翻滚效果
oglFlip  //上下左右翻转效果
suckEffect   //收缩效果,如一块布被抽走(不支持过渡方向)
rippleEffect //滴水效果(不支持过渡方向)
pageCurl     //向上翻页效果
pageUnCurl   //向下翻页效果
cameraIrisHollowOpen  //相机镜头打开效果(不支持过渡方向)
cameraIrisHollowClose //相机镜头关上效果(不支持过渡方向)

效果参考

各参数动画效果.png

2. 代码示例:

  • 展示立方体翻滚效果的图片浏览
1. 初始化变量
//初始化变量
fileprivate var imageView = UIImageView(frame: UIScreen.main.bounds)
fileprivate var currentIndex = 0
2. 需要在viewDidLoad中调用一下方法
//转场动画
    fileprivate func imageCATransition(){
        //0.初始化ImageView
        imageView.isUserInteractionEnabled = true
        imageView.image = UIImage(named: "0.jpg")
        view.addSubview(imageView)

        //1. 添加滑动手势
        let left = UISwipeGestureRecognizer(target: self, action: #selector(leftSwipe(gesture:)))
        left.direction = .left
        imageView.addGestureRecognizer(left)
        let right = UISwipeGestureRecognizer(target: self, action: #selector(rightSwipe(gesture:)))
        right.direction = .right
        imageView.addGestureRecognizer(right)
    }
3. 滑动后执行的方法
    //MARK: 手势相关方法
    //左滑
    @objc fileprivate func leftSwipe(gesture: UIGestureRecognizer) {
        print("左滑动")
        transitionAnimation(isNext: true)
    }
    //右滑
    @objc fileprivate func rightSwipe(gesture: UIGestureRecognizer) {
        print("右滑动")
        transitionAnimation(isNext: false)
    }

    //设置转场动画
    fileprivate func transitionAnimation(isNext: Bool){
        let transition = CATransition()
        transition.type = kCATransitionFade
        transition.subtype = isNext ? kCATransitionFromRight : kCATransitionFromLeft
        transition.duration = 1
        imageView.image = getImage(isNext)
        imageView.layer.add(transition, forKey: "transition")
    }

    //获取下/上一张图片
    fileprivate func getImage(_ isNext: Bool) -> UIImage {
        currentIndex = isNext ? currentIndex + 1 : currentIndex - 1
        currentIndex = currentIndex < 0 ? 7 : currentIndex
        currentIndex = currentIndex > 7 ? 0 : currentIndex
        return UIImage(named: "\(currentIndex)" + ".jpg")!
    }

八. 总结

  • 核心动画给我们展示的只是一个假象,layer的的frame、bounds、position并不会在动画完毕之后发生改变。
  • UIView封装的动画,会使会真实修改view的一些属性
  • 以上就是小编总结的关于Core Animation核心动画的相关分类
  • 总结的知识点比较简单, 个人感觉有点low
  • 如有不足之处,还望路过的大神多多指教
Vivado2019.1 ZYNQ7020无Uart SDK调试打印调试信息xil_printf 阅读详情

相关推荐

4 轴穿越机 Mark5 机架全解析:从历史演进到电机桨叶选型指南

本文围绕 4 轴穿越机 Mark5 机架展开,先介绍其发展历程(2018 年初代到 2023 年五代,迭代优化轻量化、刚性与兼容性),再明确其核心参数(轴距 220mm、兼容 4-6 寸桨等)对电机桨叶的约束。 详解电机(KV 值、尺寸、推力等)与桨叶(尺寸、螺距、材质等)选型要点及匹配原则(高 KV 配小桨、低 KV 配大桨),给出推重比、功率等理论计算公式,结合新手练习、花飞、竞速、航拍等场景提供具体选型案例,最后提及安全、成本、法规等注意事项,为爱好者提供全面选型参考。

bother3000的博客 1899

CAAnimation动画

具有动画效果的keyPath //CATransform3D Key Paths : (example)transform.rotation.z //rotation.x //rotation.y //rotation.z //rotation 旋轉 //scale.x //scale....

weixin_34307464的博客 134

MATLAB语言的并发编程

并发编程是指在同一程序中同时执行多个计算任务。通过将任务分解为较小的子任务,程序可以利用多核处理器的优势,提高计算效率。并发编程与并行编程密切相关,但不完全相同。并行编程强调任务的同时执行,而并发编程则侧重于任务的调度与管理,即使某些任务并没有同时执行。MATLAB的并发编程为数据分析、科学计算等应用提供了强大的支持。通过使用parforparfevalspmd等工具,用户可以轻松实现高效的并行计算。尽管MATLAB的并发编程工具相对简单易用,但在实际应用中仍需关注数据共享、通信、错误处理等问题。

2501_90485575的博客 363

iOS开发Layer上添加的动画消失

iOS开发CoreAnimation动画,在APP进入后台就会消失 将removedOnCompletion属性设置为NO。 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持...

jnb_xhsf的博客 785

Excel药品说明书数据库:从零开始搭建医药数据查询系统(附完整模板)

本文详细介绍了如何从零开始搭建Excel药品说明书数据库,提供完整的医药数据查询系统模板。涵盖数据库架构设计、数据清洗标准化、智能查询系统搭建及维护优化,帮助医药从业者高效管理药品信息,提升查询速度和准确性。

weixin_28327051的博客 233

BambuStudio学习笔记:GCode 类

关键成员解析 核心配置组件 状态跟踪系统 功能模块集成 核心方法剖析 主输出管道 实现多阶段处理: 分层处理流程: 实现智能路径规划: 关键特性: 实现模板故障检测: 采用三级流水线: 支持扩展类型: 实现多通道输出: 采用: 实现: 支持: 支持模块化编译: 典型流程: 实现功能:

zzzkk2009的专栏 927

iOS 后台重新进入 动画失效 设置removedOnCompletion = no

CAAnimationGroup * animationGroup = [[CAAnimationGroup alloc]init]; animationGroup.removedOnCompletion = NO;

u014029960的博客 605

一、永磁同步电机矢量控制——电机数学模型

本文介绍了永磁同步电机(PMSM)的数学模型构建方法,重点分析了不同坐标系(三相静止、α-β静止、d-q旋转)下的电压方程、磁链表达式及电磁转矩计算方法。通过Clark和Park变换简化非线性耦合系统,推导了表贴式(SPMSM)与内置式(IPMSM)电机的电压方程差异,并给出α-β和d-q坐标系下的转矩公式,强调磁链与电流的正交性对转矩的影响。全文基于理想假设,为后续电机控制算法(如FOC、DTC)提供理论基础。

惊鸿一现 1927

IOS核心动画

核心动画原码:代码下载请猛戳这里!核心动画1.CABasicAnimation:基础动画- (void)basicAnimation:(CALayer *)layer { //1.创建动画对象 CABasicAnimation *animation = [CABasicAnimation animation]; //2.设置动画对象 /* keyPat

jiuchabaikaishui的专栏 675

【QNX+Android虚拟化方案】129 - USB眼图参数配置

【QNX+Android虚拟化方案】129 - USB眼图参数配置

|~~~热爱生活、努力学习的小伙汁~~~| 820

【Halcon 】Halcon 实战:如何为 XLD 模板添加极性信息以提升匹配精度?

本文介绍了Halcon中为XLD轮廓模板添加极性信息的实用技巧。通过先以"ignore_local_polarity"模式创建模板,首次匹配获得位置后,使用set_shape_model_metric运算符结合真实图像为模板注入极性信息(边缘明暗方向)。这种方法弥补了XLD模板初始不支持极性的缺陷,可显著提升后续匹配的精度和抗干扰能力。实验显示,添加极性信息后的模板匹配效果明显优于无极性的匹配结果。该技术特别适用于基于手动绘制或处理后的XLD轮廓创建模板的场景。

songhuangong123的博客 750

IOS 基本动画(旋转、移动、闪烁、缩放等)

IOS 基本动画(旋转、移动、闪烁、缩放等)

u013712343的博客 1462

锁的艺术:Java并发中的常用锁策略与实践

对java锁相关内容进行整理分析:乐观锁 VS 悲观锁+自旋锁 VS 适应性自旋锁+无锁 VS 偏向锁 VS 轻量级锁 VS 重量级锁+公平锁 VS 非公平锁+可重入锁 VS 非可重入锁+独享锁 VS 共享锁

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 171万+

iOS开发书籍推荐 - 《iOS CORE ANIMATION》核心动画高级技巧(附链接)

在阅读《iOS Core Animation》这本书后,我深刻感受到它与我们实际开发中所用的知识非常契合。书中的大多数内容都很熟悉,因此学习起来不会有太大难度。然而,书中通过有结构、有层次的讲解,将这些看似简单的概念进行了更为详尽的串联,使得我在实际开发中能够更加得心应手,尤其是在动画的使用上。 通过本书的学习,我不仅能够避免一些常见的开发问题,还能够找到更加灵活的解决方案。即便是面对相同的问题,书中提供的不同思路和技巧让我能够有更多选择,进而挑选出最优的解决方案。

weixin_39339407的博客 1603

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

CoreAnimation-04-核心动画必备基础

概述 简介 核心动画提供了一组非常强大的动画API,通过该组API可以高效的实现绝大部分绚丽的动画效果 注意事项 核心动画的操作在子线程中执行,不会阻塞主线程 核心动画直接作用与CALayer对象上,不是UIView对象上 核心动画与UIView动画的区别 核心动画不会改变控件的frame属性,显示的只是一种假象 UIView动画会改变控件的frame属性,显示的是控件真实...

agah91620的博客 164

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

IOS开发之——CABasicAnimation(95)(1),一线互联网架构师筑基必备技能之Android篇

各行各样都会淘汰一些能力差的,不仅仅是IT这个行业,所以,不要被程序猿是吃青春饭等等这类话题所吓倒,也不要觉得,找到一份工作,就享受安逸的生活,你在安逸的同时,别人正在奋力的向前跑,这样与别人的差距也就会越来越遥远,加油,希望,我们每一个人,成为更好的自己。BAT大厂面试题、独家面试工具包,资料包括 数据结构、Kotlin、计算机网络、Framework源码、数据结构与算法、小程序、NDK、Flutter《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取。

2301_79056696的博客 945

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

作为iOS程序员,最核心的60%能力有哪些?

作为iOS程序员,最核心的60%能力有哪些? 一个合格的iOS程序员需要掌握多少核心技能?你和专业的开发工程师的差距有多大?你现在的水平能开发一个功能完整性能高效的iOS APP吗?一起来看看下面的iOS程序员60%核心技能的盘点,查漏补缺吧!1. 语言基础无论哪种开发,都离不开程序语言的学习。Objective-C是iOS的官方语言,更是学习和理解iOS开发的基础。万丈高楼平地...

a359798678的博客 612

从Paper到全球应用:Shimmer如何彻底改变iOS加载体验

Shimmer是一款简单易用的iOS开源库,能为应用中的任何视图添加优雅的微光闪烁效果,作为一种不显眼的加载指示器,已成为全球iOS开发者的必备工具。最初为Facebook Paper应用开发,如今已被广泛应用于各类iOS项目中。 ## 🌟 什么是Shimmer?它解决了什么问题? 在移动应用开发中,加载状态的展示一直是个挑战。传统的活动指示器(如旋转的菊花)往往会打断用户体验,而Shimm

gitblog_00236的博客 863

1、iPhone游戏开发必备

1、开发工具和开发环境 objective-c Xcode 2、UIKit 不是所有的游戏都需要高级的游戏引擎,UIkit也可以 3、Quartz 2D  Core Animation Quartz显然是2D绘图引擎,但在游戏开发中,占据了举足轻重的地位,如果你想快速的开发一款小游戏,这是一个不错的选择,通过Core Animation轻松的为游戏添加大量的动画渲染。 4、Ope

LX10752p的专栏 862

学习iOS最权威的网站

  一、Apple  开发者网站 官方文档 https://developer.apple.com/documentation     除了这两个、还有 Core Foundation  Core Animation Core Image  等、 赶快点击网站去瞧瞧吧 https://developer.apple.com/documentation   二、Apple 官方 示例代码 http...

weixin_34404393的博客 138

IOS面试考察(三):底层原理相关问题

文章目录IOS面试考察(三):底层原理相关问题 IOS面试考察(三):底层原理相关问题

kyl282889543的博客 717

iOS 编写高质量Objective-C代码(八)

级别: ★★☆☆☆ 标签:「iOS」「Foundation」「Objective-C」 作者: MrLiuQ 审校: QiShare团队 前言: 这几篇文章是小编在钻研《Effective Objective-C 2.0》的知识产出,其中包含作者和小编的观点,以及小编整理的一些demo。希望能帮助大家以简洁的文字快速领悟原作者的精华。 在这里,QiShare团队向原作者Matt Gallowa...

weixin_33997389的博客 97

无法绘制一个或多个图层:_UIBezierPath课程:如何在图层上绘制Cuphead

无法绘制一个或多个图层:I have a lot of custom shape layers and bezier paths on my last projects. I want to share my experience in custom shapes drawing. The knowledge about Core Animation has some interesting pr...

weixin_26638123的博客 931

iOS 开发 初级:Multimedia开发简介

本文及接下来的一系列文章将介绍iOS开发中关于Multimedia即多媒体的使用。 Multimedia多媒体包含了Audio音频,Video视频以及Image图像三部分。在iOS中有专门一个Layer即Media Layer来处理,涉及的framework如下: #1 Graphics Technology  图形技术 1、Core Graphics Framework    2

Flood Sung的专栏 2941

Core Animation Introduction(apple官方文档翻译与学习01)

1.关于核心动画核心动画是图形渲染,是动画基础设施; 在iOS和mac OS X均可使用; 用来给应用程序的视图和其他视觉元素添加动画; 使用核心动画,不需要我们自己画动画的每一帧; 你要做的就是配置几个动画参数(比如开始和结束点),然后告诉核心动画开始吧; 核心动画会坐剩余的事情,把大部分的实际绘图工作交给图形硬件加速渲染; 这种自动图形加速会产生高帧率和平滑的动画,并且不会加重CPU

旭旭的专栏 532
上一篇: RxSwift+Moya之项目实战
下一篇: iOS之POP动画使用和实战
CodeTitan
博客等级 码龄9年 51粉丝 102原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值