IOS第五周总结
UIView
在本周学习的控件中,基本所有的控件都继承了UIVIEW这个类
frame
如果要创建一个UIView对象,首先要确定它的位置和大小,frame即是它的位置大小属性。而要写FRAME属性,一般就要写CGRectMake(参数1,参数2,参数3,参数4),里面的1,2参数分别是它的左上角的(x,y)坐标,而参数3,4是它的宽和高。
例:
func creatView() {
//一个和屏幕一样大的MYview可以用来做背景
let myView = UIView.init(frame :CGRectMake(0,0,375,677))
}
想知道自己的背景大小可以让它用(print(self.view.frame))自动打印
在界面上显示
一般来说,只要在自动创建的界面上添加UIVIEW就可以了
self.view.addSubview(myView)
背景色
//然而这样是不会显示的,因为创建出来的背景默认是透明色,所以是看不见的,我们只需要改变它的背景色就可以了,
myView.backgroudColor = UIColor.blockColor()
现在就可以看到一个黑色的背景了
变形tansform
可以是图形发生改变,但是并没有动画效果,只是单纯的改变
缩放
参数1是宽的缩放比,参数2是高的缩放比
myView.transform = CGAffineTransformMakeScale(0.5,0,3)
旋转
参数:旋转角度(然而超过180时,它会自动选择较小的路径)
myView.transform = CGAffineTransformMakeRotation(CGFloat(M_PI))
位移
参数1:在x轴上平移,左减右加
参数2:在y轴上平移,上减下加
myView.transform = CGAffineTransformMakeTranslate(50,20)
复合形变
由于使用多次形变,只会触发最后一次形变,前面的无效,所以我们要使用符合形变。
1.在一个形变的前提下完成另一个形变
在CGA中没有MAKE的话,里面的第一个参数可以写另外一个形变
2组合2个形变
完成2个形变,作为参数1和参数2使用CGAffineTransformConcat(参数1,参数2)
父子视图
addSubView可以为一个视图添加多个子视图,而任何一个视图的父视图都只能有一个。
如果重复添加2个视图,那么只有在最后一个会生效。
获取一个视图的父视图
let superView= myView.superview
获取一个视图的所有子视图
let subViews = self.view.subviews
tag
我们常常对各种视图添加tag值来方便的进行寻找和操作。
视图的层次关系
虽然视图上有许多层次关系的方法,但实际中,我们只需要改变视图的创建顺序,就可以达到自己想要的层次关系~~
视图动画
动画一般只要设置时间,设置最后的大小位置,系统会自动补齐动画。
方法1
参数1表示这个动画的持续时间,单位为秒
方法里面主要写你希望它最后是什么样的,这样中间的过程电脑会自动补。
UIView.animateWIthDuration(参数1){
方法
}
方法2
参数1:一样是时间
参数2方法:写一个动画
参数3闭包:有这个闭包,说白了,动画就存在无限的可能性。闭包就是一个函数,一个函数呢,又能在里面再调函数,于是乎,子子孙孙无穷尽也。
UIView.animateWithDuration(2,animation:{方法}){(_) in 闭包}
方法3
参数1:动画时间
参数2:延迟播放时间
参数3:动画选项,枚举类型。常用Repeat重复播放,Autoreverse自动返回吃屎位置
参数4:动画结束状态
参数5:动画结束后执行的闭包
UIView.aniamteWithDuration(参数1,delay:参数2,options:[.参数3],animations:{参数4},completion:参数5)
方法4
参数1:动画时间
参数2:延迟时间
参数3:弹簧弹性系数
参数4:弹簧拉力
关于这两个力,基本就是让这个动画看起来来回晃,而拉力越大,那弹出去速度越快 ,力量愈强。弹性系数,我觉得在这里更像是摩擦力一样的东西,因为如果没有这个力的话,呢个动画有点抽搐式的来回动
参数5:选项:同上
参数6:动画结束状态
参数7:动画结束后要执行的闭包
UIView.animateWithDuration(参数1,delay:参数2,usingSpringWidthDamping:参数3,initialSpringVelocity:参数4,options:[参数5],animations:{参数6},completion:{参数7})
layer属性
1.切圆角
self.myView.layer.cornerRadius = 5
//当切圆角的值等于正方形的半径的一半时,就会切成圆
2.设置边框
//边框粗细
self.myView.layer.borderWidth = 3
//边框颜色
self.myView.layer.borderColor = UIColor.redColor().CGColor
3.子视图可改
//当该值为true时,视图内的子视图也会跟着改变
self.myView.layer.masksToBounds = true
UILabel
创建UILabel
1.创建对象
let label = UILabel.init(frame:CGRectMake(x,y,width,hight))
//2.添加到界面
self.view.addSubview
//3.设置背景色
label.backgroudColor = UIColor.yellowColor()
UILabel的专有属性
1.text属性
label.text = "hello world"
2.设置字体
参数1:字体大小
参数2:子图粗细(0-1)
label.font = UIFont.systemFontOfSize(参数1,weight:参数2)
//加粗字体
label.font = UIFont.boldSyestemFontOfSize(17)
//斜体
label.font = UIFont.italicSystemFontOfSize(17)
//使用字体
label.font = UIFont.init(name:"参数1",size:17)
关于使用自己的字体步骤
1.将ttf文件拖入工程
2.在info.plist文件中添加键值对"fonts provided by application",将字体添加到系统字体库中
3.通过提供字体名的构造方法去创建字体(先要找到自己添加的字体的字体名)
3.设置文字颜色
label.textColor = UIColor.redColor()
4.设置阴影颜色
label.shadowColor = UICcolor.blackColor()
5.这只阴影偏离效果
左减右加,上减下加
label.shandowOffset = CGSizeMake(-1,-1)
6.设置文字的对齐模式
默认为左对齐,枚举:Center居中,right ->右对齐,LEFT ->左对齐
label.textAlignment = .Center
7.设置行数
label.numberOfLines = 5
//自动换行
label.numberOfLines = 0
8.设置换行模式
ByWordWrapping 以单词为单位换行
ByCharWrapping 义字符为单位换行
label.lineBreakMode = .ByCharWrapping
根据文字设置Label的大小
let str = "天下皆知美之为美,斯恶也;皆知善之为善,斯不善也"
//计算显示指定文字所需要的最小区间
//1将SWift字符串转换过为OC字符串
let ocStr = str as NSString
//2.计算字符串大小
//参数1:限制显示当前字符创的最大宽度和最小空间,参数2:设置渲染方式,参数3:确定文字的字体大小
//NSFontAttributeName ->字体对应的key值
//NSForegroundColorAttributeName -> 文字颜色对应的key值
let strSize = ocStr.boundingRectWithSize(CGSizeMake(100, 1000000000), options: .UsesLineFragmentOrigin, attributes: [NSFontAttributeName:UIFont.systemFontOfSize(17)], context: nil).size
//3.创建label显示文字
let label = UILabel.init(frame: CGRectMake(100, 100, strSize.width, strSize.height))
label.backgroundColor = UIColor.yellowColor()
self.view.addSubview(label)
label.text = str
//自动换行
label.numberOfLines = 0
UIImageView
UIImage继承了UIView
创建UIImageView对象
//创建对象
self.imageView = UIImageView.init(frame:CGRectMake(0,100,300,300))
//添加到界面上
self.view.addSubview(imageView)
//设置背景颜色
imageView.backgroundColor = UIColor.yellowColor()
UIImageView专有属性
image
1.通过图片名去创建一个图片对象
imageView.image = UIImage.init(named:"名字")
注意:如果格式为PNG则后缀名可省略,而其他格式要加后缀名
2.通过图片路径去创建一个图片对象
let imagePath = NSBundle.mainBundle().pathForResource("名称","格式")
imageView.image = UIImage.init(contentsOfFile:imagePath!)
注意:将文件(除SWIFT文件)放到工程中,是指是放到当前应用程序的包文件中(想要拿到工程中的图片路径要先获取包文件;然后拿到包文件中的文件的路径)
3.比较通过图片名和通过图片地址创建图片对象的两种方法
3.1通过图片名创建的图片对象在程序结束后才会被销毁,只会创建一次;通过图片地址创建图片对象是当前图片对象不再使用的时候被销毁
3.2使用图片名创建图片的情况:创建小图标的时候;在工程总会重复使用的图片
3.3使用图片地址创建图片对象的情况:不会频繁的在多个界面出现的大图
内容模式
imageView.contentMode = .ScaleToFill
帧动画
var imageView = UIImageView()
//创建一个UIImageView对象
//通过图片去创建一个imageView;UIImageView的大小是图片的大小,坐标是(0,0)
imageView = UIImageView.init(image:UIImage.init(named:"名称"))
//显示在界面上
self.view.addSubview(imageView)
//3.使用UIImageView播放帧动画
//a.设置帧动画数组
//创建一个空的数组来装图片
var imageArray = [UIImage]()
//for循环创建18张图片
for item in 1...18{
//拼接图片名
let imageName = "名称\(item).png"
let image = UIImage.init(named:imageName)
//将图片存到数组中
imageArray.append(image!)
}
imageView.animationImages = imageArray
//b设置动画时间,单位为秒
imageView.animationDuration = 1
//c设置动画的重复次数(默认为0:无限循环)
imageView.animationRepeatCount = 0
//d开始动画
imageView.startAnimating()
定时器
每隔N秒,自动调用一次函数。
参数1:定时时间
参数2:调用方法的对象(一般为self)
参数3:存储定时时间到了以后需要调用的方法(可以不带参,也可以带参,但带参只能带一个参数,并且参数类型是NSTimer类型)
参数4:给当前的定时器的USERINFO赋值,一般写nil
参数5:是否重复
NSTimer.scheduledTimerWidthTimeInterval(参数1,target:参数2,selector:参数3,userInfo:参数4,repeats:参数5)
//暂停定时器
temer.fireDate = NSDate.distantFuture()
//让定时器继续
timer.fireDate = NSDate.distantPast()
UIButton
//创建一个按钮对象
let btn = UIButton()
//设置位置和大小
btn.frame = CGRectMake(x,y,width,height)
//设置title,参数1按钮内容,参数2,按钮状态(枚举)
//Normol正常状态;Hightlighted:高亮;selected:选中状态;disabled:不可用状态
btn.setTitle = ("按钮",forState:.Normal)
//设置图片(可选)
btn.setImagt(UIImage.init(named:"图片名"),forState:.Normol)
//设置背景色
btn.backgroundColor = UIColor.redColor()
//添加点击事件
//参数1:调用对象方法
//参数2:当按钮被点击时,需要执行的事件
//参数3:事件在什么时候执行
//TouchDown - 按钮按下
//TouchUpInside - 按下弹起
btn.addTarget(self,action:"btnAction",forControlEvents:.TouchupInside)
//设置按钮默认状态(默认是false 非选中)true为选中状态
btn.selected = false
//设置当前按钮是否可用(默认是true 可用)
btn.enabled = true
//设置文字颜色
btn.setTitleColor(UIColor.yellowColor(),forState:.Normal)
//设置按钮字体
btn.titleLabel?.font = UIFont.systemFontOfSize(12)
//设置按钮上的文字的对齐方式
btn.titleLabel?.textAlignment = .Right
自定义一个按钮
首先新建一个按钮类,继承UIButton.自定义的按钮中图片占4/5,而文字只占按钮高度的1/5.
class Mybutton:UIButton {
//重写图片坐标大小
override func imageRectForContentRect(contentRect:CGRect) ->CGRect{
let x:CGFloat = 0
let y:CGFloat = 0
let w:CGFloat = contentRect.size.width
let h:CGFloat = contentRect.szie.height * 4 / 5
return CGRectMake(x,y,w,h)
}
//重写文字坐标大小
override func titleRectForContentRect(contentRect:CGRect) ->CGRect{
let x:CGFloat = 0
let y:CGFloat = contentRect.size.height *4 / 5
let w = contentRect.size.width
let h = contentRect.size.height / 5
return CGRectMake(x,y,w,h)
}
}
//创建一个新的按钮对象
let btn = MyButton(frame:CGRectMake(100,100,200,220))
btn.setImage(UIImage.init(named:"图片名"),forState:.Normal)
btn.setTitle("按钮",forState:.Normol)
self.view.addSubview(btn)
UITextField
继承了UIControl,而UIControl继承UIView
UIView属性
//1创建UITextField对象
let textField = UITextField.init(frame:CGRrctMake(100,100,200,50))
//2添加到界面上
self.view.addSubview(textField)
//3设置背景色
textField.backgroundColor = UIColor.yellowColor()
UITextField专有属性
文字相关属性
//设置文本框内容
textField.text = "文字"
//文字颜色
textField.font = UIFont.systemFontOfSize(14)
//设置占位文字(默认显示)
textField.placeholder = "请输入"
//设置文本对齐方式(默认是左对齐)
textField.textAlignment = .left
//密文显示(默认为false)
textField.secureTextEntry = true
显示相关
//设置文本框样式
textField.borderStyle = .RoundedRect
//设置清楚按钮模式(前提是文本框中有文字)
textField.clearButtonMode = .Always//一直显示
//左边图像
let leftimage = UIImageView.init(frame:CGRectMake(0,0,40,40))
leftimage.image = UIImage.init(named:"图片名")
//设置左视图
textField.leftView = leftimage
//设置左视图的显示模式(默认是不显示)
textField.leftViewMode = .Always
//注:同理可设置右视图,但设置右视图时不能显示清楚按钮
键盘相关
//1.设置键盘上返回按钮的样式(例:查找)
textField.returnKeyType = .Search
//2.键盘样式
textField.keyboardType = .Default
//3.设置自定义的键盘
//自定义的键盘,只有高度有效。宽度是屏幕的宽度
let myinputView = UIView.init(frame:CGRectMake(0,0,0,256))
myInputView.backgroundColor = UIClor.redColor()
//4.设置子键盘
let accessoryView = UIView.init(frame:CGRectMake(0,0,0,50))
accessoryView.backgroundColor = UIColor.greenColor()
textField.inputAccessoryView = accessoryView
设置代理和委托
textField.delegate = self
textField->委托 self ->代理
//协议
extension ViewController:UITextFieldDelegate{
//1.在textField将要开始编辑时会自动调用
func textFieldShouldBeginEditing(textField:UITextField)->Bool {
print("将要开始编辑")
return true
}
//2.textFieldDidBeginEditing(textField:UITextField){
print("已经开始编辑")
}
//3.当文本输入框将要结束编辑的时候会自动调用这个方法
//返回:设置当前的textField是否可以结束编辑(默认是true)
func textFieldShouldEndEditing(textField:UITextField) ->Bool {
print("将要结束编辑")
}
//4.当文本框已经结束编辑的时候回自动调用这个方法
func textFieldDidEndEDiting(textField:UITextField){
print("已经结束编辑")
}
//5.当点击textField弹出来的键盘上的按键的时候回自动调用这个方法
func textField(textField:UITextField,shouldChangeCharactersInRange range:NSRange,replacementString string:String)->Bool {
if string == "0"{
//action
}
return true
}
//6.当点击返回按钮时会自动调用
func textFieldShouldReturn(textField:UITextField) ->Bool{
//收起键盘
//1放弃第一响应者
textField.resignFirstResponder()
//2直接让指定的textField结束编辑
textField.endEditing(true)
//3让self.view上所有的子视图都结束编辑
self.view.endEditing(true)
return true
}
}
例:自定义一个数字键盘
//MARK: - MyKeyBoard协议
protocol MyKeyBoardDelegate{
//让代理去显示指定的按钮上的内容
func showContent(button:UIButton)
}
//1.在创建当前类的对象的时候,去创建在这个视图上所有的子视图,并且添加(不需要设置子视图的frame)
//2.计算子视图的frame
//MARK: - 构造方法和属性
class MyKeyBoard:UIView{
//代理
var delegate:MyKeyBoardDelegate? = nil
//重写父类构造方法
override init(frame:CGRect) {
super.init(frame:frame)
//在这个方法中去创建所有的子视图
self.creatSubViews()
}
required init?(coder aDecoder:NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
extension MyKeyBoard{
//计算子视图坐标大小方法
//1.这个方法第一次调用是在当前视图将要显示在界面上的时候才会调用
//2.当当前视图显示出来后,如果视图的frame发生改变们就会调用这个方法
//重写这个方法
override func layoutSubviews() {
super.layoutSubviews()
//间距
let margin:CGFloat = 10
//宽度
let keyW = self.frame.size.width
//高度
let keyH= self.frame.size.height
//列数
let col :CGFloat = 3
//按键的宽度
let btnw = (keyW - (col+1)*margin)/col
//行数
let line: CGFloat = 4
//按键的高度
let btnH = (keyH - (line+1)*margin) / line
//1.拿到当前视图上的子视图
var i = 0
for item in self.subview {
//a计算按键的frame
//找到按钮对应的按钮
if item.tag == 100 {
let btnX = margin + (btnW+margin) * CGFloat(i%Int(col))
let btnY = margin + (btnW+margin) * CGFloat(i%Int(col))
item.frame = CGRectMake(btnX,btnY,btnW,btnH)
//找到一个按钮I+1
i +=1
}
//b.计算imageView的frame
if item == 200 {
item.frame = CGRectMake(20,-40,50,50)
}
}
}
//创建子视图
func creatSubView() {
//键盘上显示的内容
let titles = ["1","2","3","4","5","6","7","8","c","0","返回"]
//遍历数组,创建对应的按钮
//for(_,item) in titeles.enumerate(){
//创建对应的按钮
let btn = UIButton.enumerate() {
btn.setTitel(item,forState:.Normal)
btn.backgroundColor = UIColor.blackColor()
btn.tag = 100
btn.addTarget(self,action:"btnAction:"),forControlEvents:.TouchDown
self.addSubView(btn)
}
3.创建一个imageView
let imageView = UIImageView.init()
imageView.image = UIImage.init(named:"图片名")
self.addSubview(iamge)
imafeView.tag = 200
}
//按钮点击事件
func btnAction(btn:UIButton){
//MyKeyBard想要将按钮上的内容显示到ViewController中的textField上。但它做不到,只能委托给viewController去做
//三要素
//委托MyKeyBoard
//协议:将指定按钮上的内容显示在textField上
//代理viewController
self.delegate?.showContent(btn)
}
class ViewController:UIViewController,MyKeyBoardDelege{
var textField = UITextField()
override func viewDidLoad() {
super.viewDidLoad()
textField = UITextField.init(frame:CGRectMake(100,100,200,50))
textField.backgroudColor = UIColor.yellowColor()
self.view.addSubview(textField)
let KetBoard = MyKeyBoard(frame:CGRectMake(0,0,100,256))
keyBoard.frame = CGRectMake(0,0,100,250)
KeyBoard.delegate = self
keyBoard.backgroundColor = UIColor.GrayColor()
textField.inputView = KeyBoard
}
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!
}
开关
func creatSwitch(){
let se = UISwitch.init(frame:CGRectMake(100,100,100,50))
self.view.addSubview(sw)
//核心属性,默认状态为关,false
sw.on = true//true
//设置开关的开的状态颜色(默认为绿色)
se.onTintColor = UIColor.renColor()
//设置关闭的时候的边框颜色
sw.tintColor = UIColor.purpleColor()
//设置开关上滑块的颜色
sw.thumTintColor = UIColor.yellowColor()
//添加点击事件
sw.addTarget(self,action:"switchAction",forControlElevents:.ValueChanged)
}
滑条
func creatSlider() {
//1.创建滑条对象
//UISlider:UIControl:UIView
let slider = UISlider.init(frame:CGRectMake(100,160,200,20))
//2添加到界面上
self.view.addSubview(slider)
//3核心属性:值
//value:滑条的位置对应的值(默认是0-1)
slider.value = n
//设置滑条最小值
slider.minimumValue = 0
//设置滑条最大值
slider.maximumValue = 100
//是否连续改变
slider.continuous = false
//核心方法
slider.addTarget(self,action:"sliderAction",forControlEvents:.ValueChanged)
}
步进器
let stepper = UIStepper.init(frame:CGRectMake(100,100,100,50))
self.view.addSubview(stepper)
//核心属性
//当前值
stepper.value = 1
//最小值
stepper.minimumValue = 0
//最小值
stepper.maximumValue = 10
//步进
steeper.stepValue = 1 //必须大于一
//是否连续改变
stepper.continuous = false
//是否重复(false为按住不放不计数)
stepper.autorepeat = false
//设置渲染色
stepper.tintColor = UIColor.red
//点击事件
stepper.addTarget(self.action:"stepperAction",forControlEvents:.ValueChanged)
进度条
let progress = UIProgressView.init(frame:CGRectMake(100,100,200,20))
self.view.addSubview(progress)
//核心属性
//设置当前进度(范围0-1)
progress.setProgress(0.5,animated:true)
progress.tag = 100
活动指示器
func creatActivity() {
let activity = UIActivityIndivatorView.init(frame:CGRectMake(100,360,50,50))
self.view.addSubiview(activity)
//想要显示活动指示器,必须先让他开始动画
activity.startAnimating()
//停止动画(消失)
//activity.stopAnimating()
//设置活动指示器的样式
activity.activityIndicatorViewStyle = .WhiteLarge
}
多段选择器
func creatSegement(){
//多段选择器上内容对应的是数组
let segement = UISegementedControl.init(items:["1","2","3"])
segemnet.frame = CGRectMake(100, 400, 200, 50)
//2.显示在界面上
self.view.addSubview(segemnet)
//3.核心属性
//a.每个分段上的内容 ->通过创建分段选择器的时候去设置
//b.当前选中的分段的下标(从0开始)
segemnet.selectedSegmentIndex = 0
//4.核心方法
segemnet.addTarget(self, action: "segementAction:", forControlEvents: .ValueChanged)
//5.拿到分段选择的分段数
print(segemnet.numberOfSegments)
//6.设置填充颜色
segemnet.tintColor = UIColor.whiteColor()
}