暴走蘿莉
ViewController.swift
import UIKit
//MARK: - 生命周期和屬性
class ViewController: UIViewController {
//屬性:
let player = YTPersonImageView()
//生命周期:
override func viewDidLoad() {
super.viewDidLoad()
//創(chuàng)建界面
self.creatUI()
//創(chuàng)建定時器
NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: "timerAction", userInfo: nil, repeats: true)
}
//定時器
func timerAction() {
self.player.move()
}
}
//MARK: - 搭界面
extension ViewController{
func creatUI(){
//1.背景圖
let bgImageView = UIImageView.init(frame: self.view.bounds)
let path = NSBundle.mainBundle().pathForResource("map.png", ofType: nil)
bgImageView.image = UIImage.init(contentsOfFile: path!)
self.view.addSubview(bgImageView)
//3.小人
self.player.frame = CGRectMake(0, 0, 64, 64)
self.player.center = self.view.center
self.player.image = UIImage.init(named: "player_down_1.png")
self.player.animationDuration = 0.5
self.view.addSubview(self.player)
//2.方向按鈕
//左
let leftBtn = UIButton.init(frame: CGRectMake(72, 503, 80, 80))
leftBtn.setImage(UIImage.init(named: "button_left"), forState: .Normal)
leftBtn.addTarget(self, action: "touchDownAction:", forControlEvents: .TouchDown)
leftBtn.addTarget(self, action: "touchUpAction:", forControlEvents: .TouchUpInside)
leftBtn.tag = YTDirection.Left.rawValue
self.view.addSubview(leftBtn)
//右
let rightBtn = UIButton.init(frame: CGRectMake(232, 503, 80, 80))
rightBtn.setImage(UIImage.init(named: "button_right"), forState: .Normal)
rightBtn.addTarget(self, action: "touchDownAction:", forControlEvents: .TouchDown)
rightBtn.addTarget(self, action: "touchUpAction:", forControlEvents: .TouchUpInside)
rightBtn.tag = YTDirection.Right.rawValue
self.view.addSubview(rightBtn)
//上
let upBtn = UIButton.init(frame: CGRectMake(152, 444, 80, 80))
upBtn.setImage(UIImage.init(named: "button_up"), forState: .Normal)
upBtn.addTarget(self, action: "touchDownAction:", forControlEvents: .TouchDown)
upBtn.addTarget(self, action: "touchUpAction:", forControlEvents: .TouchUpInside)
upBtn.tag = YTDirection.Up.rawValue
self.view.addSubview(upBtn)
//下
let downBtn = UIButton.init(frame: CGRectMake(152, 543, 80, 80))
downBtn.setImage(UIImage.init(named: "button_down"), forState: .Normal)
downBtn.addTarget(self, action: "touchDownAction:", forControlEvents: .TouchDown)
downBtn.addTarget(self, action: "touchUpAction:", forControlEvents: .TouchUpInside)
downBtn.tag = YTDirection.Down.rawValue
self.view.addSubview(downBtn)
}
}
//MARK: - 按鈕點(diǎn)擊
extension ViewController{
//按鈕彈起
func touchUpAction(btn:UIButton){
//不能再移動
self.player.isMoving = false
}
//按鈕按下
func touchDownAction(btn:UIButton) {
//1.告訴小人的移動方向
switch btn.tag {
case YTDirection.Up.rawValue:
self.player.moveDirection = .Up
case YTDirection.Down.rawValue:
self.player.moveDirection = .Down
case YTDirection.Right.rawValue:
self.player.moveDirection = .Right
case YTDirection.Left.rawValue:
self.player.moveDirection = .Left
default:
print("不存在的方向")
}
//2.可以移動
self.player.isMoving = true
}
}
YTPersonImageView.swift
import UIKit
//MARK: - 方向枚舉
enum YTDirection:Int{
case Left
case Right
case Up
case Down
}
//MARK: - 全局變量
let screenH = UIScreen.mainScreen().bounds.size.height
let screenW = UIScreen.mainScreen().bounds.size.width
class YTPersonImageView: UIImageView {
//屬性:
//1.移動方向
var moveDirection: YTDirection = .Down
//2.是否移動
var isMoving = false{
//在給isMoving賦值的時候蓄髓,會自動調(diào)用這個didSet代碼塊
didSet{
//如果是變成移動狀態(tài)
if isMoving == true {
//設(shè)置當(dāng)前方向?qū)?yīng)的動畫數(shù)組
switch self.moveDirection {
case .Left:
self.animationImages = self.leftArray
case .Right:
self.animationImages = self.rightArray
case .Up:
self.animationImages = self.upArray
default:
self.animationImages = self.downArray
}
self.startAnimating()
}else{
//如果是變成停止?fàn)顟B(tài)
self.stopAnimating()
self.image = self.animationImages![0]
}
}
}
//3.動畫數(shù)組
//懶加載,就是當(dāng)前這個變量只創(chuàng)建一次舒帮,并且是在使用的時候才會創(chuàng)建会喝,不使用就不會創(chuàng)建
//左
lazy var leftArray:[UIImage] = {
var array = [UIImage]()
for item in 1...3{
let image = UIImage.init(named: "player_left_\(item)")
array.append(image!)
}
return array
}()
//右
lazy var rightArray:[UIImage] = {
var array = [UIImage]()
for item in 1...3{
let image = UIImage.init(named: "player_right_\(item)")
array.append(image!)
}
return array
}()
//上
lazy var upArray:[UIImage] = {
var array = [UIImage]()
for item in 1...3{
let image = UIImage.init(named: "player_up_\(item)")
array.append(image!)
}
return array
}()
//下
lazy var downArray:[UIImage] = {
var array = [UIImage]()
for item in 1...3{
let image = UIImage.init(named: "player_down_\(item)")
array.append(image!)
}
return array
}()
//方法:
//小人移動
func move() {
//判斷小人兒是否可以動
if isMoving == false {
return
}
//如果可以移動
switch self.moveDirection {
case .Down:
if self.frame.origin.y + 1 >= screenH - self.frame.size.height {
return
}
self.frame.origin.y += 1
case .Up:
if self.frame.origin.y - 1 <= 0 {
return
}
self.frame.origin.y -= 1
case .Left:
if self.frame.origin.x - 1 <= 0 {
return
}
self.frame.origin.x -= 1
default:
if self.frame.origin.x + 1 >= screenW - self.frame.size.width {
return
}
self.frame.origin.x += 1
}
}
}
屏幕快照 2016-08-25 下午8.23.38.png
2.自定義鍵盤
ViewController.swift
import UIKit
class ViewController: UIViewController,YTKeyBoardDelegate {
//MARK: - 屬性
var textField = UITextField()
//MARK: - 生命周期
override func viewDidLoad() {
super.viewDidLoad()
//1.創(chuàng)建一個UITextField對象
textField = UITextField.init(frame: CGRectMake(100, 100, 200, 50))
textField.backgroundColor = UIColor.init(red: 230/255.0, green: 230/255.0, blue: 230/255.0, alpha: 230/255.0)
self.view.addSubview(textField)
//使用自己的鍵盤
let keyBoard = YTKeyBoard(frame: CGRectMake(0,0,100,256))
keyBoard.frame = CGRectMake(0, 0, 100, 250)
//設(shè)置代理
keyBoard.delegate = self
keyBoard.backgroundColor = UIColor.init(red: 105/255.0, green: 105.0/255.0, blue: 105/255.0, alpha: 105/255.0)
textField.inputView = keyBoard
}
//MARK: - YTKeyBoard delegate
func showContent(button: UIButton) {
if button.currentTitle == "返回" {
//收起鍵盤
self.textField.resignFirstResponder()
return
}
if button.currentTitle == "C" {
//判斷textField中的文字是否為空,不為空才做刪除操作
if self.textField.text?.characters.count > 0 {
//拿到最后一個字符的index
let last = self.textField.text!.endIndex.predecessor()
//移除最后一個字符
var text = self.textField.text!
text.removeAtIndex(last)
self.textField.text = text
}
return
}
textField.text = textField.text! + button.currentTitle!
}
}
YTKeyBoard.swift
import UIKit
//MARK: - YTKeyBoard協(xié)議
protocol YTKeyBoardDelegate{
//讓代理去顯示指定的按鈕上的內(nèi)容
func showContent(button:UIButton)
}
//1.在創(chuàng)建當(dāng)前類的對象的時候玩郊,去創(chuàng)建在這個視圖上所有的子視圖肢执,并且添加(不需要設(shè)置子視圖的frame)
//2.計(jì)算子視圖的frame
//MARK: - 構(gòu)造方法和屬性
class YTKeyBoard: UIView {
//代理
var delegate: YTKeyBoardDelegate? = nil
//重寫父類的構(gòu)造方法
override init(frame: CGRect) {
super.init(frame: frame)
//在這個方法中去創(chuàng)建所有的子視圖
self.creatSubViews()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
//MARK: - 創(chuàng)建子視圖
extension YTKeyBoard{
//計(jì)算子視圖的frame
//1.這個方法第一次調(diào)用是在當(dāng)前視圖將要顯示在界面上的時候才會調(diào)用(在這個方法中拿到的當(dāng)前視圖的frame是視圖最終frame值)
//當(dāng)當(dāng)前視圖顯示出來之后,如果視圖frame發(fā)生改變译红,就會自動調(diào)用這個方法
override func layoutSubviews() {
super.layoutSubviews()
//間距
let margin:CGFloat = 10
//寬度
let keyW = self.frame.size.width
//高度
let keyH = self.frame.size.height
//列數(shù)
let col: CGFloat = 3
//按鍵的寬度
let btnW = (keyW - (col+1)*margin) / col
//行數(shù)
let line: CGFloat = 4
//按鍵的高度
let btnH = (keyH - (line+1)*margin) / line
// Y:margin+(btnH+margin)*(i/col)
// X:margin+(btnW+margin)*(i%col)
//1.拿到當(dāng)前視圖上的子視圖
var i = 0
for item in self.subviews {
//a.計(jì)算按鍵的frame
//找到按鍵對應(yīng)的按鈕
if item.tag == 100 {
let btnX = margin + (btnW+margin) * CGFloat(i%Int(col))
let btnY = margin + (btnH+margin) * CGFloat(i/Int(col))
item.frame = CGRectMake(btnX, btnY, btnW, btnH)
//找到一個按鈕i加1
i += 1
}
//b.計(jì)算imageView的frame
if item.tag == 200 {
item.frame = CGRectMake(20, -40, 50, 50)
}
}
}
//創(chuàng)建子視圖
func creatSubViews() {
//1.鍵盤上顯示的內(nèi)容
let titles = ["1","2","3","4","5","6","7","8","9","C","0","返回"]
//2.遍歷數(shù)組预茄,創(chuàng)建對應(yīng)的按鈕
//i ->下標(biāo)
//item -> 數(shù)組元素
for (_,item) in titles.enumerate() {
//創(chuàng)建對應(yīng)的按鈕
let btn = UIButton.init()
btn.setTitle(item, forState: .Normal)
btn.backgroundColor = UIColor.init(red: 230/255.0, green: 230/255.0, blue: 230/255.0, alpha: 230/255.0)
// 鍵盤上的字體顏色
btn.setTitleColor(UIColor.blackColor(), forState: .Normal)
btn.tag = 100
btn.addTarget(self, action: "btnAction:", forControlEvents: .TouchDown)
self.addSubview(btn)
}
//3.創(chuàng)建一個imageView
let imageView = UIImageView.init()
imageView.image = UIImage.init(named: "luffy1")
self.addSubview(imageView)
imageView.tag = 200
}
//按鈕點(diǎn)擊
func btnAction(btn:UIButton){
//YTKeyBoard想要將按鈕上的內(nèi)容顯示到ViewController中的textField上。但是YTKeyBoard是做不到侦厚,但是ViewController可以耻陕。
//確定三要素:
//委托:YTKeyBoard
//協(xié)議:將指定按鍵上的內(nèi)容顯示在textField上
//代理:ViewController
//currentTitle屬性->按鈕上的文字
print(btn.currentTitle)
//讓代理去顯示按鈕上的內(nèi)容
self.delegate?.showContent(btn)
}
}
屏幕快照 2016-08-25 下午8.25.21.png
3.UITextField基礎(chǔ)知識
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// UITextField:UIControl:UIView
// ============UIView的屬性和方法=============
// 1. 創(chuàng)建UITextField對象
let textField = UITextField.init(frame: CGRectMake(100, 100, 200, 50))
// 2. 添加到界面上
self.view.addSubview(textField)
// 3. 設(shè)置背景顏色
textField.backgroundColor = UIColor.yellowColor()
// 4. 再創(chuàng)建一個UITextField對象
let textField1 = UITextField.init(frame: CGRectMake(100, 200, 200, 50))
self.view.addSubview(textField1)
textField1.backgroundColor = UIColor.yellowColor()
textField1.delegate = self
// ==========textField的專有屬性和方法==========
// (1). 文字相關(guān)
// 1. text屬性
// 設(shè)置文本輸入框的內(nèi)容
textField.text = ""
// 拿到文本輸入框的內(nèi)容
print(textField.text)
// 2. 文字顏色
textField.textColor = UIColor.brownColor()
// 3. 設(shè)置文字字體
textField.font = UIFont.systemFontOfSize(14)
// 4. 設(shè)置占位文字(在輸入框的內(nèi)容為空的時候就會顯示出來)
textField.placeholder = "請輸入賬號"
// 5. 設(shè)置文本的對齊方式(默認(rèn):左對齊)
textField.textAlignment = .Left
// 6. 密文顯示(默認(rèn)是false)
textField.secureTextEntry = true
//(2) 顯示相關(guān)
// 1. 設(shè)置文本框的樣式
textField.borderStyle = .RoundedRect
// 2. 設(shè)置清除按鈕模式
// Always -> 一直顯示
// Never -> 從不顯示(默認(rèn))
// WhileEditing -> 當(dāng)文本框輸入處于編輯狀態(tài)的時候顯示
// UnlessEditing -> 當(dāng)文本框輸入處于非編輯狀態(tài)的時候顯示
// 注: 當(dāng)文本輸入框中有光標(biāo)的時候就是處于編輯狀態(tài)
textField.clearButtonMode = .Always
// 3. 左視圖
let leftImageView = UIImageView.init(frame: CGRectMake(0, 0, 50, 50))
leftImageView.image = UIImage.init(named: "luffy4")
// 設(shè)置做視圖
textField.leftView = leftImageView
//設(shè)置做視圖的顯示模式(確定什么時候顯示,默認(rèn)是從不顯示)
textField.leftViewMode = .Always
// 4. 右視圖
// 當(dāng)又視圖顯示的時候刨沦,清除按鈕不能顯示
/*
let rightLabel = UILabel.init(frame: CGRectMake(0, 0, 40, 40))
rightLabel.text = "你好"
textField.rightView = rightLabel
textField.rightViewMode = .Always
*/
// (3) 鍵盤相關(guān)
// 1. 設(shè)置鍵盤上返回按鈕的樣式
textField.returnKeyType = .Done
// 2. 鍵盤樣式
textField.keyboardType = .Default
// 3.設(shè)置自定義的鍵盤
// 自定義的鍵盤诗宣,只有高度有效。寬度是屏幕的寬度
let myInputView = UIView.init(frame: CGRectMake(0, 0, 0, 256))
myInputView.backgroundColor = UIColor.redColor()
// textField.inputView = myInputView
// 4. 設(shè)置子鍵盤
let accessoryView = UIView.init(frame: CGRectMake(0, 0, 0, 50))
accessoryView.backgroundColor = UIColor.greenColor()
textField.inputAccessoryView = accessoryView
// (4) 設(shè)置代理
// textField -> 委托
// self -> 代理
textField.delegate = self
}
}
extension ViewController:UITextFieldDelegate {
// 6. 當(dāng)按鍵盤上的返回按鈕的時候已卷,會自動調(diào)用
func textFieldShouldReturn(textField: UITextField) -> Bool {
print("返回按鈕被點(diǎn)擊")
// 收起鍵盤
// 1. 放棄第一響應(yīng)者
textField.resignFirstResponder()
// 2. 直接讓指定的textField結(jié)束編輯
textField.endEditing(true)
// 3. 讓self.view上的所有的子視圖都結(jié)束編輯
self.view.endEditing(true)
return true
}
// 5. 當(dāng)點(diǎn)擊textField彈出來的鍵盤上的按鍵的時候會自動調(diào)用這個方法
// 參數(shù)1: 委托
// 參數(shù)2: 當(dāng)前輸入的的字符所在的位置
// 參數(shù)3: 當(dāng)前輸入的字符串(在鍵盤上按的鍵的值)
// 返回值: 是否可以改變textField的text屬性(); false -> 按鍵盤上的按鍵無效
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
print(range)
print(string)
if string == "0" {
print("進(jìn)入秘密頁")
}
return true
}
// 4. 當(dāng)文本輸入框已經(jīng)結(jié)束編輯的時候會自動調(diào)用這個方法
func textFieldDidEndEditing(textField: UITextField) {
print("已經(jīng)結(jié)束編輯")
}
// 2. 當(dāng)文本輸入框已經(jīng)開始編輯的時候會自動調(diào)用這個方法
func textFieldDidBeginEditing(textField: UITextField) {
print("已經(jīng)開始編輯")
}
// 3.當(dāng)文本輸入框?qū)⒁Y(jié)束編輯的時候會自動調(diào)用這個方法
// 返回: 設(shè)置當(dāng)前的textField是否可以結(jié)束編輯()默認(rèn)是true
func textFieldShouldEndEditing(textField: UITextField) -> Bool {
print("將要結(jié)束編輯")
// 要求文本輸入框的文字長度要大于等于8的時候才能結(jié)束編輯
if textField.text?.characters.count >= 8 {
return true
}
return false
}
// 1. 在textField將要開始編輯的時候會自動調(diào)用
// 參數(shù):當(dāng)前這個協(xié)議對應(yīng)的的委托
// 返回值:設(shè)置當(dāng)前的textField是否可以進(jìn)行編輯(默認(rèn)是true)
func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
print("將要開始編輯")
return true // false -> 讓textField不能進(jìn)行編輯
}
}