关于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. FCC高级编程篇之Exact Change

    Exact Change Design a cash register drawer function checkCashRegister() that accepts purchase price ...

  2. js 将数组中的每一项安装奇偶重新组合成一个数组对象

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. 简洁的MVC思想框架——Nancy(环境配置与Get操作)

    Nancy官网——https://github.com/NancyFx/Nancy 概述:Nancy是一个开源的Web轻型框架内核符合MVC思想,有开发方便,路由简单的特点,而且功能齐全 起步:Hel ...

  4. 页面加载完成触发input[type="file"]控件问题

    由于浏览器厂家的限制,不同的浏览器不开放页面加载完成就允许触发input[type="file"]控件 测试 Chrome .火狐 .IE .微信客户端QQ =>桌面端: C ...

  5. (52)KeyError错误

    当出现:22KeyError: 'xxxxxx'这样的错误,可以肯定依赖出问题了,一般是你引用某个字段,但没有定义,又没有指定依赖的模块,最后找不到对应字段 解决方法:开发工具,把 xxxxxx 去搜 ...

  6. CSDN 轻松周赛赛题:能否被8整除

    轻松周赛赛题:能否被8整除 题目详情 给定一个非负整数,问能否重排它的全部数字,使得重排后的数能被8整除. 输入格式: 多组数据,每组数据是一个非负整数.非负整数的位数不超过10000位. 输出格式 ...

  7. 如何用一次性密码通过 SSH 安全登录 Linux

    有人说,安全不是一个产品,而是一个过程.虽然 SSH 协议被设计成使用加密技术来确保安全,但如果使用不当,别人还是能够破坏你的系统:比如弱密码.密钥泄露.使用过时的 SSH 客户端等,都能引发安全问题 ...

  8. [Transducer] Make an Into Helper to Remove Boilerplate and Simplify our Transduce API

    Our transduce function is powerful but requires a lot of boilerplate. It would be nice if we had a w ...

  9. 蓝的成长记——追逐DBA(18):小机上WAS集群故障,由一次更换IP引起

    原创作品.出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明出处.否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlong ...

  10. Project Euler:Problem 93 Arithmetic expressions

    By using each of the digits from the set, {1, 2, 3, 4}, exactly once, and making use of the four ari ...