30DaysOfSwift - Day1 计时器

前几天逛Github,偶然看到一个Swift的项目 —— 30DaysOfSwift,作者一共用30个小项目,来熟悉Swift语言,而我正好也学习了一段时间的Swift语言,准备仿照这样的模式,来更加深入的了解UI部分

今天做的是一个计时器项目,大概效果如下 :

作者在这个项目中,使用AutoLayout来完成自动布局,使用StoryBoard完成UI创建。

而我一直都是喜欢用纯代码布局,UI的搭建也是使用代码完成。所以我在写这个小Demo之前在我的项目里集成了SnapKit,使用类似Objective-C中常用的masonry框架来完成自动布局。

这里我还发现一个Swift中的小问题,使用cocoadPods集成第三方库,引用不到头文件的解决方法和Objective-C不一样。

这是第一个Swift小Demo,很简单,也很好的帮助熟悉UI.


import UIKit
import SnapKit

let SCREEN_WIDTH = UIScreen.mainScreen().bounds.size.width
let SCREEN_HEIGHT = UIScreen.mainScreen().bounds.size.height

let kTopViewHeight = SCREEN_HEIGHT * 0.4 //倒计时试图高度
let kButtonHeight = SCREEN_HEIGHT * 0.6  //开始暂停按钮高度
let kPauseButtonWidth = SCREEN_WIDTH * 0.4 //暂停按钮宽度
let kStartButtonWidth = SCREEN_WIDTH * 0.6 //开始按钮高度

var counter = 0.0
var timer = NSTimer()
var isPlaying = false


class ViewController: UIViewController {

    //MARK: - 懒加载
    
    
    //倒计时Label
    private lazy var showLabel: UILabel = {
        let label = UILabel(frame: CGRect.zero)
        label.text = String(counter)
        label.textColor = UIColor.yellowColor()
        label.font = UIFont.systemFontOfSize(100)
        label.textAlignment = NSTextAlignment.Center
        return label
    }()
    
    //顶部背景试图
    private lazy var topBackgroundView: UIView = {
        let view = UIView(frame: CGRect(x: 0, y: 0, width: SCREEN_WIDTH, height: kTopViewHeight))
        view.backgroundColor = UIColor.blackColor()
        return view
    }()
    
    //Reset按钮
    private lazy var resetButton: UIButton = {
        let button = UIButton(type: (UIButtonType.Custom))
        button.frame = CGRectZero
        button.setTitle("Reset", forState: UIControlState.Normal)
        button.setTitleColor(UIColor.whiteColor(), forState: UIControlState.Normal)
        button.setTitleColor(UIColor.blackColor(), forState: UIControlState.Highlighted)
        button.titleLabel?.font = UIFont.systemFontOfSize(15)
        button.backgroundColor = UIColor.clearColor()
        button.addTarget(self, action: "buttonDidClick:", forControlEvents: UIControlEvents.TouchUpInside)
        button.tag = 101
        return button
    }()
    
    //暂停按钮
    private lazy var pauseButton: UIButton = {
        let button = UIButton(type: (UIButtonType.Custom))
        button.frame = CGRectZero
        button.setImage(UIImage(named: "pause"), forState: UIControlState.Normal)
        button.backgroundColor = UIColor.greenColor()
        button.addTarget(self, action: "buttonDidClick:", forControlEvents: UIControlEvents.TouchUpInside)
        button.tag = 102
        return button
    }()
    
    //开始按钮
    private lazy var startButton: UIButton = {
        let button = UIButton(type: (UIButtonType.Custom))
        button.frame = CGRectZero
        button.setImage(UIImage(named: "play"), forState: UIControlState.Normal)
        button.backgroundColor = UIColor.blueColor()
        button.addTarget(self, action: "buttonDidClick:", forControlEvents: UIControlEvents.TouchUpInside)
        button.tag = 103
        return button
    }()
    
    //MARK: - 创建UI界面
    
    func setupUI() {
        //顶部的背景试图
        self.view.addSubview(self.topBackgroundView)
        // 显示倒计时的Label
        self.topBackgroundView.addSubview(self.showLabel)
        self.showLabel.snp_makeConstraints { make in
            make.width.equalTo(SCREEN_WIDTH)
            make.height.equalTo(137)
            make.centerX.equalTo(self.topBackgroundView.snp_centerX)
            make.centerY.equalTo(self.topBackgroundView.snp_centerY)
        }
        //Reset按钮
        self.topBackgroundView.addSubview(self.resetButton)
        self.resetButton.snp_makeConstraints { make in
            make.top.equalTo(self.topBackgroundView.snp_top).offset(20)
            make.right.equalTo(self.topBackgroundView.snp_right).offset(-20)
            make.height.equalTo(20)
            make.width.equalTo(60)
        }
        // 暂停按钮
        self.view.addSubview(self.pauseButton)
        self.pauseButton.snp_makeConstraints { make in
            make.top.equalTo(self.topBackgroundView.snp_bottom).offset(0)
            make.left.equalTo(self.view).offset(0)
            make.height.equalTo(kButtonHeight)
            make.width.equalTo(kPauseButtonWidth)
        }
        
        //开始按钮
        self.view .addSubview(self.startButton)
        self.startButton.snp_makeConstraints { make in
            make.top.equalTo(self.topBackgroundView.snp_bottom).offset(0)
            make.left.equalTo(self.pauseButton.snp_right).offset(0)
            make.height.equalTo(kButtonHeight)
            make.width.equalTo(kStartButtonWidth)
        }
    }
    //MARK: - 设置状态栏
    override func preferredStatusBarStyle() -> UIStatusBarStyle {
        return UIStatusBarStyle.LightContent
    }
    
    //MARK: - ButtonClick
    func buttonDidClick(sender: AnyObject) {
        switch sender.tag {
            //reset
        case 101 :
            timer.invalidate()
            isPlaying = false
            counter = 0.0
            self.showLabel.text = String(counter)
            self.startButton.enabled = true
            self.pauseButton.enabled = false
            
            //暂停
        case 102 :
            self.startButton.enabled = true
            self.pauseButton.enabled = false
            isPlaying = false
            timer.invalidate()
            
            //开始
        case 103 :
            if (isPlaying) {
                return
            }
            self.startButton.enabled = false
            self.pauseButton.enabled = true
            timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("updateTimer"), userInfo: nil, repeats: true)
            isPlaying = true
            
        default :
            break
        }
    }
    
    //MARK: - 计时器方法
    func updateTimer() {
        counter = counter + 0.1
        self.showLabel.text = String(format: "%.1f", counter)
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.whiteColor()
        setupUI()
    }
    
    

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

代码已经上传到GitHub上

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,952评论 4 60
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,140评论 25 707
  • 有成长型思维模式的学生,他们的学习动机完全是为了自己。他们享受学习的过程,而不是一味地追求好成绩。即使他们觉得教材...
    快乐的石头阅读 184评论 0 0
  • ljc@ubuntu:~$ perf 程序“perf”尚未安装。 您可以使用以下命令安装: sudo apt in...
    闯爷阅读 21,562评论 0 4
  • 目录的'x'权限 目录的执行权限代表是否可以切换到一个目录中去。要读写目录下的某个文件,就必须对从根到文件所在目录...
    chandarlee阅读 1,223评论 0 51