用Swift实现一个弹性动画

SwiftUI中应用Hero动画(Hero Animation)时一些需要填的坑 在本篇博文中,我们讨论了如何在SwiftUI中实现Hero动画效果;同时详细介绍了在实现中遇到的各种大小坑以及如何填平它们;最后我们谈了谈Hero动画如何兼容iOS 14之前的系统。 阅读详情

每个像样的iOS应用程序一定会有自定义元素、自定义UI以及自定义动画等等很多自定义的东西。

假如你想让你的应用脱颖而出,你必须花费一些时间为你的应用增添一些独特的元素,这些元素将会使你的应用耳目一新。

在这个教程中,你将学会如何创建一个自定义的文本框视图(text field view),当你点击这个文本框时,它的边框会有一个令人愉悦的弹性动画,效果如下图:

在学习的过程中,你讲会用到许多有趣的API:

  • CAShapeLayer

  • CADisplayLink

  • UIView spring animations

  • IBInspectable

开始吧!


首先下载启动项目ElasticUI-Starter。

这个工程是基于Single View Applicetion模板的应用,创建过程是iOS\Application\Single View Application。目前在container view里有两个文本框和一个按钮。

001.png

你的目标是当用户点击时给它们一个伸缩的弹性动画。怎么实现这个功能?

002.jpg

这个技术是很简单的,你将会用到四个control point views和一个CAShapeLayer对象,然后使用UIView的spring animations动画使control points做动画。当它们

在动画过程中时,你要重绘它们位置周围的形状。

注意:如果你不熟悉CAShapeLayer这个类,请参阅 这里 Scott Gardner写的一篇很棒的教程,能够迅速的帮你入门。

这个动画看起来似乎有点复杂,但不用担心,它比你想象中要容易。

创建一个基本的弹性视图

首先,你要创建一个基本的弹性视图,并且把它作为子视图嵌入到UITextfield中,然后激活这个视图并控制弹性动画。

在工程的导航器上,选中ElasticUI文件夹右击选择新建文件,然后选择iOS/Source/Cocoa Touch Class模板,然后点击下一步,命名这个类名为ElasticView,它的父

类选择UIView ,语言选择swift。单击Next,然后选择默认位置来创建存储文件相关的新类。

最重要的是,你需要创建4个控制点和一个CAShapeLayer对象。添加下面的代码,最终得到的类定义:

import UIKit
 
class ElasticView: UIView {
 
  private let topControlPointView = UIView()
  private let leftControlPointView = UIView()
  private let bottomControlPointView = UIView()
  private let rightControlPointView = UIView()
 
  private let elasticShape = CAShapeLayer()
 
  override init(frame: CGRect) {
    super.init(frame: frame)
    setupComponents()
  }
 
  required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    setupComponents()
  }
 
  private func setupComponents() {
 
  }
}

这些视图和图层能够立即创建。setUpComponents()是一个配置方法,它会在所有的初始化方法中调用。现在你要设法实现它。

在setUpComponents()方法中增添如下代码:

elasticShape.fillColor = backgroundColor?.CGColor
elasticShape.path = UIBezierPath(rect: self.bounds).CGPath
layer.addSublayer(elasticShape)

以上是配置图形图层,设置它的填充色和ElasticView的背景色一样,填充的路径的和视图的边界一样。最后把它添加到图层结构上。

接下来,在setUpComponents()方法的最后添加以下代码:

for controlPoint in [topControlPointView, leftControlPointView,
  bottomControlPointView, rightControlPointView] {
  addSubview(controlPoint)
  controlPoint.frame = CGRect(x: 0.0, y: 0.0, width: 5.0, height: 5.0)
  controlPoint.backgroundColor = UIColor.blueColor()
}

在你的视图上添加了四个控制点。为了更好地调试,我们把控制点的背景色改成了蓝色,这样容易在模拟器里看到它们。在教程的最后部分你会移除这段代码。

你需要把这些控制点分别放到上边界中心、下边界中心、左边界中心和右边界中心。这样做是为了,当你让它们离开视图的时候,你可以利用它们的位置在你的CAShapeLayer对象上绘制新的路径。

这个操作会频繁进行,因此创建一个新的函数来是实现它。在ElasticView.swift文件中中添加以下代码:

private func positionControlPoints(){
  topControlPointView.center = CGPoint(x: bounds.midX, y: 0.0)
  leftControlPointView.center = CGPoint(x: 0.0, y: bounds.midY)
  bottomControlPointView.center = CGPoint(x:bounds.midX, y: bounds.maxY)
  rightControlPointView.center = CGPoint(x: bounds.maxX, y: bounds.midY)
}

这个函数在视图边界上将每个控制点移到正确的位置。

在setUpComponents()函数调用之后调用新的函数:

positionControlPoints()

在实现动画之前,你可以在storyboard添加一个View把玩一下,这样你就可以知道ElasticView类是怎么工作的。

打开Main.storyboard文件,拉一个UIView对象到Controller的视图上,设置它的Custom Class为ElasticView。不用在意它的位置,只要保证它在屏幕内就可以,接下来你就可以看到将要发生的事。

003.png

编译并运行程序:

004.png

看上图,四个小的蓝色正方形--它们就是你在setupComponents函数中添加的控制点视图。现在为了得到弹性效果,你将会在CAShapeLayer对象上用它们创建一个路径。

使用UIBezierPath类绘制图形


在你探究接下来的一系列步骤之前,想象下如何绘制2D图形--具体来说,你依赖画线,特别是直线和曲线。在画任何线之前,不论是直线还算复杂的曲线,你需要至少确定起点和终点,或者更多的位置点。

这些点全是CGponit类,你必须确认这些点在当前坐标系下的X坐标和Y坐标。

如果你想要矢量图形,例如正方形、多边形或者复杂的弯曲图形,会更复杂。

想要模拟弹性效果,你要画一个二次贝塞尔曲线(Quadratic Bézier Curves),看起来像个长方形,但是这个长方形的每个边都有一个控制点,并且它提供了一个有弹性效果的曲线。

贝塞尔曲线是以Pierre Bézier的名字命名的,他是一位法国的工程师,在CAD/CAM系统下从事展现曲线的工作。下面是贝塞尔曲线的样式:

32.png

蓝色的实心圆是控制点,它们是你之前创建的4个视图,红色的点是长方形的顶点。

注意:苹果公司对 UIBezierPath类 的文档介绍已经很深入了,如果你想深入了解如何创建一个路径,它还是值得一看的。

现在是时候把理论付诸实践了。在ElasticView.swift文件中添加下面的方法:

private func bezierPathForControlPoints()->CGPathRef {
  // 1
  let path = UIBezierPath()
 
  // 2
  let top = topControlPointView.layer.presentationLayer().position
  let left = leftControlPointView.layer.presentationLayer().position
  let bottom = bottomControlPointView.layer.presentationLayer().position
  let right = rightControlPointView.layer.presentationLayer().position
 
  let width = frame.size.width
  let height = frame.size.height
 
  // 3
  path.moveToPoint(CGPointMake(0, 0))
  path.addQuadCurveToPoint(CGPointMake(width, 0), controlPoint: top)
  path.addQuadCurveToPoint(CGPointMake(width, height), controlPoint:right)
  path.addQuadCurveToPoint(CGPointMake(0, height), controlPoint:bottom)
  path.addQuadCurveToPoint(CGPointMake(0, 0), controlPoint: left)
 
  // 4
  return path.CGPath
}

在上面的函数中的代码有一点复杂,所以下面是分步解析一下,方便大家理解:

1、创建一个UIBezierPath类对象来保存你的形状。

2、提取四个控制点的位置分别为top、left、bottom和right四个常量。使用presentationLayer的原因是为了在控制点视图动画期间得到它们变化中的的位置。

3、通过长方形的顶点和4个控制点,绘制曲线,来创建路径。

4、返回路径的CGPathRef,这就是我们期望的图层形状。

当控制点在动画过程中的时候,你需要调用这个方法,因为它可以一直在重绘新的图形。到底该怎么做呢?

QQ截图20150826142038.png

CADisplayLink 对象是一个定时器,它允许应用程序的活动和显示器的刷新率同步。你只需要添加一个target和一个action,那么当屏幕的内容更新的时候,action方法将会被调用。

它是一个很完美的机会去重绘你的路径并且更新你的图形图层。

首先,添加一个每次更新都必须调用的方法:

func updateLoop() {
  elasticShape.path = bezierPathForControlPoints()
}

然后,在ElasticView.swift类中创建一个CADisplayLink对象名为displayLink的变量,代码如下:

private lazy var displayLink : CADisplayLink = {
  let displayLink = CADisplayLink(target: self, selector: Selector("updateLoop"))
  displayLink.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSRunLoopCommonModes)
  return displayLink
}()

这个懒加载模式的变量就是意味着这个对象当你需要用的时候它才会被创建。每次屏幕更新的时候,就会调用updateLoop()函数。你需要开始或启用link,因此增加下面的代码:

private func startUpdateLoop() {
  displayLink.paused = false
}
 
private func stopUpdateLoop() {
  displayLink.paused = true
}

你已经做好了无论什么时候去移动控制点的,然后去画一个新路径的所有准备工作,那么接下来就是移动它们了。

UIView Spring Animations


苹果公司是很擅长添加新的特性的,当iOS系统新版本发布的时候,spring animations 是最近版本包含的众多特性之一,它可以很容易的使你的应用增加令人吃惊的元素。它允许你给动画元素添加自定义的阻尼运动和初始速度,使动画更特殊和有弹性。

注意:如果你想精通动画,点击这里查看iOS Animations by Tutorials。

在ElasticView.swift 中添加以下代码,迅速获得控制点的运动轨迹:

func animateControlPoints() {  
  //1
  let overshootAmount : CGFloat = 10.0
  // 2
  UIView.animateWithDuration(0.25, delay: 0.0, usingSpringWithDamping: 0.9, initialSpringVelocity: 1.5,
    options: nil, animations: {
    // 3
    self.topControlPointView.center.y -= overshootAmount
    self.leftControlPointView.center.x -= overshootAmount
    self.bottomControlPointView.center.y += overshootAmount
    self.rightControlPointView.center.x += overshootAmount
  },
  completion: { _ in
    // 4
    UIView.animateWithDuration(0.45, delay: 0.0, usingSpringWithDamping: 0.15, initialSpringVelocity: 5.5,
      options: nil, animations: {
        // 5
        self.positionControlPoints()
      },
      completion: { _ in
        // 6
        self.stopUpdateLoop()
      })
  })
}

下面是按步骤分解:

1、overshootAmount是控制点移动的偏移量。

2、在spring animation 动画中Block块包含的即将到来的UI变化将会持续0.25秒。假如你不熟悉spring animation 但是擅长物理学,你可以参阅UIView类的官方文档了解damping变量和velocity变量的详细说明。对于并非专家的普通人来说,仅仅知道这两个变量是控制动画如何伸缩的就可以。通过多次修改填写这两个变量的数值来找到我们要的动画效果是很正常的。

3、上下左右移动控制点,将会产生动画。

4、创建另一个spring animation 动画使视图还原。

5、重置控制点的位置——这也是一个动画。

6、动画结束的时候暂停displaylink更新。

目前为止,还没有调用animateControlPoints函数。我们自定义控制的目的是一旦点击视图,就会用动画产生。所以我们最好在touchedBegan函数中调用上面的函数。添加的代码如下:

override func touchesBegan(touches: Set, withEvent event: UIEvent) {
  startUpdateLoop()
  animateControlPoints()
}

运行一下工程,并且点击自定义的视图。瞧一瞧!

005.gif

重构和优化

你已经看到这个很酷的动画,但是为了使ElasticView类更加抽象你还是有很多工作要处理的。

第一个障碍是清除overshootAmount。目前,它以硬编码的方式设置值为10,但是我们希望它的值应该可以通过编程方式和Interface Builder来改变,这将是一个很大的改变。

k.jpg

@IBInspectable 是Xcode 6.0 的一个新特性,它是通过nterface Builder 设置自定义属性的很好的途径。

注意:假如你想了解更多关于@IBInspectable,请参阅Caroline Begbie写的 Modern Core Graphics with Swift。

你将使用这个令人惊叹的新特性增加一个@IBInspectable 类型的overshootAmount属性,这样你创建的每一个ElasticView类的对象可以设置成不同的值。

在ElasticView类中增添下面的代码:

@IBInspectable var overshootAmount : CGFloat = 10

在animateControlPoints() 函数中引用这个属性 ,用

let overshootAmount = self.overshootAmount

替换

let overshootAmount : CGFloat = 10.0

打开Main.storyboard,点击ElasticView,然后选择Attributes Inspector选项卡,具体如下图:

l-645x500.png

你将会看到一个新的选项,显示了自定视图的类名和一个以Overshoot A…命名的输入框。

使用 @IBInspectable声明的每一个变量,都可以在Interface Builder界面上看到一个输入框,在这个输入框里可以设置它的值。

为了看到这中现象,复制当前的ElasticView,这样你就得到两个视图,把新的视图放到原来视图的上面,如下图所示:

33.png

设置新视图和老视图Overshoot Amount属性值分别为40和20.

编译并运行程序。点击两个视图发现不同之处。正如你看到的那样,不同的动画效果依赖于你在Interface builderz中设置的Overshoot Amount值。

n.gif

改变新视图中Overshoot Amount的值为-40,看看会发生什么。你会看到4个控制点向内运动,但是背景却没有发生改变。

o.gif

你是否准备好自己去修复这个bug? 我打赌你可以做到的!

我给你一条线索:你需要在setupComponents方法中做些改变。靠自己试一下,但是如果你遇到了困难,看一下下面的解决方法。

解决方案

// You have to change the background color of your view after the elasticShape is created, otherwise the view and layer have the same color
backgroundColor = UIColor.clearColor()
clipsToBounds = false

现在你已经完成了ElasticView这个类,你可以将它嵌入不同的控件,例如文本框和按钮等等。

制作一个弹性的UITextfield


你已经建立建立了具有核心功能的弹性视图,下一步就是把它嵌入到自定义的文本框中。

右击ElasticUI工程的导航栏,然后选择New File…命令,选择iOS/Source/Cocoa Touch Class模板,然后点击下一步。

命名为ElasticTextField,父类选UITextfield,编程语言选择Swift。点击下一步然后创建。

打开ElasticTextField.swift文件,把他的内容替换成下面的代码:

import UIKit
 
class ElasticTextField: UITextField {
 
  // 1
  var elasticView : ElasticView!
 
  // 2
  @IBInspectable var overshootAmount: CGFloat = 10 {
    didSet {
      elasticView.overshootAmount = overshootAmount
    }
  }
 
  // 3
  override init(frame: CGRect) {
    super.init(frame: frame)
    setupView()
  }
 
  required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    setupView()
  }
 
  // 4
  func setupView() {
    // A
    clipsToBounds = false
    borderStyle = .None
 
    // B
    elasticView = ElasticView(frame: bounds)
    elasticView.backgroundColor = backgroundColor
    addSubview(elasticView)
 
    // C
    backgroundColor = UIColor.clearColor()
 
    // D
    elasticView.userInteractionEnabled = false
  }
 
  // 5
  override func touchesBegan(touches: Set, withEvent event: UIEvent) {
    elasticView.touchesBegan(touches, withEvent: event)
  }
}

这里有很多逻辑,下面我们一步步分解:

1、有一个ElasticView类型的属性

2、一个叫做overshootAmount的变量,它是IBInspectable类型,所以你可以通过Interface Builder灵活的控制它的值。重写了didSet方法,你只需设置弹性视图的overshootAmount的值就可以了。

3、两个标准的初始化方法,它们都调用可setupView()方法。

4、这里是配置文本框的方法,下面让我们更详细的分解讲述它:

a.设置clipsToBounds值为false,这可以是弹性视图的大小可以超过其父视图的大小,改变UITextfield的borderStyle属性为.None,使它变成扁平的。

b.创建一个ElasticView对象并添加到当前视图上作为子视图。

c.改变当前视图的背景色为透明色,这样做的原因是让ElasticView决定视图的背景色。

d.最后,设置ElasticView的userInteractionEnabled属性为false. 否则它将会触发当前视图的Touches事件。

5、重写touchesBegan方法,并将它传递到ElasticView,使它可以做动画。

打开Main.storyboard,选中两个UITextfield对象,在Identity Inspector中把类类型从UITextField改成ElasticTextField类型。

当然,你也要删除那两个为了测试而创建的ElasticView对象。


34.png

运行程序,点击文本框,你会发现实际上它并没有用。

Last.gif

原因是在你创建ElasticView的时候,设置的只是shaperLayer的背景色为透明的,并不是视图本身。

要解决这个bug,你需要一个方法,这个方法的作用是无论何时你给视图设置背景色时,都要使视图的shape layer 设置成和视图相同的颜色。

传递背景色

因为你想用elasticShape 作为你视图的主要背景色,所以你需要在ElasticView类中重写backgroundColor方法。

在ElasticView.swift文件中增添下面的代码:

override var backgroundColor: UIColor? {
  willSet {
    if let newValue = newValue {
      elasticShape.fillColor = newValue.CGColor
      super.backgroundColor = UIColor.clearColor()
    }
  }
}

willSet方法在你设定值之前被调用,你会发现这个值已经被传递,然后将fillColor的颜色设置为用户选择的颜色,随后你会调用super并将其背景色设置为clearColor。

运行程序,你就会得到一个很棒的弹性视图。你一定很开心。

06.gif

最后的调整
你会发现UITextfield的占位符距离它的左边界很近。你不觉得它离得太近了吗?你想自己修复这个bug吗?这次没有提示,如果你遇到了困难,看看下面的代码:

// Add some padding to the text and editing bounds
override func textRectForBounds(bounds: CGRect) -> CGRect {
  return CGRectInset(bounds, 10, 5)
}
 
override func editingRectForBounds(bounds: CGRect) -> CGRect {
  return CGRectInset(bounds, 10, 5)
}

移除调试信息


打开 ElasticView.swift文件并且从setupComopents方法中移除下面的代码:

controlPoint.backgroundColor = UIColor.blueColor()

目前,你应该会以你已经完成的工作而骄傲。因为你已经把一个系统UITextfield控件变成了可伸缩的视图,并且创建了一个可以可以嵌套到各种UI控件的自定的可伸缩的UIView视图。

下一步


这里有一个完整项目的 链接

你有一个完整的弹性文本框,并且很多UI控件都可以应用这些技术。

您已经了解了如何使用视图位置改变自定义形状和添加反弹效果。拥有此技能,就可以说世界尽在你的掌握之中。

深入研究的话,你可以尝试各种不同的动画,增加更多的控制点,绘制一些看起来更炫酷的形状,等等。

更多关于不同动画的学习,请参阅easings.net,内容非常不错。

600.png

在你对这个技术熟悉之后,你可以尝试将BCMeshTransformView集成到你的项目。它是Bartosz Ciechanowski写的一个很好的库,你可以操作你视图上的单独的像素点。

想象一下如果你可以把像素点变成各种不同的形状是多么酷的一件事情。

如何使用Swift语言创建一个弹性UI控件是一个有趣的讲解,我希望你能从这个讲解中学到一些东西。

swift-UIDynamicDemo一个小球弹性碰撞(UIDynamic和CMMotion综合使用) UIDynamicDemo 一个小球弹性碰撞(UIDynamic和CMMotion综合使用) 立即下载

相关推荐

图像调整亮度饱和度 c语言,【C#/WPF】调节图像的HSL(色相、饱和度、明亮度)...

先说概念:HSL是一种描述颜色的方式(其他颜色描述方式还有大家熟悉的RGB值)。HSL三个字母分别表示图像的Hue色相、Saturation饱和度、Lightness明亮度。需求:制作一个面板,包含三个滑动条,拖动滑动条可以修改目标图片的HSL值。即模仿PS中类似的功能,如下图:方案一:遍历所有像素点,修改每个点的HSL值。前台界面:一个Image控件显示目标图片,一个Button按钮点击一下降低...

weixin_39935777的博客 1155

vue3 setup语法糖中使用component动态组件

vue3 setup语法糖中使用component动态组件。

MuSui12的博客 7506

OpenHarmony 4.1/5.0 Beta上手:如何用ArkUI在非华为设备上开发你的第一个“鸿蒙”应用

本文详细介绍了如何在非华为设备上使用ArkUI开发OpenHarmony应用,涵盖从设备选型、环境搭建到应用部署的全流程。通过实战案例展示ArkTS语言在开源鸿蒙生态中的应用,帮助开发者突破设备限制,构建跨平台鸿蒙应用。

weixin_33704234的博客 366

【译】如何用Swift实现一个好玩的弹性动画

原文:How To Create an Elastic Animation with Swift 每个像样的iOS应用程序一定会有自定义元素、自定义UI以及自定义动画等等很多自定义的东西。 假如你想让你的应用脱颖而出,你必须花费一些时间为你的应用增添一些独特的元素,这些元素将会使你的应用耳目一新。 在这个教程中,你将学会如何创建一个自定义的文本框视图(text field

Vic 666

详解TCP/IP五层模型

TCP/IP模型是一个网络通信体系结构,由五层组成,每一层都有其特定的功能。应用层传输层网络层数据链路层物理层每一层都有不同的责任,通过这种层次结构,网络通信可以更有效地进行。

2201_75437633的博客 1万+

S7-200SMART通过表格指令实现模拟量信号滑动平均值滤波的具体方法

S7-200SMART通过表格指令实现模拟量信号滑动平均值滤波的具体方法

Robot_PLC_HMI_Automation 6724

vue3 - 组件注册和组件通信(setup语法糖)

vue3中组件的注册和组件通信(setup语法糖)

尽日寻春不见春,芒鞋踏遍陇头云。归来笑拈梅花嗅,春在枝头已十分。 1万+

[网络安全自学篇] 六十八.WannaCry勒索病毒复现及分析(二)MS17-010利用及病毒解析

这是作者的网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您们喜欢,一起进步。前文分享了通过Python利用永恒之蓝漏洞加载WannaCry勒索病毒,并实现对Win7文件加密的过程,但过程较为复杂,为什么不直接利用永恒之蓝呢?所以,这篇文章将直接分享MSF利用MS17-010漏洞进行反弹Shell,再上传勒索病毒进行实验复现,并详细讲解WannaCry勒索病毒的原理。基础性文章,希望对您有所帮助。

杨秀璋的专栏 1万+

微信小程序授权登录和获取手机号功能(详细)

请依次允许获得你的公开信息及手机号码请升级微信版本(四)index.wxss.header {.content {.operBtns{important;important;*/(三)index.jsPage({data: {//判断小程序的API,回调,参数,组件等是否在当前版本可用。AuthorizedLogin: ‘授权登录’,

2401_83916355的博客 3337

40、5G NR射频要求解析

本文详细解析了5G NR射频相关要求,包括参考灵敏度与动态范围的定义、接收机对干扰信号的抗扰性要求(如阻塞、邻道选择性等)、辐射射频要求在FR1和FR2频段的差异,以及多标准无线电基站(MSR)的发展及其对射频要求的影响。内容涵盖测试模型、干扰场景、具体指标和实现挑战,为理解和应用5G NR射频规范提供了全面指导。

qsc901234的博客 245

RAGFlow 系列教程 第三课:后端服务入口与请求生命周期

本文深入解析RAGFlow v0.25.0后端核心机制,重点介绍了Quart框架选型原因和服务启动流程。RAGFlow选择Quart作为Web框架,主要基于其异步能力对LLM调用的支持、Flask生态兼容性以及长响应超时处理优势。文章详细拆解了服务启动的8个关键步骤,从日志初始化到HTTP服务启动,并分析了配置加载、数据库初始化等核心环节。通过源码分析揭示了RAGFlow如何实现动态API注册、双重认证体系等关键技术点,为深入理解该系统的请求处理生命周期提供了基础。

weixin_43674738的博客 188

如何用Swift实现一个好玩的弹性动画

【译】如何用Swift实现一个好玩的弹性动画 2015-09-11 09:00:19 来源: CocoaChina 跟贴 0 条 手机看新闻 本文由CocoaChina译者浅夏@旧时光翻译自Raywenderlich 原文:How To Create an Elastic Animation with Swift 每个像样的iOS应用程序一定会有自定义元素、自定

洛阳如是 590

卸载python弹框报错:Could not set file security for file ‘D:\Config.Msi\abd5.rbf‘. Error: 5. Verify...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 6486

iOS 一个小小的弹性动画CASpringAnimation

现在在很多项目中为了使视觉上有更好的体验效果,通常会加入一些动画,比如在半糖App中的晒照片和晒文字的功能显示,就应用了一个简单的弹性动画,运行的效果是这样的: 也不多说了,直接上代码:let springAnimation = CASpringAnimation.init(keyPath: "position") springAnimation.damping = 9

岁月静好,善待时光。 3347

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

10分钟读懂SweetAlert-iOS:一个受Web启发的Swift动画弹窗库全景概览

**SweetAlert-iOS** 是一个用 Swift 编写的 iOS 动画弹窗库(Animated Alert View),灵感来自经典的 Web 端弹窗库 SweetAlert。它能替代原生的 `UIAlertView` 和 `UIAlertController`,为应用提供带成功打勾、错误打叉、警告呼吸等动效的自定义弹窗,让 iOS 应用中的弹窗交互更生动、更具仪式感。🎉 ## 一、

gitblog_01060的博客 69

廖雪峰Python教程[完整版]

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

PullToBounce开发者指南:贡献代码与扩展功能

PullToBounce是一个为UIScrollView提供动画效果的"下拉刷新"库,灵感来源于Dribbble上的设计作品。本指南将帮助开发者快速了解如何贡献代码和扩展功能,让你的iOS应用拥有令人惊艳的下拉刷新体验。 ## 项目结构概览 PullToBounce项目采用清晰的模块化结构,主要包含以下核心目录: - **PullToBounce/Source**:核心动画实现代码 -

gitblog_00632的博客 417

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

弹簧效果

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34259232的博客 179

SweetAlert-iOS vs UIAlertController:如何用一个单文件库替换原生弹窗?

SweetAlert-iOS 是一个用 Swift 编写的 iOS 单文件动效弹窗(Animated Alert View)库。如果你受够了系统 UIAlertController 千篇一律的样式,想让确认删除、操作成功等场景弹出带"弹性"入场动画、打勾/打叉图标的自定义对话框,只需要把 **一个 .swift 文件** 拖进工程即可替换原生弹窗。本文对比两者差异,并给出最快上手路径。 ## 一

gitblog_00334的博客 37

如何在5分钟内为你的UICollectionView添加BouncyLayout弹跳效果

想让你的iOS应用界面充满活力吗?BouncyLayout是一个神奇的Swift库,它能让你轻松为UICollectionView添加令人愉悦的弹跳动画效果!无论你是开发聊天应用、照片集还是数据图表,这个简单易用的布局工具都能让你的界面元素像弹簧一样生动弹跳。🎯 ## 什么是BouncyLayout弹跳效果? BouncyLayout是一个基于UIDynamicAnimator的集合视图布局

gitblog_00357的博客 310

SWIFT SPRING是一个基于Swift编写的动画库,是目前Swift中最常用的动画库之一

这些只是在SwiftUI中使用动画效果的几种方法,还有其他更高级的动画技术可以探索。以上是SWIFT SPRING中一些常用的动画效果,您可以根据需要选择适合的动画效果来增强您的应用程序的用户体验。微动(Microinteraction):通过微小的动画效果来增强用户体验,例如按钮按下时的微小动画效果。惯性弹跳(Inertial Bounce):模拟物体在弹簧上弹跳的效果,使视图具有弹性和反弹的动画效果。橡皮筋(Rubber Band):模拟橡皮筋的拉伸和回弹效果,使视图具有弹性和反弹的动画效果。

[Blog][Domain] programb.blog.youkuaiyun.com 1418

swift给tabbar的item加个弹性动画

模仿淘宝的tabbar的弹性动画效果 1.在tabbarViewController中重写   override func viewWillLayoutSubviews() {      super.viewWillLayoutSubviews()      print(self.tabBar.subviews)      //MARK:遍历出UITabBarButton     for vi...

qq_33846776的博客 654

FlowingMenu核心原理揭秘:弹性形变与流动动画的Swift实现技巧

FlowingMenu是一款基于Swift开发的交互式视图过渡框架,专注于实现具有流动和弹跳效果的菜单展示动画。它通过精妙的数学计算和UIKit动画系统,为iOS应用带来了流畅自然的菜单过渡体验,让用户交互更具生命力和愉悦感。 ## 核心架构:FlowingMenuTransitionManager的角色与职责 FlowingMenu的核心引擎是`FlowingMenuTransitionMa

gitblog_00268的博客 758

Swift 弹性动画教程

原文:How To Create an Elastic Animation with Swift 作者:Daniel Tavares 译者:kmyhy 每个优雅的 iOS app 都会有一些定制的元素,定制的 UI、定制动画等等。定制、定制、定制,重要的事情重复三遍。如果你想让自己的 app 与众不同,你肯定在某些独一无二的特性上花了大量的时间,正是这些特性让你的 app 闪闪发光。在本

kmyhy的专栏 3112

Swift iOS动画终极指南:如何使用Spring库让你的应用动起来

你是否曾为iOS应用添加流畅动画而头疼?复杂的Core Animation API、繁琐的代码配置,让很多开发者望而却步。今天我要介绍的Spring库,正是为了解决这个痛点而生。Spring是一个专为Swift开发者设计的轻量级动画库,它能让你用几行代码就能创建出专业级的iOS动画效果。无论是按钮点击反馈、页面转场还是复杂的视图动画,Spring都能轻松应对。 ## 为什么选择Spring而不是

gitblog_01114的博客 885

Swift礼物动画实现:JQGiftAnimation核心动画技术深度解析

想要为你的iOS应用添加炫酷的礼物动画效果吗?🎁 今天我们来深度解析Swift项目中一个优秀的礼物动画实现方案——JQGiftAnimation。这个开源项目展示了如何在直播、社交等应用场景中实现流畅的礼物赠送动画效果,是Swift开发者学习iOS动画技术的绝佳案例。 ## 🔥 为什么需要专业的礼物动画? 在直播平台、社交应用中,礼物赠送是用户互动的重要方式。一个优秀的礼物动画不仅能提升用

gitblog_02254的博客 1013
上一篇: iOS SEL(@selector)原理
下一篇: 对UIView动画和Core Animation的关系的一点理解
magic_castle
博客等级 码龄12年 1粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值