iOS一文轻松了解UIKit动画制作,如此简单

UIKit框架在iOS开发中的作用与包含的核心类 UIKit框架是iOS开发中不可或缺的一部分,它为开发者提供了构建和管理图形用户界面所需的所有基础工具和类。通过UIKit框架,开发者可以轻松地创建各种用户界面元素、处理用户输入和交互、实现动画效果以及构建复杂的用户交互逻辑。本文详细介绍了UIKit框架在iOS开发中的作用以及其核心类,希望能够帮助开发者更好地理解和使用UIKit框架来构建优秀的iOS应用程序。 阅读详情

动画 - UIKit

动画原理

  • 视觉残留效应
  • 运动模糊

做动画的时候要达到 60FPS 时候,画面才能流畅,不然用户会感觉界面卡顿。

UIView 提供的动画支持

UIView 动画本质上对 Core Animation 的封装,提供一个简洁好用的动画接口,在要求不复杂的情况下,完全可以实现很多动画。
UIView 动画可以设置的动画属性有:

  • frame / bounds 大小变化
  • center 中心位置
  • transform 旋转平移等
  • alpha 透明度
  • backgroundColor 背景颜色
  • contentStretch 拉伸内容
  • Autolayout环境下的动画要直接修改constraint,注意 setNeedsUpdateConstraints,layoutIfNeeded的用法

UIView 类方法动画

  • 动画的开始和结束方法
  • UIView Block动画
  • Spring 动画
  • Keyframes 动画
  • 转场动画

    • 单个视图的过渡
    • 从旧视图到新视图的过渡

1. 动画的开始和结束方法

基本语句:

动画开始结束标记
UIView.beginAnimations(String?, context: UnsafeMutablePointer<Void>)
第一个参数是动画标识,第二个参数是附加参数,在设置了代理的情况下,此参数将发送setAnimationWillStartSelector 和 setAnimationDidStopSelector 所指定的方法,一般设为 nil。

UIView.commitAnimations() 动画结束

动画参数设置方法

  • UIView.setAnimationDelay(NSTimeInterval) 设置动画的延时
  • UIView.setAnimationDuration(NSTimeInterval) 设置动画持续时间
  • UIView.setAnimationDelegate(AnyObject?) 设置动画代理
  • UIView.setAnimationWillStartSelector(Selector) 设置动画即将开始时代理执行的SEL
  • UIView.setAnimationDidStopSelector(Selector) 设置动画结束时代理对象执行的SEL
  • UIView.setAnimationRepeatCount(Float) 设置动画的重复次数
  • UIView.setAnimationCurve(UIViewAnimationCurve) 设置动画的曲线
  • UIView.setAnimationRepeatAutoreverses(Bool) 设置动画是否继续执行相反的动画
  • UIView.setAnimationsEnabled(Bool) 是否禁用动画效果(对象属性依然会被改变,只是没有动画效果)
  • UIView.setAnimationBeginsFromCurrentState(Bool) 设置是否从当前状态开始播放动画

    • 假设上一个动画正在播放,且尚未播放完毕,我们将要进行一个新的动画:
    • 当为true时:动画将从上一个动画所在的状态开始播放
    • 当为false时:动画将从上一个动画所指定的最终状态开始播放(此时上一个动画马上结束)

以下是简单的例子:

2. UIView Block 动画

1)最简单的 Block 动画 包含时间和动画

UIView.animateWithDuration(NSTimeInterval) { // 动画持续时间 
            <#code#>//执行动画
        }

2)带有动画完成回调的 Block 动画

UIView.animateWithDuration(NSTimeInterval, animations: { 
            <#code#>//执行动画
            }) { (Bool) in
                <#code#>// 动画完毕后执行的操作
        }

3)可以设置延迟和过渡效果 Block 动画

 UIView.animateWithDuration(NSTimeInterval, delay: NSTimeInterval, options: UIViewAnimationOptions, animations: { 
            <#code#>
            }) { (<#Bool#>) in
                <#code#>
        }

注意,此处的 UIViewAnimationOptions 可以组合使用,在 swift 中写法 options: [UIViewAnimationOptions.CurveEaseInOut, UIViewAnimationOptions.Repeat]
具体的枚举值,看官方文档即可。

4)Spring 动画
iOS7 后新增 Spring 动画,iOS 系统动画大部分采用 Spring Animation。

UIView.animateWithDuration(NSTimeInterval, delay: NSTimeInterval, usingSpringWithDamping: CGFloat, initialSpringVelocity: CGFloat, options: UIViewAnimationOptions, animations: {
            <#code#>
            }) { (<#Bool#>) in
                <#code#>
        }
  • Duration: 动画持续时间
  • delay: 动画执行延时
  • usingSpringWithDamping: 震动效果,范围 0~1,数值越小,震动效果越明显
  • initialSpringVelocity: 初始速度
  • options: 动画的过渡效果

5)Keyframes 关键帧动画

UIView.animateKeyframesWithDuration(NSTimeInterval, delay: NSTimeInterval, options: UIViewKeyframeAnimationOptions, animations: { 
            <#code#>
            }) { (<#Bool#>) in
                <#code#>
        }

增加关键帧的方法

UIView.addKeyframeWithRelativeStartTime(Double, relativeDuration: Double, animations: { 
                <#code#>
            })

注意开始时间和持续时间均是占总时间的比例

UIViewKeyframeAnimationOptions 的枚举值如下,可以组合使用

UIViewAnimationOptionLayoutSubviews           //进行动画时布局子控件
UIViewAnimationOptionAllowUserInteraction     //进行动画时允许用户交互
UIViewAnimationOptionBeginFromCurrentState    //从当前状态开始动画
UIViewAnimationOptionRepeat                   //无限重复执行动画
UIViewAnimationOptionAutoreverse              //执行动画回路
UIViewAnimationOptionOverrideInheritedDuration //忽略嵌套动画的执行时间设置
UIViewAnimationOptionOverrideInheritedOptions //不继承父动画设置

UIViewKeyframeAnimationOptionCalculationModeLinear     //运算模式 :连续
UIViewKeyframeAnimationOptionCalculationModeDiscrete   //运算模式 :离散
UIViewKeyframeAnimationOptionCalculationModePaced      //运算模式 :均匀执行
UIViewKeyframeAnimationOptionCalculationModeCubic      //运算模式 :平滑
UIViewKeyframeAnimationOptionCalculationModeCubicPaced //运算模式 :平滑均匀

关键帧动画:

private func blockAni5() {
        UIView.animateKeyframesWithDuration(5, delay: 0.0, options: UIViewKeyframeAnimationOptions.CalculationModeLinear, animations: {
            UIView.addKeyframeWithRelativeStartTime(0, relativeDuration: 1.0/4, animations: {
                self.greenView.backgroundColor = UIColor.redColor()
            })
            
            UIView.addKeyframeWithRelativeStartTime(1.0/4, relativeDuration: 1.0/4, animations: { 
                self.greenView.backgroundColor = UIColor.blackColor()
                self.greenView.frame.size = CGSize(width: 50, height: 50)
            })
            
            UIView.addKeyframeWithRelativeStartTime(2.0/4, relativeDuration: 1.0/4, animations: { 
                self.greenView.backgroundColor = UIColor.yellowColor()
            })
            UIView.addKeyframeWithRelativeStartTime(3.0/4, relativeDuration: 1.0/4, animations: { 
                self.greenView.backgroundColor = UIColor.blueColor()
                self.greenView.frame.size = CGSize(width: 250, height: 250)
            })
            
            
            
            }) { (_) in
                print("动画完成blockAni5()")
        }
    }

简单的例子:

3. UIView 转场动画

在进行示例之前,大家需要注意一点过渡转变动画与动画属性动画的不同之处。我们在创建动画属性动画时只需要在animations闭包中添加对视图动画属性修改的代码即可,它没有作用域或作用视图的概念。而在过渡转变动画中有作用视图的概念,也就是说我们调用过渡转变动画方法时需要指定一个作用视图

过渡转变动画中的作用视图并不是我们的目标视图,而是目标视图的容器视图,那么大家不难想象,如果该容器视图中有多个子视图,那么这些子视图都会有过渡转变动画效果。

1)从旧视图到新视图的转场

 UIView.transitionFromView(UIView, toView: UIView, duration: NSTimeInterval, options: UIViewAnimationOptions) { (<#Bool#>) in
            <#code#>
        }

在该动画过程中,fromView 会从父视图中移除,并将 toView 添加到父视图中。转场动画的作用对象是父视图,过渡效果体现在父视图上

2)单个试图的过渡

UIView.transitionWithView(UIView, duration: NSTimeInterval, options: UIViewAnimationOptions, animations: { 
            <#code#>
            }) { (<#Bool#>) in
                <#code#>
        }

简单的例子

核心动画 CoreAnimations

Core Animation(核心动画)是一组强大的动画 API,是直接操作 CALayer 层来产生动画,相比上述的 UIView 动画,可以实现更复杂的动画效果。

事务管理 CATransaction

CALayer 的可用于动画的属性成为 Animatable properties,苹果官方有详细的列表,显示了所有了可以动画的属性 CALayer Animatable Properties。如果一个Layer对象对应着 View,则称这个 Layer 是一个 Root Layer, 非 Root Layer 一般是通过 CALayer 或者其子类直接创建的。
所有的非 Root Layer 在设置 Amimation Properties 的时候都存在隐式动画,默认的 duration 是0.25秒

事务(transaction)实际上是Core Animation用来包含一系列属性动画集合的机制,用指定事务去改变可以做动画的图层属性,不会立刻发生变化,而是提交事务时用一个动画过渡到新值。任何 Layer 的可动画属性的设置都属于某个 CATransaction,事务的作用是为了保证多个属性的变化同时进行。事务可以嵌套,当事务嵌套时候,只有最外层的事务 commit 之后,整个动画才开始。

CATransaction没有任何实例方法,只有类型方法。CATransaction.begin()和CATransaction.commit()构成了一个动画块:

CATransaction.begin()
/* animation block */
CATransaction.commit()

其他的方法

func animationDuration() -> CFTimeInterval  // get duration, defaults to 0.25s
func setAnimationDuration(dur: CFTimeInterval)  // set duration
func animationTimingFunction() -> CAMediaTimingFunction?  // get timing function
func setAnimationTimingFunction(function: CAMediaTimingFunction?)  // set timing function
func disableActions() -> Bool  // get disable actions state
func setDisableActions(flag: Bool)  // set disable actions state
func completionBlock() -> (() -> Void)?  // get completion block
func setCompletionBlock(block: (() -> Void)?)  // set completion block

以上四组的方法可以用以下两个方法代替

func valueForKey(key: String) -> AnyObject?
func setValue(anObject: AnyObject?, forKey key: String)

CATransaction 动画块只能处理CALayer相关动画,无法正确处理UIView的动画,甚至UIView的 Root layer(与UIView相关联的CALayer)也不行。
UIView 的 Root layer动画为什么会在CATransaction动画块中失效?
隐式动画的查找过程如下:

禁止隐式动画:

我们把改变属性时CALayer自动应用的动画称作行为,当CALayer的属性被修改时候,它会调用-actionForKey:方法,传递属性的名称。剩下的操作都在CALayer的头文件中有详细的说明,实质上是如下几步:

    • 图层首先检测它是否有委托,并且是否实现CALayerDelegate协议指定的-actionForLayer:forKey方法。如果有,直接调用并返回结果。
  • 如果没有委托,或者委托没有实现-actionForLayer:forKey方法,图层接着检查包含属性名称对应行为映射的actions字典。

如果actions字典没有包含对应的属性,那么图层接着在它的style字典接着搜索属性名。

  • 最后,如果在style里面也找不到对应的行为,那么图层将会直接调用定义了每个属性的标准行为的-defaultActionForKey:方法。

所以一轮完整的搜索结束之后,-actionForKey:要么返回空(这种情况下将不会有动画发生),要么是CAAction协议对应的对象,最后CALayer拿这个结果去对先前和当前的值做动画。

于是这就解释了 UIKit 是如何禁用隐式动画的:每个 UIView 对它关联的图层都扮演了一个委托,并且提供了-actionForLayer:forKey 的实现方法。当不在一个动画块的实现中,UIView 对所有图层行为返回 nil,但是在动画 block 范围之内,它就返回了一个非空值。

  • UIView关联的图层禁用了隐式动画,对这种图层做动画的唯一办法就是使用UIView的动画函数(而不是依赖CATransaction),或者继承UIView,并覆盖-actionForLayer:forKey:方法,或者直接创建一个显式动画。
  • 对于单独存在的图层,我们可以通过实现图层的-actionForLayer:forKey:委托方法,或者提供一个actions字典来控制隐式动画。

参考资料 iOS Actions

时间系统

参考谈谈 iOS Animation

CAMediaTiming 协议定义了在一段动画内用来控制逝去时间的属性的集合。CALayer 通过CAMediaTiming协议实现了一个有层级关系的时间系统。

几个重要属性(都是CALayer的属性):

  • beginTime 是相对于父级对象的开始时间
  • timeOffset是active local time的偏移量
  • speed 设置当前对象的时间流逝相对于父级对象时间流的流逝速度
  • fillMode 决定了当前对象过了非 active 时间段的行为

显示动画

当需要对非 Root Layer 进行动画或者需要对动画做更多的自定义的行为的时候,需要使用显示动画,基类为 CAAnimation 

核心动画类中可以直接使用的类有:

  • CABasicAnimation
  • CAKeyframeAnimation
  • CATransition
  • CAAnimationGroup
  • CASpringAnimation

CABasicAnimation有三个比较重要的属性,fromValue,toValue,byValue,这三个属性都是可选的,但不能同时多于两个为非空.最终都是为了确定animation变化的起点和终点.中间的值都是通过插值方式计算出来的.插值计算的结果由timingFunction指定,默认timingFunction为nil,会使用liner的,也就是变化是均匀的.

1. 核心动画类的核心方法

  • 初始化CAAnimation对象

    • 一般使用animation方法生成实例 let animation = CABasicAnimation()
    • 如果是CAPropertyAnimation的子类,可以使用'let animation = CABasicAnimation(keyPath: String?)'来生成
  • 设置动画的相关属性

    • 执行时间
    • 执行曲线
    • keyPath 的目标值
    • 代理等
animation.duration = 2.0
//        animation.fromValue = UIColor.blackColor()
        animation.toValue = NSValue(CGPoint: CGPointMake(300, 300))
        animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
        animation.removedOnCompletion = false
        animation.fillMode = kCAFillModeForwards
  • 动画的添加和移除

    • 调用 CALayer 的 view2.layer.addAnimation(animation, forKey: "color")
    • 停止动画 view2.layer.removeAnimationForKey(String)和view2.layer.removeAllAnimations()

防止动画结束后回到初始状态

只需设置removedOnCompletion、fillMode两个属性就可以了。

transformAnima.removedOnCompletion = NO;
transformAnima.fillMode = kCAFillModeForwards;

解释:为什么动画结束后返回原状态?

给一个视图添加layer动画时,真正移动并不是我们的视图本身,而是 presentation layer 的一个缓存。动画开始时 presentation layer开始移动,原始layer隐藏,动画结束时,presentation layer从屏幕上移除,原始layer显示。这就解释了为什么我们的视图在动画结束后又回到了原来的状态,因为它根本就没动过。
这个同样也可以解释为什么在动画移动过程中,我们为何不能对其进行任何操作。
所以在我们完成layer动画之后,最好将我们的layer属性设置为我们最终状态的属性,然后将presentation layer 移除掉。

2. 核心动画类的常用属性

  • KeyPath:可以指定 KeyPath 为 CALayer 的属性值,并对它修改,注意部分属性是不支持动画的
  • duration:动画的持续时间
  • repeatCount: 动画的重复次数
  • timingFunction:动画的时间节奏控制
  • fillMode:视图在非Active时的行为
  • removedOnCompletion:动画执行完毕后是否从图层上移除,默认为YES(视图会恢复到动画前的状态),可设置为NO(图层保持动画执行后的状态,前提是fillMode设置为kCAFillModeForwards)
  • beginTime:动画延迟执行时间(通过CACurrentMediaTime() + your time 设置)
  • delegate:代理
func animationDidStart(anim: CAAnimation)
 func animationDidStop(anim: CAAnimation, finished flag: Bool)

Timing Function对应的类是CAMediaTimingFunction,它提供了两种获得时间函数的方式,一种是使用预定义的五种时间函数,一种是通过给点两个控制点得到一个时间函数. 相关的方法为

CAMediaTimingFunction(name: String)
CAMediaTimingFunction(controlPoints: Float, c1y: Float, c2x: Float, c2y: Float)

五种预定义的时间函数名字的常量变量分别为

  • kCAMediaTimingFunctionLinear,
  • kCAMediaTimingFunctionEaseIn,
  • kCAMediaTimingFunctionEaseOut,
  • kCAMediaTimingFunctionEaseInEaseOut,
  • kCAMediaTimingFunctionDefault

自定义的 Timing Function 的函数图像就是一条三次的贝塞尔曲线。 

CAKeyframeAnimation动画

两个决定动画关键帧的属性:

  • values: 关键帧数组对象,里面每一个元素就是一个关键帧,动画会在相应时间段内,依次执行数组中每一个关键帧动画
  • path: 动画路径对象,可以指定一个路径,在执行动画时会沿着路径移动,path只能对CALayer的 anchorPoint 和 position 属性起作用
  • keyTimes: 设置关键帧对应的时间点。范围0 ~ 1,默认每一帧时间平分,keyTimes数组中的每个元素定义了相应的keyframe的持续时间值作为动画的总持续时间的一小部分,每个元素的值必须大于、或等于前一个值。keyframeAni.keyTimes = [0.1,0.5,0.7,0.8,1]
  • calculationMode 计算模式,其主要针对的是每一帧的内容为一个座标点的情况,也就是对anchorPoint 和 position 进行的动画,表示插值计算的模式

    • kCAAnimationLinear 默认值 直线相连来差值
    • kCAAnimationDiscrete 离散的,不进行插值计算,所有关键帧逐个显示
    • kCAAnimationPaced 动画均匀的,此时keytimes和timeFunctions无效
    • kCAAnimationCubic 对关键帧为坐标点的关键帧进行圆滑曲线相连后插值计算,对于曲线的形状还可以通过tensionValues,continuityValues,biasValues来进行调整自定义
    • kCAAnimationCubicPaced 在kCAAnimationCubic的基础上使得动画运行变得均匀,就是系统时间内运动的距离相同,此时keyTimes以及timingFunctions也是无效的.

简单例子

CATransition

转场动画,比 UIView 的转场动画具有更多的动画效果。

CATransition的属性:

  • type: 过渡动画的类型

    • kCATransitionFade 渐变
    • kCATransitionMoveIn 覆盖
    • kCATransitionPush 推出
    • kCATransitionReveal 揭开

    私有动画类型的值有:"cube"、"suckEffect"、"oglFlip"、 "rippleEffect"、"pageCurl"、"pageUnCurl"等等

  • subtype: 过渡动画的方向

    • kCATransitionFromRight 从右边
    • kCATransitionFromLeft 从左边
    • kCATransitionFromTop 从顶部
    • kCATransitionFromBottom 从底部

CASpringAnimation

CASpringAnimation是iOS9新加入动画类型,是CABasicAnimation的子类,用于实现弹簧动画。

CASpringAnimation的重要属性:

  • mass:质量(影响弹簧的惯性,质量越大,弹簧惯性越大,运动的幅度越大)
  • stiffness:弹性系数(弹性系数越大,弹簧的运动越快)
  • damping:阻尼系数(阻尼系数越大,弹簧的停止越快)
  • initialVelocity:初始速率(弹簧动画的初始速度大小,弹簧运动的初始方向与初始速率的正负一致,若初始速率为0,表示忽略该属性)
  • settlingDuration:结算时间(根据动画参数估算弹簧开始运动到停止的时间,动画设置的时间最好根据此时间来设置)
   private func springAni() {
        
        let ani = CASpringAnimation(keyPath: "bounds")
        ani.mass = 10.0 //质量,影响图层运动时的弹簧惯性,质量越大,弹簧拉伸和压缩的幅度越大
        ani.stiffness = 5000 //刚度系数(劲度系数/弹性系数),刚度系数越大,形变产生的力就越大,运动越快
        ani.damping = 100.0//阻尼系数,阻止弹簧伸缩的系数,阻尼系数越大,停止越快
        ani.initialVelocity = 5.0//初始速率,动画视图的初始速度大小;速率为正数时,速度方向与运动方向一致,速率为负数时,速度方向与运动方向相反
        ani.duration = ani.settlingDuration
        ani.toValue = NSValue(CGRect: view4.bounds)
        ani.removedOnCompletion = false
        ani.fillMode = kCAFillModeForwards
        ani.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
        view2.layer.addAnimation(ani, forKey: "boundsAni")
        
    }

CAAnimationGroup

使用Group可以将多个动画合并一起加入到层中,Group中所有动画并发执行,可以方便地实现需要多种类型动画的场景,group动画以数组表示。

private func groupAni() {
    
    let posAni = CABasicAnimation(keyPath: "position")
    posAni.toValue = NSValue(CGPoint: CGPoint(x: 310, y: 400))
    let boundAni = CABasicAnimation(keyPath: "bounds")
    boundAni.toValue = NSValue(CGRect: CGRectMake(0, 0, 200, 200))
    let colorAni = CABasicAnimation(keyPath: "backgroundColor")
    colorAni.toValue = UIColor.redColor().CGColor
        
    let groupAni = CAAnimationGroup()
    groupAni.animations = [posAni, boundAni, colorAni]
    groupAni.duration = 1.5
    groupAni.fillMode = kCAFillModeForwards
    groupAni.removedOnCompletion = false
    groupAni.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
    view1.layer.addAnimation(groupAni, forKey: "groupAni")
        
}

文中demo的地址:Github 动画demo

Swift中SwiftUI与UIKit如何选择使用? SwiftUI强调组件化和可重用性,支持丰富的布局和动画效果,同时也与Apple的其他平台和设计语言紧密集成。在Swift开发中,SwiftUI和UIKit是两个重要的UI框架,它们分别提供了不同的方式和工具来构建iOS应用的用户界面。而UIKit则使用传统的帧布局方式,需要手动计算和调整UI元素的尺寸和位置,这在处理复杂布局时可能会变得繁琐。如果项目需要构建复杂的界面布局、丰富的动画和交互效果,或者需要跨平台支持,那么SwiftUI可能是一个更好的选择。在选择框架时,可以考虑个人的编程习惯和偏好。 阅读详情

相关推荐

iOS应用开发从零开始:使用Swift和UIKit构建界面

最后,选择保存项目的位置,并点击"Next"和"Create"。在这段代码中,我们导入了UIKit框架,并创建了一个名为"ViewController"的类,继承自"UIViewController"。在右侧的"Attributes inspector"面板中,找到"Identifier"字段,并将其值设置为"helloLabel"或其他你喜欢的标识符。现在,我们已经完成了界面和代码的连接。接下来,点击Xcode中的"Run"按钮,或使用快捷键"Command + R"来构建和运行应用程序。

BitNetO的博客 1060

iOS UIKit基本概念

UIView就是在屏幕上显示的一个矩形块。除了展示视图之外,还可以拦截用户输入。iOS中,UIView是所有视图的根类。

阿腾木的小世界 2972

iOS常见动画效果实现

以上是几种常见的iOS动画效果实现方法,开发者可以根据具体的需求选择合适的动画效果进行应用开发。请注意,以上的代码示例是使用Swift语言编写的,如果你使用的是Objective-C,可以将相应的代码进行转换来实现相同的效果。上述代码将视图按照指定的比例(scaleValue)进行缩放,并在动画完成后执行相应的操作。上述代码将视图平移至新的坐标(newX, newY)处,并在动画完成后执行相应的操作。上述代码将视图按照指定的角度(angle)进行旋转,并在动画完成后执行相应的操作。

HsvvDatabase的博客 357

UIKit框架在iOS开发中的作用及核心类

UIKit提供了一系列丰富的界面元素、视图控制器、控件以及相关的功能类,使得开发者能够高效地创建出美观、流畅、交互性强的用户界面。同时,随着iOS版本的更新,UIKit框架也在不断完善和扩展,为开发者提供更多强大的功能和更灵活的界面设计选项。每个视图都可以包含子视图,通过添加、移除、调整子视图的位置和大小等操作,开发者可以灵活地管理视图的布局和显示。这种层级结构使得界面的布局更加灵活和动态。通过UIKit提供的相关接口和类,开发者可以轻松地在应用中使用这些特性,增强应用的安全性和用户体验。

陈辰学长的博客 1333

SwiftUI(十九)- 在UIKit中如何使用SwiftUI

在UIKit项目中引入 SwiftUI,无疑能够充分发挥 SwiftUI 的声明式编程优势,提升开发效率和代码的可维护性。通过UIHostingController和UIViewRepresentable,你可以将现有的 UIKit 组件平滑地与 SwiftUI 结合,充分利用两者的优点。动态数据绑定则让你在不同框架之间实现数据的实时同步,避免了手动更新视图的复杂性。SwiftUI 都能为传统的 UIKit 项目带来更强的灵活性和扩展性。

weixin_39339407的博客 1777

UIKit与SwiftUI:探索原生iOS应用开发的性能和功能对比

UIKit和SwiftUI是苹果公司提供的两大iOS应用开发框架。UIKit是较早的,更为成熟的框架,它由丰富的组件和广泛的文档支持,是许多iOS应用开发者的首选。而SwiftUI是苹果在WWDC 2019上推出的新框架,它基于Swift语言,主打声明式编程,能更快速的构建用户界面,并且与UIKit相比,它能更简洁地编写代码。本章将带你快速了解这两个框架的基本概念和特性。UIKit作为iOS平台上成熟的UI框架,提供了丰富的API和高度的定制化能力,使得开发者可以创建出流畅、动态、用户友好的应用程序。

weixin_30700095的博客 1476

WidgetAnimation:iOS小部件动画制作的不二之选

WidgetAnimation:iOS小部件动画制作的不二之选 项目介绍 在如今这个信息时代,iOS小部件(Widget)已经成为用户获取快速信息的重要渠道。为了让小部件更加吸引人,动画效果显得尤为重要。今天,我要向大家推荐一个开源项目——WidgetAnimation,它提供了一种简单高效的方式来创建iOS小部件的动画效果。 项目技术分析 WidgetAnimation项目基于Apple的pub...

gitblog_00528的博客 623

Windows 11 下 WSL 离线安装 Ubuntu 22.04 保姆级教程(国内镜像加速版)

本文提供了一份针对中国地区用户的Windows 11下WSL离线安装Ubuntu 22.04的详细教程。通过使用国内镜像源加速下载安装包,并配合PowerShell命令完成部署,有效解决了官方商店下载缓慢的问题。教程涵盖环境准备、离线包获取、安装初始化及安装后的关键优化配置,帮助用户快速搭建高效的Linux开发环境。

weixin_28452161的博客 1377

iOS开发新手教程:通过ios-starter-kit学习UIKit基础组件

ios-starter-kit是一个专为iOS编程初学者设计的入门工具包,它包含了丰富的UIKit基础组件示例和教程,帮助新手快速掌握iOS应用开发的核心技能。本文将带你通过这个工具包学习最常用的UIKit组件,从零开始构建你的第一个iOS应用界面。 ## 为什么选择ios-starter-kit学习UIKit? 对于iOS开发新手来说,直接阅读官方文档可能会感到枯燥和难以理解。ios-sta

gitblog_00452的博客 1092

STC89C52RC单片机原理图详解

左侧A0和右侧B0为一 一对应的关系,左上角DIR为控制数据方向端口,如果DIR接高电平是将左侧数据A0~A8送到右侧B0~B8,如果DIR接低电平,是将右侧数据B0~B8送到左侧A0~A8,由于在电路板上LE始终与VCC连接,因此这里。74HC595是串行输入,并行输出的移位寄存器,可用3根线输入串行数据,8根线输出并行数据,多片级联后,可输出16位、24位、32位等,常用于I/O口扩展。由于数码管为共阴极,给数码管下面接口输入阳码时,LED才亮,但是直接将P0~P7的高电平输入到数码管时,

m0_50562428的博客 6万+

新手小白入门编程第2讲 JAVA编程环境搭建 JDK与环境变量、Eclipse

1 JDK 1.1 JDK概述 JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。 JDK是整个java开发的核心,它包含了: JAVA开发工具(jdk\bin) 基础开发库(jdk\jre\lib\rt.jar) 基础开发库的源码(jdk\src.zip) 1.2 JDK下载与安装 本次使用的是JDK1.8,详细安装步骤可以参见”JDK培优安装手册”. 注意事项: 同时安装多个JDK时需要使用执行环境变量来确认使用的是哪个jdk 安装时选择默认选项安装到默认

程序媛泡泡的博客 4万+

iOS开发者必备!BFKit让UIKit和Foundation开发效率翻倍的终极技巧

作为iOS开发者,你是否厌倦了重复编写相同的工具代码?想要提升开发效率,专注于业务逻辑而不是基础功能实现?BFKit正是你需要的终极解决方案!这个强大的Objective-C工具库集合了UIKit和Foundation框架中最实用的类别扩展和工具类,让你的iOS开发工作事半功倍。🚀 ## 什么是BFKit?为什么它能让开发效率翻倍? BFKit是一个精心设计的iOS开发工具集合,专门为Obj

gitblog_00894的博客 820

基于ASP.NET+SQLServer的美妆网站的设计与实现

通过本次ASP.NET MVC美妆商城项目的开发,我们实现了一个功能完善、性能稳定的在线购物平台。该项目不仅提升了用户的购物体验,也为商家提供了一个高效的商品管理和销售渠道。未来,我们将持续优化系统功能,提升用户体验,以适应不断变化的市场需求。

毕业设计大牛哥 1497

[IOS] UIKit Dynamics入门

什么是UIKit动力学(UIKit Dynamics) 其实就是UIKit的一套动画和交互体系。我们现在进行UI动画基本都是使用CoreAnimation或者UIView animations。而UIKit动力学最大的特点是将现实世界动力驱动的动画引入了UIKit,比如重力,铰链连接,碰撞,悬挂等效果。一言蔽之,即是,将2D物理引擎引入了人UIKit。需要注意,UIKit动力学的引入,并不是

Simth_zjp的专栏 858

西门子S7-1200控制伺服/步进电机方法与接线(全)

西门子S7-1200控制伺服/步进电机方法与接线(全) 伺服/步进电机在非标自动化控制中十分常用,但作者发现在各类开源网站上很少有人做西门子1200PLC控制伺服/步进电机的教程,于是今天想着跟大家分享一下。 本文共分为一下几个四个内容。 文章目录西门子S7-1200控制伺服/步进电机方法与接线(全)前言一、准备二、接线1.PLC接线:2.伺服接线:3. 步进电机的接线:三、代码组态代码四、可能出现的问题 前言 工程控制常用到三项异步电机、直流电机等,但他们都无法准确的控制电机角度;于是有了步进电机、

weixin_46060068的博客 7万+

K8s入门教程(一)

本教程提供了Kubernetes(K8s)的入门指南,涵盖了从基础概念到实战操作的全面内容。首先介绍了Kubernetes的定义和核心功能,如自动化部署、弹性伸缩、自我修复等。接着,详细讲解了如何在macOS上安装Minikube和kubectl工具,以及如何使用这些工具创建和管理Pod、Deployment和Service等核心资源。教程还包括了实战案例,如部署Nginx应用,并介绍了高级特性如滚动更新和自动伸缩。最后,提供了常见问题的解决方案,帮助用户快速上手和解决实际使用中的问题。

2401_82505179的博客 1689

ios uikit_如何将uikit扩展与ios故事板一起使用

ios uikitStoryboards are a native way to make iOS user interfaces. Recently Apple has introduced SwiftUI, which is supposed to replace UIKit (which is used in storyboards), but currently, most iOS app...

weixin_26735419的博客 302

基于PCL的电力线点云提取与分割实现

本文基于PCL库实现电力线点云提取与分割,包含6个核心处理阶段:文件读取与结果文件夹创建、高程滤波分割候选点云、欧式聚类去噪、电力线分段提取、球形邻域搜索补全点云、最终分割与可视化保存。通过PCA计算点云线性特征(阈值0.91)筛选电力线点,采用欧式聚类(容忍度3.0)去除噪点,并针对不同规模聚类差异化设置球形搜索半径(4.0/6.0)补全点云。最终通过欧式聚类分割并可视化带颜色点云。算法对高程滤波阈值、聚类参数等具有敏感性,需根据点云特性调整优化。

weixin_45196569的博客 192

将UIKit与SwiftUI无缝融合:SwiftUIKitView

将UIKit与SwiftUI无缝融合:SwiftUIKitView 在iOS开发中,SwiftUI以其简洁的声明式语法和直观的界面构建方式,逐渐成为主流。然而,UIKit仍然有很多成熟的视图组件和技术,我们无法忽视其价值。这就是SwiftUIKitView开源库发挥作用的地方——它使你在SwiftUI中轻松使用UIKit视图变得可能。 项目简介 SwiftUIKitView是一个强大的工具,让你能...

gitblog_00013的博客 841

2025华为OD 面试手撕代码真题【字符串至多删除一个字符,是否能构成回文串】

2025华为OD 面试手撕代码真题【字符串至多删除一个字符,是否能构成回文串】

MISAYAONE的博客 1705

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

SwiftUIKitView未来展望:SwiftUI与UIKit融合开发的终极趋势预测

SwiftUIKitView是一款革命性的开源工具,它让开发者能够轻松地在SwiftUI应用中集成UIKit视图,并为UIView元素创建Xcode预览。随着Apple生态系统的不断发展,SwiftUI与UIKit的融合已成为必然趋势,而SwiftUIKitView正站在这一变革的前沿。 ## 为什么SwiftUI与UIKit融合是未来方向? 自SwiftUI推出以来,开发者们就面临一个两难选

gitblog_00487的博客 1204

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

TimLiu-iOS深色模式:UIKit与SwiftUI适配终极指南

深色模式已成为现代iOS应用开发的重要功能,它不仅能提升用户体验,还能有效减少视觉疲劳。TimLiu-iOS项目作为iOS开发的学习宝库,提供了丰富的深色模式适配资源和示例代码。本文将为你详细介绍如何在UIKit和SwiftUI中完美实现深色模式适配,让你的应用更加专业和现代化。🎯 ## 为什么深色模式如此重要? 深色模式不仅仅是外观的改变,它为用户带来了**更好的夜间使用体验**、**更长

gitblog_00789的博客 1392

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

sendbird-uikit-ios:为iOS应用快速集成完整聊天功能

sendbird-uikit-ios:为iOS应用快速集成完整聊天功能 sendbird-uikit-ios 是一款专为iOS应用设计的用户界面开发工具包,它能够帮助开发者轻松、快速地在新应用或现有应用中集成标准的聊天功能。无论是整体主题还是颜色、字体等个性化风格,sendbird-uikit-ios 的组件都可以完全自定义,以打造符合品牌特色的在应用内聊天体验。 项目介绍 sendbird-ui...

gitblog_00040的博客 412

SwiftUIKitView终极指南:如何在SwiftUI中无缝集成UIKit视图

SwiftUIKitView是一款强大的开源框架,让开发者能够轻松在SwiftUI应用中集成UIKit视图,并为UIView元素创建Xcode预览。本文将为你提供完整的使用指南,帮助你快速掌握这一实用工具。 ## 为什么选择SwiftUIKitView? 在SwiftUI开发中,有时我们需要使用UIKit的强大功能。SwiftUIKitView正是为解决这一需求而生,它提供了以下核心优势:

gitblog_00225的博客 754

uikit框架_在合并框架中处理uikit手势

uikit框架Since you are here, I expect that you have a basic understanding of the Combine framework and might be coding it as well. 既然您在这里,我希望您对Combine框架有一个基本的了解,并且可能也会对其进行编码。 The framework itself comes...

weixin_26735419的博客 223

UIKit-Dynamics-Example 项目教程

UIKit-Dynamics-Example 项目教程 项目介绍 UIKit-Dynamics-Example 是一个展示如何在 iOS 7 上使用 UIKit Dynamics 动画实现侧边栏菜单的开源项目。UIKit Dynamics 是 UIKit 中的一个物理引擎,允许开发者创建具有真实物理交互的用户界面,例如重力、附着(弹簧)和力等效果。 项目快速启动 要快速启动并运行该项目,请按照以下...

gitblog_01197的博客 707
上一篇: 整理一份基础Swift面试题,真心能帮助到您
下一篇: Redis疑难问题解决方案与防范
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值