关于Swift的基本概念及语法知识。我在前面的章节中已经介绍了非常多。这一节和下一节主要有针对性的解说Swift在实际UIKit开发中的使用场景及注意点。先来看看Demo的终于效果图。

Demo分析:

1. 界面上面有三个button,他们的宽度不一致。

2. 点击每一个button的时候。以下有红色下划线跟着"走动"。

一、 Storyboard中的设计

注意到,这个红色下划线是任意摆放的。没有刻意的设置它的位置及宽度。而这个红色下划线也就是一个简单的UIView。

二、 拖线工作

在本例中,有三个IBOutlet连线工作,代码例如以下:

@IBOutlet weak var firstButton: UIButton!
@IBOutlet weak var underline: UIView!
@IBAction func btnClick(sender: UIButton)

1. 之所以连线第一个button。是由于程序刚启动的时候,应该默认运行点击第一个button的事件,以此来改变红色下划线的位置及宽度。

2. underline这个UIView便是这个红色下划线。

关于上面 "!" 使用假设有什么疑问的话。能够參照 《Swift:可选类型(Optional)》

3. btnClick 这种方法就是三个button的共同点击事件。

三、 button点击事件分析

代码例如以下:

UIView.animateWithDuration(0.25, animations: { () -> Void in
self.selectedButton?.selected = false
sender.selected = true
self.selectedButton = sender // 要先设置宽高,后设置位置,不然效果有影响
self.underline.frame.size.width = sender.frame.size.width
self.underline.center.x = sender.center.x
self.underline.frame.origin.y = CGRectGetMaxY(sender.frame) + 5
})

代码中的前三句是经典的button点击三部曲(用来切换button的点击状态),后面三句就是用来实现终于的动画;程序简单明了,我就不做过多的解释工作。

仅仅想说明两点:

1. selectedButton 是定义的一个属性,用来指向被选中的button。

2. self.selectedButton?.selected = false 事实上是代码的简写形式。也能够写成以下的形式,他们是等价的。

if(self.selectedButton != nil){
self.selectedButton.selected = false
}

注意: 在推断语句中,我们使用了比較推断,即self.selectedButton 是否为nil。

在objective-c中,或许大家会直接书写成 if(self.selectedButton) 进行推断就能够了。可是在Swift中这样书写是错误的。

由于Swift是类型安全的语言,推断条件必须是bool值。即使你在Swift中写成 if(1) 这种推断条件也是失败的。

四、 默认选中第一个button

这个操作事实上是非常easy的。仅仅要在viewDidLoad中加一句

self.btnClick(self.firstButton)

但会出现下划线默认会移动的效果。由于下划线默认不在第一个button的下方。所以运行动画,会移动过去。

解决的办法就是在默认载入的时候,禁止动画就可以。所以终于的代码例如以下:

class ViewController: UIViewController {
weak var selectedButton: UIButton!
@IBOutlet weak var firstButton: UIButton!
@IBOutlet weak var underline: UIView!
@IBAction func btnClick(sender: UIButton) { UIView.animateWithDuration(0.25, animations: { () -> Void in
self.selectedButton? .selected = false
sender.selected = true
self.selectedButton = sender self.underline.frame.size.width = sender.frame.size.width
self.underline.center.x = sender.center.x
self.underline.frame.origin.y = CGRectGetMaxY(sender.frame) + 5
})
} override func viewDidLoad() {
super.viewDidLoad()
// 界面刚载入进来的时候。禁止动画
UIView.setAnimationsEnabled(false)
self.btnClick(self.firstButton)
UIView.setAnimationsEnabled(true)
}
}

Swift:UIKit中Demo(一)的更多相关文章

  1. [Swift]在Swift项目中创建桥接头文件,Swift文件和Objective-C文件相互调用

    创建一个Swift项目[demo],以下内容Swift文件和Objective-C文件相互调用都是在Swift项目中. 一.Swift文件调用Objective-C文件 新建文件夹[SupportFi ...

  2. [Xcode 实际操作]九、实用进阶-(6)在Swift文件中调用Object-C的类和方法

    目录:[Swift]Xcode实际操作 本文将演示在Swift文件中调用Object-C的类和方法. 在项目文件夹[DemoApp]上点击鼠标右键 ->[New File]创建一个Object- ...

  3. 在 Swift 项目中实现侧滑菜单-利用 SWRevealViewController

    你可以完全自己手动写一个侧滑菜单,但是现在在 GitHub 上面已经有很多免费的开源库了,如果不是有很特别的需求,大可不必新建一个轮子. 在这里我使用的这个第三方库名字叫做 SWRevealViewC ...

  4. Swift UIViewController中的delegate方式传值

    ios swift开发中有几种方式传值,看到简书上一篇不错的文章. 链接:http://www.jianshu.com/p/3e1173652996 一.通过segue进行传值 二.通过delegat ...

  5. 在Swift项目中使用cocoaPods导入第三方OC库

    首先保证你的项目是基于cocoaPods的,并且是通过XX.xcworkspace打开的.cocoaPods安装教程(Xcode6以上) 下面就第三方库MBProgressHUD来讲解如何在Swift ...

  6. Swift 3 中的访问控制 open public internal fileprivate private

    Swift 3必看:新的访问控制fileprivate和open http://www.jianshu.com/p/604305a61e57 浅谈 Swift 3 中的访问控制 https://mai ...

  7. swift项目中使用OC/C的方法

    假如有个OC类OCViewController : UIViewController类里有两个方法 //swift调用oc或c的混编是比较常用的,反过来的调用很少.这里只写了swift调用oc和c的方 ...

  8. Swift编程语言中的方法引用

    由于Apple官方的<The Swift Programming Guide>对Swift编程语言中的方法引用介绍得不多,所以这里将更深入.详细地介绍Swift中的方法引用. Swift与 ...

  9. Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数

    Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数 7.4.4  为外部参数设置默认值 开发者也可以对外部参数设置默认值.这时,调用的时候,也可以省略参数传递本文选自Swift1 ...

随机推荐

  1. css part 2

    CSS 盒子模型 margin:            用于控制元素与元素之间的距离:margin的最基本用途就是控制元素周围空间的间隔,从视觉角度上达到相互隔开的目的. padding:       ...

  2. NOI2018 你的名字 后缀自动机_线段树合并_可持久化

    相当复杂的一道题,同样也相当优美.考察的知识点很多:权值线段树的可持久化合并,后缀自动机,后缀树... 考虑 $68pts$  $l=1,r=|s|$的数据:这部分相对好做一些,不过思维难度对我来说已 ...

  3. js递归获取html页面所有标签

    js原生递归获取,直接源码 : <script> var child = document.children; var arr = [];//用来存放获取到的所有的标签 function ...

  4. LOJ #10121 与众不同 (RMQ+二分)

    题目大意 :给你一个整数序列,定义一个合法子串为子串内所有数互不相同,会有很多询问,求区间$[L,R]$内最长连续合法子串长度 一道思维不错的$RMQ$题,NOIP要是考这种题可能会考挂一片 预处理出 ...

  5. 学习《数据科学入门》中文PDF+英文PDF+源代码

    数据科学是一个蓬勃发展.前途无限的行业,有人将数据科学家称为"21世纪头号性感职业".本书从零开始讲解数据科学工作,教授数据科学工作所必需的黑客技能,并带领读者熟悉数据科学的核心知 ...

  6. 制作PC端的安装程序

    一个多月不写博客了,不造大家有没有想我,(别自恋了,寥寥无几的粉丝,谁会想你),呜呜~~~ 好了,废话少叙,借用郭德纲老板的话,天儿不早了,干点正事儿吧! 一.序 Unity开发者都知道,打包出来的e ...

  7. C语言计算字符串数组中每个字符串出现的个数

    unsigned int str_num(char *str[], int num[], int len) { int i, j; int count; int flag[len]; ; i < ...

  8. Java基础学习总结(44)——10个Java 8 Lambda表达式经典示例

    Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里.在Ja ...

  9. Java 二进制,八进制,十进制,十六进制转换

    A.十进制转换其他 十进制转成二进制  Integer.toBinaryString(int i) 十进制转成八进制  Integer.toOctalString(int i) 十进制转成十六进制:  ...

  10. 小于等于N的全部整数与N关于gcd(i,N)的那些事

    相关问题1: 求小于等于N的与N互质的数的和.即∑ i (gcd(i,N)=1, N>=i>0) 依据N的规模能够有非常多种方法.这里我介绍一个比較经典的方法 先说下这个结论:假设 gcd ...