2015年12月

超级猜图swift

代码太多,贴几个重点吧

通过plist初始化(kvc),可以很方便的对类的属性进行赋值
//
//  Question.swift
//  超级猜图
//
//  Created by admin on 15/12/30.
//  Copyright © 2015年 jin. All rights reserved.
//

import UIKit

class Question: NSObject {
    var answer:NSString!
    var icon:NSString!
    var title:NSString!
    var options:NSArray!
    //加载文件,初始化对象数组
    class func loadQuestionOfFile()->[Question]
    {
        let datas:NSArray! = NSArray(contentsOfFile: NSBundle.mainBundle().pathForResource("questions", ofType: "plist")!)
        var temp:[Question] = []
        for data in datas
        {
            temp.append(Question.instance(data as! NSDictionary))
        }
        return temp
    }
    //传入字典,初始化对象
    class func instance(questionData:NSDictionary)->Question
    {
//        var temp = Question(answer:questionData["answer"] as! NSString,title:questionData["title"] as! NSString,icon:questionData["icon"] as! NSString,option:questionData["option"] as! NSArray)
//        self.init(answer:questionData["answer"] as! NSString,title:questionData["title"] as! NSString,icon:questionData["icon"] as! NSString,option:questionData["options"] as! NSArray)
        let temp = Question()
        //直接使用字典的键值对队完成对对象属性的肤赋值
        temp.setValuesForKeysWithDictionary(questionData as! [String : AnyObject])
        return temp
    }
}

kvc其它用法
//取出对象数组中对象的icon值
print((self.questions as NSArray).valueForKeyPath("icon")!)
//取出对象数组中对象的book值(是一个类)的name属性,这里执行会报错,oc使用点分割swift呢?
print(self.questions[0].valueForKeyPath("book.name"))
隐藏程序界面状态栏
override func prefersStatusBarHidden() -> Bool {
     return true
}
隐藏启动界面状态栏

General>Deployment Info>Hide status bar勾选就好了

修改状态栏 style
override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return UIStatusBarStyle.LightContent//居中
}
删除子控件
self.answerButtonView.subviews.forEach({$0.removeFromSuperview()})
弹出框
var alert = UIAlertView(title: "提示", message: "后面没有题了", delegate: nil, cancelButtonTitle: "取消", otherButtonTitles: "确认", "测试A","测试B")
控件放到最顶层
self.view.bringSubviewToFront(self.imageView)

xcode设置图标和启动加载界面

设置图标

新建好项目之后,会有一个Assets.xcassets文件,里面有一个AppIcon,把图标图片直接拖进去就好了,当然,不同类型的设备需要不同的图片,这个就需要自己适配了

设置启动界面

默认的启动界面是 新建好项目之后,项目下的LaunchScreen.storyboard这里把这个storyboard改成图片,在General>App Icons and Launch Images>Lanunch Screen File里面的值删掉,回车,会弹出一个对话框,确认一下
然后就可以看见在Assets.xcassets里面新建好了一个Brand Assets(这个名字就是Lanunch Screen File上面的那个选项里面选择的值),把启动图片拖进去就ok了

九宫格的修改

之前的九宫格的控件都是用代码加的,这里改用xib,http://jinblog.com/archives/285.html

1.新建xib,这个直接在在项目里面新建一个User Interface->Empty就好了
2.拖控件
3.设置好xib的Custom Class
4.设置好控件和Custom Class类的关联,Custom Class代码如下

//
//  AppBlockView.swift
//  九宫格
//
//  Created by admin on 15/12/28.
//  Copyright © 2015年 jin. All rights reserved.
//

import UIKit

class AppBlockView: UIView {


    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var button: UIButton!
    @IBOutlet weak var lable: UILabel!
    //类方法,用来方便的实例话xib
    class func instance()->UIView
    {
        //加载xib的方法
        return NSBundle.mainBundle().loadNibNamed("AppBlockView", owner: nil, options: nil).last as! AppBlockView
    }
}

4.使用,这里碰到一个问题,xib里面的imageview没有办法去修改大小,修改成功了,但是运行效果确还是那么大的

//加载xib
var blockView = AppBlockView.instance() as! AppBlockView
//xib里面有个 imageview ,设置下图片
blockView.imageView.image = UIImage(contentsOfFile: NSBundle.mainBundle().pathForResource("icon_00", ofType: "png")!)!
//输出宽肚,输出结果是: 214.0
print(blockView.imageView.frame.width)
//设置 fram
blockView.imageView.frame = CGRectMake(100,100, 10, 10)
blockView.imageView.backgroundColor = UIColor.blackColor()
//输出宽 输出结果是  10.0,设置输出的结果就是修改之后的结果,但是运行的话,看上去还是那么大
print(blockView.imageView.frame.width)
blockView.button.addTarget(self, action: "showInfo:", forControlEvents: UIControlEvents.TouchDown)

动画函数的用法

UIView.animateWithDuration(3, animations: {
    self.lable.alpha = 0
}, completion:
{
     (status) in
     //设置当前按钮的图片和文字,禁用点击
     button.setBackgroundImage(UIImage(imageLiteral: "buttongreen"), forState: UIControlState.Normal)
     button.setBackgroundImage(UIImage(imageLiteral: "buttongreen_highlighted"), forState: UIControlState.Highlighted)
     button.setTitle("下载完成", forState: UIControlState.Normal)
     button.enabled = false
     //设置lable透明度
     self.lable.alpha = 1
     //移除lable
     self.lable.removeFromSuperview()
     //允许用户和页面交互,这个值在点击事件发生之后会被设置成`false`,用户就不能点击界面的任何按钮了,所以这里需要复原
     self.view.userInteractionEnabled = true
})

九宫格

//
//  ViewController.swift
//  九宫格
//
//  Created by admin on 15/12/26.
//  Copyright © 2015年 jin. All rights reserved.
//

import UIKit

class ViewController: UIViewController {
    //存放通知消息的lable
    lazy var lable:UILabel =
    {
        var lable = UILabel()
        //设置宽度
        lable.frame.size.width = 100
        //设置高度
        lable.frame.size.height = 20
        //设置位置
        lable.transform = CGAffineTransformMakeTranslation(UIScreen.mainScreen().bounds.size.width/2 - lable.frame.size.width/2, UIScreen.mainScreen().bounds.size.height/2)
        //设置背景颜色
        lable.backgroundColor = UIColor(red: 0.483992,green:0.638788,blue: 1, alpha: 1)
        //设置文字
        lable.text = "正在下载中........"
        //设置圆角,button可以设置,lable没有效果啊
        lable.layer.cornerRadius = 50
        return lable
    }()
    //当前最后一个插入主视图在数组中的下标
    var dataIndex:Int = 0
    override func viewDidLoad() {
        super.viewDidLoad()

        //获得图片信息
        let data = NSArray.init(contentsOfFile: NSBundle.mainBundle().pathForResource("app", ofType: "plist")!)
        //循环添加控件
        for (var (index,blockInfo)) in EnumerateSequence(data!)
        {
            //获得图片
            let image = UIImage(contentsOfFile: NSBundle.mainBundle().pathForResource(String(blockInfo["icon"]!!), ofType: "png")!)
            //获得图片描述
            let descreption = String(blockInfo["name"]!!)
            //设置最后插入视图的数据的在数据数组中的下标
            self.dataIndex = index
            //执行插入
            addChildBlok(image!,description: descreption,dataIndex: self.dataIndex)
        }
    }
    //UIImage好像没有直接缩放的办法,就用这个完成缩放
    func scalImage(image:UIImage,scal:CGFloat)->UIImage
    {
        //创建 CGSize 对象记录下缩放改变比例之后的宽高,方便之后的使用
        let imageSize = CGSize(width: CGFloat(image.size.width*scal),height: CGFloat(image.size.height*scal))
        //创建一个 bitmap 大小的 context
        UIGraphicsBeginImageContext(imageSize)
        //绘制改变大小的图片
        image.drawInRect(CGRect(x: 0, y: 0, width: imageSize.width, height: imageSize.height))
        //从当前context中创建一个改变大小后的图片
        let imageTest = UIGraphicsGetImageFromCurrentImageContext()
        //使当前 context 出栈
        UIGraphicsEndImageContext()
        return imageTest
    }
    func addChildBlok(image:UIImage,description:String,dataIndex:Int)
    {
        //列数是计算而成的,初始化是散列
        var column = 3
        //这里可以通过屏幕的宽度来选择显示多少条
        if UIScreen.mainScreen().bounds.size.width > 0
        {
            column = 4
        }

        //获得屏幕当前 view 的左边距
        var marginLeft = Int(UIScreen.mainScreen().bounds.size.width * 0.05)
        //上边距
        let marginTop = 20
        //获得 view 的宽度
        let blockViewWidth = Int(UIScreen.mainScreen().bounds.size.width * 0.8 / CGFloat(column))
        //重新设置左边距,以达到居中的效果
        marginLeft = (Int(UIScreen.mainScreen().bounds.size.width) - column * blockViewWidth) / 2


        //创建 view


        let blockView = UIView(frame: CGRect(x: 0,y: 0,width: 0,height: 0))

        //设置blockview颜色,用以调试
        //blockView.backgroundColor = UIColor(red:0.483992,green:0.638788,blue: 1,alpha: 1)
        self.view.addSubview(blockView)

        //获得图片信息
        var image = image
        let descreption = description
        //缩放图片
        image = scalImage(image, scal: (CGFloat(blockViewWidth) * 0.8)/image.size.width)

        //创建 UIImageView 承载图片
        let imageView = UIImageView(image: image)
        //改变UIImageView位置
        let imageMarginLeft = CGFloat((Double(blockViewWidth) * 0.1))
        let imageMarginTop = CGFloat((Double(blockViewWidth) * 0.1))
        imageView.transform = CGAffineTransformTranslate(imageView.transform, imageMarginLeft, imageMarginTop)

        //加入当前view中
        blockView.addSubview(imageView)


        //加入 UIlable ,并设定好坐标和大小
        let lableMarginLeft = imageMarginLeft
        let lableMarginTop = imageMarginTop + imageView.frame.height
        let lable = UILabel(frame: CGRect(x: lableMarginLeft,y: lableMarginTop,width: CGFloat((Double(blockViewWidth) * 0.8)),height: 10))
        //像这样直接创建一个,设置字体没有效果
        //lable.font = UIFont(name: "System", size: CGFloat(10))
        //改变字体的大小
        lable.font = lable.font.fontWithSize(8)
        //改变字体对齐方式
        lable.textAlignment = NSTextAlignment.Center
        //设置lable显示的文字
        lable.text = descreption
        blockView.addSubview(lable)

        //加入button并设定好位置信息
        let buttonMarginLeft = imageMarginLeft
        let buttonMarginTop = imageMarginTop + lable.frame.height + imageView.frame.height
        let button = UIButton(frame: CGRect(x: buttonMarginLeft,y: buttonMarginTop,width: CGFloat((Double(blockViewWidth) * 0.8)),height: 10))
        //设置背景图片
        button.setBackgroundImage(UIImage(imageLiteral: "buttongreen"), forState: UIControlState.Normal)
        button.setBackgroundImage(UIImage(imageLiteral: "buttongreen_highlighted"), forState: UIControlState.Highlighted)
        //设置title
        button.setTitle("点击下载", forState: UIControlState.Normal)
        button.setTitle("正在下载", forState: UIControlState.Highlighted)
        //设置字体大小
        button.titleLabel?.font = button.titleLabel?.font.fontWithSize(7)
        //绑定事件
        button.addTarget(self, action: "showInfo:", forControlEvents: UIControlEvents.TouchDown)
        //设定当前view的坐标和大小
        let blockViewHeight = imageMarginTop + imageView.frame.height + lable.frame.height + button.frame.height
        let blockViewX = (dataIndex%column) * blockViewWidth + marginLeft
        let blovkViewY = (dataIndex/column) * Int(blockViewHeight) + marginTop
        blockView.frame = CGRectMake(CGFloat(blockViewX), CGFloat(blovkViewY), CGFloat(blockViewWidth), CGFloat(blockViewHeight))

        blockView.addSubview(button)

//        self.view.bringSubviewToFront(button)
        //出现一次情况,按钮点击之后没有任何反应,搞了半天,后来想到用这个办法调试,发现原来是button的位置不在父控件的view之内
//        blockView.backgroundColor = UIColor(red:0.483992,green:0.638788,blue: 1,alpha: 1)
//        imageView.backgroundColor = UIColor(red:0.12323,green:0.123123,blue: 1,alpha: 1)


    }
    //按钮点击事件,显示一个lable
    func showInfo(sender:UIButton)
    {
        //改变当前点击按钮的图片和文字,禁用点击
        sender.setBackgroundImage(UIImage(imageLiteral: "buttongreen_highlighted"), forState: UIControlState.Normal)
        sender.setTitle("正在下载", forState: UIControlState.Normal)
        sender.enabled = false
        //显示lable按钮
        self.view.addSubview(self.lable)
        //延时执行函数
        self.performSelector("hideInfo:", withObject: sender, afterDelay: 1)
    }
    //执行完毕,隐藏lable
    func hideInfo(button:AnyObject)
    {
        //设置lable透明度
        UIView.animateWithDuration(3, animations: {
            self.lable.alpha = 0
        })
        //延时执行函数,初始化执行完毕的信息
        self.performSelector("endDownload:", withObject: button, afterDelay: 3)
    }
    //进行下载完成之后的初始化
    func endDownload(button:UIButton)
    {
        //设置当前按钮的图片和文字,禁用点击
        button.setBackgroundImage(UIImage(imageLiteral: "buttongreen"), forState: UIControlState.Normal)
        button.setBackgroundImage(UIImage(imageLiteral: "buttongreen_highlighted"), forState: UIControlState.Highlighted)
        button.setTitle("下载完成", forState: UIControlState.Normal)
        button.enabled = false
        //设置lable透明度
        self.lable.alpha = 1
        //移除lable
        self.lable.removeFromSuperview()
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}


swift版本的汤姆猫

//
//  ViewController.swift
//  汤姆猫
//
//  Created by admin on 15/12/25.
//  Copyright © 2015年 jin. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    //定义 UIImageView 变量
    var imageView:UIImageView = UIImageView()
    override func viewDidLoad() {
        super.viewDidLoad()
        //设置imageView坐标,尺寸
        imageView.frame = CGRect(origin: CGPoint(x: 20, y: 20), size: CGSize(width: 280, height: 450))
        //设置imageView默认图片
        imageView.image = UIImage(contentsOfFile: NSBundle.mainBundle().pathForResource("cymbal_00", ofType: "jpg")!)!
        //把imageView添加进主视图
        self.view.addSubview(self.imageView)
        addButton("cymbal",actionName: "cymbal",x:50,y:400)
        addButton("pie",actionName: "pie",x:100,y:400)
        // Do any additional setup after loading the view, typically from a nib.
    }
    //添加按钮方法
    func addButton(backgroundImage:String,actionName:String,x:CGFloat,y:CGFloat)
    {
        //添加按钮
        let cymbalButton = UIButton()
        let buttonBackgroundImage = UIImage(imageLiteral: backgroundImage)
        //设置按钮背景图片
        cymbalButton.setBackgroundImage(buttonBackgroundImage, forState: UIControlState())
        //设置按钮位置坐标和宽度高度
        cymbalButton.frame = CGRect(origin: CGPoint(x: x, y: y), size: CGSize(width: buttonBackgroundImage.size.width, height: buttonBackgroundImage.size.height))
        //绑定事件方法,带参数的方法要加上冒号
        cymbalButton.addTarget(self, action: Selector("\(actionName):"), forControlEvents: UIControlEvents.TouchDown)
        //添加进主视图
        self.view.addSubview(cymbalButton)
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    func cymbal(sender: AnyObject) {
        //执行动画
        doAnimatingImage(self.getAnimatingImage("cymbal_",startNumber:0,endNumber:12))
    }
    @IBAction func pie(sender: AnyObject) {
        doAnimatingImage(self.getAnimatingImage("pie_",startNumber:0,endNumber:23))
    }
    //获得图片资源
    func getAnimatingImage(imagePrefix:String,startNumber:Int,endNumber:Int)->[UIImage]
    {
        var imageArr:[UIImage] = []
        for var i = startNumber;i <= endNumber;i++
        {
            //不足两位用0补齐
            let imagePath = String(format: "%02i", i)
            //使用这个方式(imageLiteral)创建的图片会缓存在内存中,系统内存占用会很大
            //imageArr.append(UIImage(imageLiteral: "\(imagePrefix)\(imagePath)"))
            //这个方式创建的图片不会缓存在内存中,但是要注意,图片不能放在.xcassets文件中,.xcassets中的文件都是经过处理的,不能像这样取得
            imageArr.append(UIImage(contentsOfFile: NSBundle.mainBundle().pathForResource("\(imagePrefix)\(imagePath)", ofType: "jpg")!)!)
        }
        return imageArr
    }

    //播放动画
    func doAnimatingImage(imageArr:[UIImage])
    {
        //当前正在执行动画的时候,不响应动作
        if imageView.isAnimating() == false
        {
            //设置帧动画图片数组
            imageView.animationImages = imageArr
            //设置重复次数,默认是执行无数次,这里设置成1次
            imageView.animationRepeatCount = 1
            //设置动画执行时间
            imageView.animationDuration = NSTimeInterval(Double(imageArr.count) * 0.07)
            //开始执行动画
            imageView.startAnimating()
            //动画之行完毕之后释放内存,这个函数是延时执行的
            self.performSelector(Selector("clearAnimetingImage"), withObject: nil, afterDelay: imageView.animationDuration)
        }
    }
    //清除对UIImage数组的强引用,释放内存
    func clearAnimetingImage()
    {
        imageView.animationImages = nil
    }

}