现在在苹果应用商店上有超过140万的App,想让你的app表现的出众是件非常具有挑战的事情。你有这样一个机会,在你的应用的数据完全加载出来之前,你可以通过一个很小的窗口来捕获用户的关注。


没有比这个更好的地方让用户大为赞叹,当你的应用程序载入画面的时候,你可以添加一个愉快的动画,作为先导,以加载你的应用。

在本教程中,你将学习如何做出这样的动画。你将学习如何建立piece-by-piece,采用前卫的技术来创建一个流体和迷人的动画。


准备

下载本教程开始的工程,把它保存到一个方便的地方,并在Xcode中打开。

打开 HolderView.swift。在这个UIView的子类中,添加下面的子层在动画的上面展示:

  • ovalLayer.swift:这是第一层,从0慢慢变大,然后很短的时间抖动
  • TriangleLayer.swift:ovalLayer层正在抖动的时候出现,当这层旋转的时候,ovalLayer收缩到没有,只让TriangleLayer可视
  • RectangleLayer.swift:这层作为TriangleLayer可视的容器
  • ArcLayer.swift:这层填充RectangleLayer通过一个动画,类似于玻璃中充满水的样子

打开ovalLayer.swift,最初的项目已经包含了初始化这些层和所有在你的动画中将使用的贝塞尔路径的代码。你会看到expand(),wobble()contract()这些方法里面都是空的,通过这个教程你将填充这些方法。所有其他的*Layer 的文件都是类似的功能结构。

Note:如果你想学习关于贝塞尔路径的知识,可以点击这个教程 Modern Core Graphics with Swift

最后,打开ViewController.swift,看到addHolderView(),这个方法中添加了HolderView的实例对象,作为控制器视图的中心的子视图。这个视图将包含所有的动画。该视图控制器只需要将它放在屏幕上,然后该视图将执行实际的动画的代码。

animateLabel()方法是有HolderView类提供的代理回调,当你完成动画的次序时,你将会填充它。

addButton()仅仅是在视图上增加了一个按钮,以便您可以点击并重新启动动画。

构建并运行该项目,你应该看到一个空白的屏幕。这是件完美的事情在空白的画布上开始制作你新的动画!

在教程的最后,你的app将会是下面这样的:


因此,事不宜迟,让我们开始吧!


添加椭圆

动画开始有个红色的椭圆形,然后扩展到视图的中心,然后微微摇晃。

打开HolderView.swift,然后在HolderView上方附近定义下面的常量:

let ovalLayer = ovalLayer()

添加下面的方法:

func addoval() {
  layer.addSublayer(ovalLayer)
  ovalLayer.expand()
}

你第一次添加的ovalLayer的实例作为视图层的子视图。

ovalLayer.swift 中,添加下面的代码到expand()中:

func expand() {
  var expandAnimation: CABasicAnimation = CABasicAnimation(keyPath: "path")
  expandAnimation.fromValue = ovalPathSmall.CGPath
  expandAnimation.tovalue = ovalPathLarge.CGPath
  expandAnimation.duration = animationDuration
  expandAnimation.fillMode = kCAFillModeForwards
  expandAnimation.removedOnCompletion = false
  addAnimation(expandAnimation,forKey: nil)
}

这个方法创建了一个CABasicAnimation实例,来改变椭圆的路径从ovalPathSmallovalPathLarge。初始的项目中为你提供了这些贝塞尔路径。设置removedOnCompletionfalsefillMode的值为KCAFillModeForwards,在动画中一旦动画完成,让椭圆开辟一个新的路径。

最后,打开ViewController.swift,添加下面那一行到addHolderView(),就在view.addSubview(holderView)的下面:

holderView.addoval()

addoval在椭圆被添加到控制器的视图中后开始动画。

构建并运行你的app,你的动画将会显示下面这样:



晃动椭圆

在椭圆被添加到视图中并扩展后,下一步就是在步骤中加一些反弹,让其摆动。

打开HolderView.swift,然后添加下面的方法:

func wobbleoval() {
  ovalLayer.wobble()
}

这个方法是让其在ovalLayer中摆动。

打开 ovalLayer.swift,在wobble()中添加下面的代码:

func wobble() {
  // 1
  var wobbleAnimation1: CABasicAnimation = CABasicAnimation(keyPath: "path")
  wobbleAnimation1.fromValue = ovalPathLarge.CGPath
  wobbleAnimation1.tovalue = ovalPathSquishVertical.CGPath
  wobbleAnimation1.beginTime = 0.0
  wobbleAnimation1.duration = animationDuration
 
  // 2
  var wobbleAnimation2: CABasicAnimation = CABasicAnimation(keyPath: "path")
  wobbleAnimation2.fromValue = ovalPathSquishVertical.CGPath
  wobbleAnimation2.tovalue = ovalPathSquishHorizontal.CGPath
  wobbleAnimation2.beginTime = wobbleAnimation1.beginTime + wobbleAnimation1.duration
  wobbleAnimation2.duration = animationDuration
 
  // 3
  var wobbleAnimation3: CABasicAnimation = CABasicAnimation(keyPath: "path")
  wobbleAnimation3.fromValue = ovalPathSquishHorizontal.CGPath
  wobbleAnimation3.tovalue = ovalPathSquishVertical.CGPath
  wobbleAnimation3.beginTime = wobbleAnimation2.beginTime + wobbleAnimation2.duration
  wobbleAnimation3.duration = animationDuration
 
  // 4
  var wobbleAnimation4: CABasicAnimation = CABasicAnimation(keyPath: "path")
  wobbleAnimation4.fromValue = ovalPathSquishVertical.CGPath
  wobbleAnimation4.tovalue = ovalPathLarge.CGPath
  wobbleAnimation4.beginTime = wobbleAnimation3.beginTime + wobbleAnimation3.duration
  wobbleAnimation4.duration = animationDuration
 
  // 5
  var wobbleAnimationGroup: CAAnimationGroup = CAAnimationGroup()
  wobbleAnimationGroup.animations = [wobbleAnimation1,wobbleAnimation2,wobbleAnimation3,wobbleAnimation4]
  wobbleAnimationGroup.duration = wobbleAnimation4.beginTime + wobbleAnimation4.duration
  wobbleAnimationGroup.repeatCount = 2
  addAnimation(wobbleAnimationGroup,forKey: nil)
}

这里有很多的代码,但它分解的很好,来看下这里干了些什么:

1、从远处到垂直压扁

2、从垂直压扁改为水平和垂直都压扁

3、切换回垂直压扁

4、完成动画,结束回到最开始的位置

5、将所有的动画整合到CAAnimationGroup中,然后将这组动画添加到ovalLayout中。

每个后续动画的beginTime是先前动画的beginTime和其持续时间的总和。重复这个动画组两次,就会看到搬动稍微拉长。

即时你现在添加了所有摇晃动画的代码,你也看不到你想看到的动画。

回到HolderView.swift 中,添加下面的代码到addoval()中:

NSTimer.scheduledTimerWithTimeInterval(0.3,target: self,selector: "wobbleoval",userInfo: nil,repeats: false)

这里创建了一个定时器,在ovalLayer完成扩展动画后,调用wobbleoval()

构建并运行你的app,看下现在的动画:


这是非常微妙的,但这是一个非常重要的因素去创建一个真正令人愉快的动画。你不需要让其充满整个屏幕!


开始变形

即将看到神奇的事情!你即将把椭圆变成三角形。在用户的眼中,这个转变应该看上去是完全无缝的。那么你需要使用两个颜色相同的单独的形状来实现它。

打开HolderView.swift,添加下面的代码到HolderView中,就在你之前添加的ovalLayer常量的下面:

let triangleLayer = TriangleLayer()

这里定义了一个TriangleLayer实例,跟你之前定义的ovalLayer一样。

现在,实现wobbleoval()方法:

func wobbleoval() {
  // 1
  layer.addSublayer(triangleLayer) // Add this line
  ovalLayer.wobble()
 
  // 2  
  // Add the code below
  NSTimer.scheduledTimerWithTimeInterval(0.9,selector: "drawAnimatedTriangle",repeats: false) 
}

这段代码做了下面这些事情:

1、该行添加了前面初始化的TriangleLayer实例,作为HolderView层里的一个子层

2、之前知道了摆动动画运行两次的总共时间是1.8,中间的地方将会是一个非常好的地方去开始变形处理。因此,添加一个计时器,在延迟0.9后,执行drawAnimatedTriangle()方法。

Note:在动画中寻找中一个正确的持续时间或者延迟时间需要一些实验和错误的尝试,然后才能发现一个好的动画和完美的动画的区别。我鼓励你去和你的动画去鼓捣,让它们变得更完美。这可能需要一些时间,但它是值得的。


接下来,添加下面的功能:

func drawAnimatedTriangle() {
  triangleLayer.animate()
}

这个方法是实现刚刚写的定时器的功能,它让三角形开始动。

现在,打开 TriangleLayer.swift,然后添加下面的代码到animate()中:

func animate() {
  var triangleAnimationLeft: CABasicAnimation = CABasicAnimation(keyPath: "path")
  triangleAnimationLeft.fromValue = trianglePathSmall.CGPath
  triangleAnimationLeft.tovalue = trianglePathLeftExtension.CGPath
  triangleAnimationLeft.beginTime = 0.0
  triangleAnimationLeft.duration = 0.3
 
  var triangleAnimationRight: CABasicAnimation = CABasicAnimation(keyPath: "path")
  triangleAnimationRight.fromValue = trianglePathLeftExtension.CGPath
  triangleAnimationRight.tovalue = trianglePathRightExtension.CGPath
  triangleAnimationRight.beginTime = triangleAnimationLeft.beginTime + triangleAnimationLeft.duration
  triangleAnimationRight.duration = 0.25
 
  var triangleAnimationTop: CABasicAnimation = CABasicAnimation(keyPath: "path")
  triangleAnimationTop.fromValue = trianglePathRightExtension.CGPath
  triangleAnimationTop.tovalue = trianglePathTopExtension.CGPath
  triangleAnimationTop.beginTime = triangleAnimationRight.beginTime + triangleAnimationRight.duration
  triangleAnimationTop.duration = 0.20
 
  var triangleAnimationGroup: CAAnimationGroup = CAAnimationGroup()
  triangleAnimationGroup.animations = [triangleAnimationLeft,triangleAnimationRight,triangleAnimationTop]
  triangleAnimationGroup.duration = triangleAnimationTop.beginTime + triangleAnimationTop.duration
  triangleAnimationGroup.fillMode = kCAFillModeForwards
  triangleAnimationGroup.removedOnCompletion = false
  addAnimation(triangleAnimationGroup,forKey: nil)
}

这段代码让三角形的角伴随着ovalLayer层的晃动一个一个出来;在最初的项目中贝塞尔路径已经定义了每个角。最左边的角第一个出来,接着是右边的,最后是最上面的那个角。通过创建三个基于CABasicAnimation的实例,添加到CAAnimationGroup中。

构建并运行你的app,将会看到目前的动画状态;当椭圆晃动的时候,三角形的每个角开始出来知道三个角全部显示出来,就像这样:



完成变形

要实现其变形,你需要让HolderView360度旋转当ovalLayer收缩的时候,最终仅留下TriangleLayer

打开HolderView.swift ,添加下面的代码在drawAnimatedTriangle()的最后:

NSTimer.scheduledTimerWithTimeInterval(0.9,selector: "spinAndTransform",repeats: false)

在三角形动画完成后设置一个定时器,0.9秒的这个时间也是一次次通过尝试而得到的。

现在,添加下面的方法:

func spinAndTransform() {
  // 1
  layer.anchorPoint = CGPointMake(0.5,0.6)
 
  // 2
  var rotationAnimation: CABasicAnimation = CABasicAnimation(keyPath: "transform.rotation.z")
  rotationAnimation.tovalue = CGFloat(M_PI * 2.0)
  rotationAnimation.duration = 0.45
  rotationAnimation.removedOnCompletion = true
  layer.addAnimation(rotationAnimation,forKey: nil)
 
  // 3
  ovalLayer.contract()
}

刚刚创建的定时器一旦椭圆晃动停止并且三角形的每个角都出现时调用这个函数。下面看下这个函数的详细功能:

1、更新该层的锚点略低于视图的中心。这让旋转闲的更加自然。这是因为,椭圆和三角形事实上以垂直方向从视图的中心偏离。因此,如果视图绕着中心旋转,那么椭圆和三角似乎是垂直移动的。

2、CABasicAnimation让图层旋转360度或者2π弧度。旋转是绕着z轴,垂直于屏幕的表面进入和移出。

3、ovalLayer调用contract()方法执行动画,缩减椭圆的大小直至看不见。

现在,打开ovalLayer.swift,然后添加下面的代码到contract()中:

func contract() {
  var contractAnimation: CABasicAnimation = CABasicAnimation(keyPath: "path")
  contractAnimation.fromValue = ovalPathLarge.CGPath
  contractAnimation.tovalue = ovalPathSmall.CGPath
  contractAnimation.duration = animationDuration
  contractAnimation.fillMode = kCAFillModeForwards
  contractAnimation.removedOnCompletion = false
  addAnimation(contractAnimation,forKey: nil)
}
这是让 ovalLayer返回最开始的路径上 ovalPathSmall,通过执行一个 CABasicAnimation动画。这是跟之前调用的动画是相反的。

构建并运行你的app;一旦动画结束后,就只剩下三角形在屏幕的中间。



绘制容器

在接下来的部分中,你将会绘制一个长方形的容器来创建一个外壳。要做到这一点,你需要使用RectangleLayer的画笔。你将要做两次,通过使用红色和蓝色作为笔的颜色。

打开 HolderView.swift,然后定义两个RectangularLayer常量,如下,在triangleLayer的下方:

let redRectangleLayer = RectangleLayer()
let blueRectangleLayer = RectangleLayer()

接下来添加下面的代码在spinAndTransform()的后面:

NSTimer.scheduledTimerWithTimeInterval(0.45,selector: "drawRedAnimatedRectangle",repeats: false)
NSTimer.scheduledTimerWithTimeInterval(0.65,selector: "drawBlueAnimatedRectangle",repeats: false)
这里你创建了两个定时器分别调用 drawRedAnimatedRectangle()drawBlueAnimatedRectangle()

首先画红色的矩形框,之后完成向右的一个旋转动画。在红色的矩形框绘制接近完成的时候开始绘制蓝色的矩形框。

添加下面的两个方法:

func drawRedAnimatedRectangle() {
  layer.addSublayer(redRectangleLayer)
  redRectangleLayer.animatestrokeWithColor(Colors.red)
}
 
func drawBlueAnimatedRectangle() {
  layer.addSublayer(blueRectangleLayer)
  blueRectangleLayer.animatestrokeWithColor(Colors.blue)
}

一旦你添加RectangleLayer作为HolderView的一个子层时,就开始调用animatestrokeWithColor(color:),并开始执行绘制边框的动画。

现在打开 RectangleLayer.swift,填充animatestrokeWithColor(color:)方法,如下:

func animatestrokeWithColor(color: UIColor) {
  strokeColor = color.CGColor
  var strokeAnimation: CABasicAnimation = CABasicAnimation(keyPath: "strokeEnd")
  strokeAnimation.fromValue = 0.0
  strokeAnimation.tovalue = 1.0
  strokeAnimation.duration = 0.4
  addAnimation(strokeAnimation,forKey: nil)
}

这里通过添加一个CABasicAnimation去绘制一个笔。CAShapeLayer中的strokeEnd指示着画笔去描绘这个矩形框。

构建并运行你的app,将会看到下面的动画:



填充容器

现在有了容器,下一步就是将它填补起来。这个效果类似于水填充满玻璃,这是一个伟大的诗视觉效果!

打开HolderView.swift,就在RectangleLayer属性的后面,添加一个常量:

let arcLayer = ArcLayer()

添加下面的代码在drawBlueAnimatedRectangle()的最后面:

NSTimer.scheduledTimerWithTimeInterval(0.40,selector: "drawArc",repeats: false)

这里创建了一个计时器,一旦蓝色的RectangleLayer绘制完成后便去调用drawArc()

添加下面的方法:

func drawArc() {
  layer.addSublayer(arcLayer)
  arcLayer.animate()
}

在执行动画之前,这里增加了一个在HolderView层上已经创建了的ArcLayer的实例。

打开ArcLayer.swift,添加下面的代码到animate()方法中:

func animate() {
  var arcAnimationPre: CABasicAnimation = CABasicAnimation(keyPath: "path")
  arcAnimationPre.fromValue = arcPathPre.CGPath
  arcAnimationPre.tovalue = arcPathStarting.CGPath
  arcAnimationPre.beginTime = 0.0
  arcAnimationPre.duration = animationDuration
 
  var arcAnimationLow: CABasicAnimation = CABasicAnimation(keyPath: "path")
  arcAnimationLow.fromValue = arcPathStarting.CGPath
  arcAnimationLow.tovalue = arcPathLow.CGPath
  arcAnimationLow.beginTime = arcAnimationPre.beginTime + arcAnimationPre.duration
  arcAnimationLow.duration = animationDuration
 
  var arcAnimationMid: CABasicAnimation = CABasicAnimation(keyPath: "path")
  arcAnimationMid.fromValue = arcPathLow.CGPath
  arcAnimationMid.tovalue = arcPathMid.CGPath
  arcAnimationMid.beginTime = arcAnimationLow.beginTime + arcAnimationLow.duration
  arcAnimationMid.duration = animationDuration
 
  var arcAnimationHigh: CABasicAnimation = CABasicAnimation(keyPath: "path")
  arcAnimationHigh.fromValue = arcPathMid.CGPath
  arcAnimationHigh.tovalue = arcPathHigh.CGPath
  arcAnimationHigh.beginTime = arcAnimationMid.beginTime + arcAnimationMid.duration
  arcAnimationHigh.duration = animationDuration
 
  var arcAnimationComplete: CABasicAnimation = CABasicAnimation(keyPath: "path")
  arcAnimationComplete.fromValue = arcPathHigh.CGPath
  arcAnimationComplete.tovalue = arcPathComplete.CGPath
  arcAnimationComplete.beginTime = arcAnimationHigh.beginTime + arcAnimationHigh.duration
  arcAnimationComplete.duration = animationDuration
 
  var arcAnimationGroup: CAAnimationGroup = CAAnimationGroup()
  arcAnimationGroup.animations = [arcAnimationPre,arcAnimationLow,arcAnimationMid,arcAnimationHigh,arcAnimationComplete]
  arcAnimationGroup.duration = arcAnimationComplete.beginTime + arcAnimationComplete.duration
  arcAnimationGroup.fillMode = kCAFillModeForwards
  arcAnimationGroup.removedOnCompletion = false
  addAnimation(arcAnimationGroup,forKey: nil)
}

这个动画非常类似于之前的摆动的动画;创建了一个CAAnimationGroup,包含5个基于路径的CABasicAnimation实例。每个路径随着高度的增加都有一个稍微不同的弧度。最后,将CAAnimationGroup应用到图层中,并指示着它不被移除,在动画完成之前将保持这个状态。

构建并运行你的app,将会看到神奇的一幕!



完成动画

剩下的事情就是将蓝色的HolderView扩大直至填充满整个屏幕,并在视图添加一个UILabel作为logo。

打开HolderView.swift,添加下面的代码到drawArc()的最后面:

NSTimer.scheduledTimerWithTimeInterval(0.90,selector: "expandView",repeats: false)

这里创建了一个计时器,当ArcLayer填充满容器的时候调用expandView()

现在,添加下面的方法:

func expandView() {
  // 1
  backgroundColor = Colors.blue
 
  // 2
  frame = CGRectMake(frame.origin.x - blueRectangleLayer.linewidth,frame.origin.y - blueRectangleLayer.linewidth,frame.size.width + blueRectangleLayer.linewidth * 2,frame.size.height + blueRectangleLayer.linewidth * 2)
 
  // 3
  layer.sublayers = nil
 
  // 4
  UIView.animateWithDuration(0.3,delay: 0.0,options: UIViewAnimationoptions.CurveEaseInOut,animations: {
      self.frame = self.parentFrame
    },completion: { finished in
      self.addLabel()
    })
}

该方法做了写什么事情呢:

1、holder view的背景被设置为蓝色,和你之前填充的矩形框的颜色一样;

2、这个frame扩大到之前设定的RectangleLayer画笔的宽度;

3、所有的子层都被移除。现在没有椭圆,没有三角形,没有矩形图层;

4、添加一个动画,让HolderView扩大至填充满整个屏幕。一旦该动画执行了,你需要调用addLabel()方法;

在下面添加该方法:

func addLabel() {
  delegate?.animateLabel()
}

动画显示这个Label仅仅使用了视图的委托动能。

现在打开ViewController.swift,添加下面的代码到animateLabel()中:

func animateLabel() {
  // 1
  holderView.removeFromSuperview()
  view.backgroundColor = Colors.blue
 
  // 2  
  var label: UILabel = UILabel(frame: view.frame)
  label.textColor = Colors.white
  label.font = UIFont(name: "HelveticaNeue-Thin",size: 170.0)
  label.textAlignment = NSTextAlignment.Center
  label.text = "S"
  label.transform = CGAffineTransformScale(label.transform,0.25,0.25)
  view.addSubview(label)
 
  // 3  
  UIView.animateWithDuration(0.4,usingSpringWithdamping: 0.7,initialSpringVeLocity: 0.1,animations: ({
      label.transform = CGAffineTransformScale(label.transform,4.0,4.0)
    }),completion: { finished in
      self.addButton()
    })
}

依次注释每个部分:

1、将HolderView从视图上移除,并设置视图的背景颜色为蓝色;

2、创建UILabel,内容为“S”,作为logo,添加到视图中;

3、执行一个弹簧动画显示那个Label。一旦动画执行完,调用addButton()方法,在视图中添加一个按钮,当点击时,重复显示该动画过程。

构建并运行你的app,给自己鼓掌吧,然后花点时间来享受自己实现了什么!


你可以到这里下载完整的项目

由于第一次翻译外文,可能很多缺陷和不足,求各路大神指正!无比感谢!原文地址

另外,获取更多的iOS开发的相关资料、资讯、课程,可关注iOS开发者开发者公众平台!

如何用Swift创建一个复杂的加载动画的更多相关文章

  1. Canvas实现贝赛尔曲线轨迹动画的示例代码

    这篇文章主要介绍了Canvas实现贝赛尔曲线轨迹动画的示例代码的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. HTML5 直播疯狂点赞动画实现代码 附源码

    为了烘托直播间的氛围,直播相对于普通视频或者文本内容,点赞动作通常无限次,引导用户疯狂点赞,今天小编给大家分享HTML5 直播疯狂点赞动画实现代码 附源码,感兴趣的朋友一起看看吧

  3. CSS中实现动画效果-附案例

    这篇文章主要介绍了 CSS中实现动画效果并附上案例代码及实现效果,就是CSS动画样式处理,动画声明需要使用@keyframes name,后面的name是人为定义的动画名称,下面我们来看看文章的具体实现内容吧,需要的小伙伴可以参考一下

  4. 基于canvas的骨骼动画的示例代码

    这篇文章主要介绍了基于canvas的骨骼动画的示例代码的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  5. html5如何在Canvas中实现自定义路径动画示例

    本篇文章主要介绍了html5如何在Canvas中实现自定义路径动画示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  6. 基于HTML5+Webkit实现树叶飘落动画

    本文给大家分享一段实例代码给大家介绍基于HTML5+Webkit实现树叶飘落动画效果,需要的朋友参考下吧

  7. Html5页面内使用JSON动画的实现

    这篇文章主要介绍了Html5页面内使用JSON动画的实现的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  8. html5实现图片转圈的动画效果——让页面动起来

    这篇文章主要介绍了html5实现图片转圈的动画效果——让页面动起来的相关资料,需要的朋友可以参考下

  9. 基于 HTML5 WebGL 实现的医疗物流系统

    物联网( IoT ),简单的理解就是物体之间通过互联网进行链接。这篇文章给大家介绍基于 HTML5 WebGL 实现的医疗物流系统,感兴趣的朋友跟随小编一起看看吧

  10. 为什么这个简单的动画无法在iOS 7上运行?

    在我的项目中,我有一个简单的动画,我只是从左到右移动一个视图.这在iOS6中运行良好,但是当我在iOS7中运行它没有做任何事情.有人知道为什么吗?如果动画非常简单,我该如何修复iOS7?我的代码是:我做了更新,我使用Xcode5和iOS7所以任何帮助人,你知道如何解决这个问题吗?

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部