iOS 基础UI
课程就要接近尾声了所以我总结了一些关于ios ui的一些基本知识点和属性
day_01 uikit框架-uikit-uiview
创建window
在appdelegate.m文件内实现
1.创建window对象
[uiscreen mainscreen]是一个单例,代表屏幕大小的一个单例
self.window = [[uiwindow alloc]initwithframe:[uiscreenmainscreen].bounds];
2.设置window属性
self.window.backgroundcolor = [uicolor browncolor];
3.使创建的window对象成为主窗口且可见(一般来说一个应用程序只有一个主窗口)
[self.window makekeyandvisible];
4.创建视图控制器
创建一个mainviewcontroller类
mainviewcontroller *mainvc = [[mainviewcontroller alloc]init];
self.window.rootviewcontroller = mainvc;
操控模拟器
回到主界面:shift+command+h
横竖屏切换:command+方向键(左右)
缩放:optional+鼠标左键
每一个视图控制器自带一个视图(view)
给视图控制器的视图设置属性
self.view.backgroundcolor = [uicolor whitecolor];
ui中所有可见的视图都是uiview或者uiview的子类
视图展示三部曲
1.创建对象
2.设置属性
3.添加到父视图上
1.创建对象
uiview *blackv = [[uiviewalloc]initwithframe:cgrectmake(100,100,200,200)];
2.设置属性
blackv.backgroundc-olor = [uicolor blackcolor];
3.添加到父视图上
[self.view addsubview:view];
view的属性设置
a.设置背景颜色
blackv.backgroundcolor = [uicolor blackcolor];
b.设置透明度(0~1之间)
blackv.alpha = 0.8;
c.设置tag值(默认为0)
blackv.tag = 10;
d.根据tag值获取相应的视图
uiview *v = [self.view viewwithtag:10];
e.获取子视图
nsarray *arr = [self.view subviews];
f.获取父视图
uiview *superv = [view superview];
g.视图的显隐
blackv.hidden = yes;
frame,center,bounds的不同
frame既可以改变当前视图的大小,也可以改变当前视图的位置,它是相对于父视图而言
center是改变当前视图的位置
bounds可以改变当前视图的大小和子视图的位置,默认原点是(0,0)
bounds的point描述的就是当前视图左上角点和原点的距离
point设置为整数那么原点往左上角偏移
简单来说就是将point看作是描述左上角点的坐标
视图的添加和删除
创建视图redv和yellowv
视图插入
a.将redv放在blackv下面
[self.view insertsubview:redv belowsubview:blackv];
b.将yellowv放在redv和blackv的中间(把yellowv放到redv上面)
[self.view insertsubview:yellowv abovesubview:redv];
c.将yellowv通过下标插入到redv下面(把yellowv方法第一层)
[self.view insertsubview:yellowv atindex:0];
将redv视图放到最前面
[self.view bringsubviewtofront:redv];
将blackv视图放到最后面
[self.view bringsubviewtoback:blackv];
将视图从父视图上移除
[yellow removefromsuperview];
day_02 uilabel、uibutton、uitextfield、uiimageview
一、uilabel:文本视图
text:设置文本
textcolor:文本颜色
numberoflines:设置行数(设置为0自动换行)
font:文本字体
systemfontofsize:文本字体颜色
textalignment:文本对齐方式
shadowoffset:阴影偏移量
shadowcolor:阴影颜色
layer.borderwidth:文本边框宽度
layer.bordercolor:文本边框颜色
layer.cornerradius:设置圆角
layer.maskstobounds:是否裁剪边缘
二、uitextfield:文本输入框
placeholder:占位符
borderstyle:边框风格(uitextborderstyleroundedrect:圆角)
clearbuttonmode:清除按钮显示状态
clearsonbeginediting:是否开始编辑的时候清除
leftview:左视图
leftviewmode:左视图模式
securetextentry:密文输入
keyboardtype:键盘样式
设置代理
textfield.delegate = self;
textfield协议重写方法
文本输入框协议里的方法
1、文本输入框能否开始编辑
-(bool)textfieldshouldendediting:(uitextfield *)textfield;
2、文本输入框已完成编辑(完成编译时实现的方法写在这里)
-(void)textfielddidendediting:(uitextfield*)textfield{
例如判断输入是否正确
}
3、文本输入框是否按回车键
-(bool)textfieldshouldreturn:(uitextfield *)textfield;
(取消第一响应者,即光标移除)
resignfirstresponder
4、文本框限制输入字数长度
-(bool)textfield:(uitextfield *)textfieldshouldchangecharactersinrange:(nsrange)range replacementstring:(nsstring*)string{
将每一次输入的字符进行拼接
判断每一次拼接之后的字符是否超过限制
如果超过{
把拼接后的字符传到textfield里
返回no,表示文本输入框内容不允许被添加
}
不超过就返回yes,表示文本输入框内容可以添加
}
三、uibutton:按钮控件
初始化方法:
buttonwithtype
设置按钮标题
settitle:(nsstring *) forstate:(uicontrolstate)
设置按钮标题颜色
settitlecolor:(nsstring *) forstate:(uicontrolstate)
点击高亮
showstouchwhenhighlighted = yes
背景图片(按钮的背景图片)
setbackgroundimage:(uiimage *) forstate:(uicontrolstate)
前景图片(点击前按钮的背景图片)
setimage:(uiimage *) forstate:(uicontrolstate)
设置图片位置
setimageedgeinsets
settitleedgeinsets
四、uiimageview:图片视图
创建一张图片
如果不是png格式就必须加后缀名
uiimage *image = [uiimage imagenamed:(nsstring *)];
创建一个图片视图
添加图片
imageview.image = image;
动画效果
用一个数组把连续的图片存储起来(for)
添加动画图片
animationimages = (nsarray *);
动画播放时间
animationduration
动画播放次数
animationrepeatcount
动画开始
startanimating
day_03 uiviewcontroller、customview
customview:自定义视图
视图的横竖屏
-(void)layoutsubviews{
获取屏幕当前方向
uiinterfaceorientation ori= [uiapplication sharedapplication].statusbarorientation;
}
视图控制器的跳转(用按钮实现)
创建视图控制器对象
模态出一个控制器
presentviewcontroller:视图控制器对象animated:是否开启动画效果completion:^{完成之后要实现的步骤(没有直接写nil)};
返回上一个控制器
[self dismissviewcontrolleranimated:是否开启动画效果completion:nil];
day_04 uievent 事件手势
一、触摸响应
触摸事件的四个方法
touchesbegan:触摸开始(触摸点下去未松开的时候触发)
touchescancelled:触摸取消(除非有电话打来强制取消触摸)
touchesended:触摸结束(触摸松开的时候触发)
touchesmoved:触摸移动(触摸移动的时候触发)
//封装的类
模仿button实现target action设计模式
@property (nonatomic,assign)id target;
@property (nonatomic,assign)sel selector;
方法
[self.target performselector:self.selector withobject:selfafterdelay:4];
二、响应者链
用户交互开关
是一个属性,bool值:userinteractionenabled
事件检测顺序
application -> appdelegate -> window ->rootvc ->btn1-> btn2 -> btn3
事件响应顺序
和检测顺序相反,一旦某个子视图对视图做出响应就不再传递
响应区域是子视图在父视图的区域
三、手势
添加方法
addgesturerecognizer:
设置时应打开用户交互
uitapgusturerecognizer:点击手势
numberoftapsrequired:点击次数
numberoftouchesrequired:手指同时触摸的数字
uipinchgesturerecognizer:捏合手势
scale:两个手指之间的距离
改变大小(应该设置为每次放大缩小都是基于上一次的基础作变化)
image.transform = cgaffinetransformscale(image.transform,pinch.scale, pinch.scale);
//偏移量重置
pinch.scale = 1;
uirotationgesturerecognizer:旋转手势
rotation = 旋转的弧度
image.transform = cgaffinetransformscale(image.transform,rotation.rotation);
//重置比例系数(弧度)
rotation.rotation = 0;
uiswipegesturerecognizer:滑动手势
direction:滑动的方向
判断滑动方向以此执行相对应的方法
uipangesturerecognizer:拖动手势
pan.view就是手势所在的视图
//根据拖动的偏移量重新设置视图的位置
imagev.transform =cgaffinetransformtranslate(imagev.transform, [pantranslationinview:pan.view].x, [pan translationinview:pan.view].y);
//偏移量重新设置为0(cgpointzero)
[pan settranslation:cgpointzero inview:pan.view];
uiscreenedgepanguesturerecognizer:屏幕边缘轻扫手势
edges:可以滑动的屏幕边缘方向
uilongpressgesturerecognizer:长按手势
minimumpressduration:长按的时间,默认是0.5
numberoftapsrequired:点击次数,默认是0
numberoftouchesrequired:同时触摸的手指数量
day_05uicontrol
(防止图片被渲染的方法(有时候必须写在设置图片的同时))
imagewithrenderingmode:uiimagerenderingmodealwaysoriginal
uicontrol:具有控制功能的空间,例如uibutton,uislider
改变值的触发状态:uicontroleventvaluechanged
uiswitch:开关控件
on:开关状态
seton:animated:开关初始状态和开场动画
外观:
ontintcolor
tintcolor
thumbtintcolor
uislider:滑动控件
continuous:是否停下来才确定值
minimumvalue:设置最小值
maximumvalue:设置最大值
uisegmentedcontrol:分段控件
initwithitems:(nsarray)items:初始化方法
momentary:是否开启选中之后的效果
tintcolor
uipagecontrol:分页空间(常和uiscrollview一起使用)
numberofpages:分页总页数
currentpage:当前页
deferscurrentpagedisplay:当前页在控件上的显示
day_06 uiscrollview
滚动视图
在滚动视图上添加图片视图
确定滚动视图的滚动范围
contentsize
滚动条是否显示
横向
showshorizontalscrollindicator
竖向
shwosverticalscrollindicator
是否整页滚动
pagingenabled
边缘弹动(设置无限循环图片时应开启)
bounces
点击状态栏回到最上面
scrollstotop
设置偏移量(滚动视图偏移的多少)
contentoffset
实现代理
self.delegate = self;
缩放:(把每一个图片视图都添加到另外新建的滚动视图,有图片的滚动视图实现缩放的方法,再把有图片的滚动视图都添加到一个滚动视图,这个滚动视图用来滚动展示图片)
设置最小最大缩放比例
minimumzoomscale
maximumzoomscale
实现缩放的方法(指定哪个视图可以被缩放)
viewforzomminginscrollview:(返回一个视图)
和uipagecontrol组合
page的方法
//屏幕偏移量(想展示哪个界面就设置为多少)
scrollview.contentoffset =cgpointmake(pagecontrol.currentpage*self.view.frame.size.width, 0);
uiscrollview的方法(写在减速完成里)
pagecontroll.currentpage =scrollview.contentoffset.x/self.view.frame.size.width;
day_07 uinavigationcontroller:导航控制器
导航控制器:管理一个或多个视图控制器
将rootvc作为导航控制器的根视图控制器
initwithrootviewcontroll
将导航控制器作为window的根视图控制器
rootviewcontroller
设置导航栏标题
title
navigationitem.title
设置导航控制条的透明与否
如果透明,那么视图原点从屏幕左上角开始
如果不透明,那么视图原点则从导航栏左下角开始
导航栏高度:44,状态栏高度:20
self.navigationcontroller.navigationbar.translucent = (bool);
bar:导航栏
设置bar的背景颜色
self.navigationcontroller.navigationbar.bartintcolor
设置bar的背景图片
如果图片高度小于44(导航栏高度),图片会填充状态栏和导航栏
如果图片高度等于44,图片则刚好设置为导航栏的背景
如果图片高度等于64,图片则刚好为导航栏和状态栏的背景
self.navigationcontroller.navigationbar setbackgroundimage:(uiimage*) forbarmetrics:uibarmetricsdefault];
设置bar上的空间颜色
tintcolor
在导航栏上添加控件
1、按钮为样式
self.navigationitem.leftbarbuttonitem = [[uibarbuttonitem alloc]initwithbarbuttonsystemitem:uibarbuttonsystemitemadd target:self action:@sel];
2、自定义图片样式
添加图片时设置不被渲染
intiwithimage
3、自定义文字样式
initwithtitle
设置右边多个按钮
self.navigationitem.rightbarbuttonitems = (nsarray *)
在中间添加分段空间
self.navigationitem.titleview = segmentcontrol
点击右边按钮跳转视图控制器
push跳转
导航控制器以栈的形式管理一个或者多个视图控制器,第一个被加入的控制器称之为根视图控制器,处于栈底,一般处于栈顶得控制器就是当前正在被展示的控制器
push就是将控制器加入栈中
pop就是将控制器从栈中拿出来
self.navigationcontroller pushviewcontroller:控制器对象 animated:yes
在跳转的控制器中实现返回
pop
1、返回到上一个控制器
[self.navigationcontroller popviewcontrolleranimated:yes];
2、返回到指定控制器
[self navigationcontroller viewcontrollers]:栈里所有的视图控制器
3、返回到根视图控制器
[self.navigationcontroller poptorootviewcontrolleranimated:yes];
day_09 uitabbarcontroller:标签栏控制器
设置标签栏控制器:
第一步 创建视图控制器
第二步 将视图控制器加入导航栏(一个标签栏对应一个导航栏)
第三步 将导航栏加入到标签栏
viewcontrollers:通过数值的形式添加
第四步 将标签栏作为根视图控制器
设置badgevalue(消息提醒)
如果视图控制器加入了导航控制器,那么我们设置标签栏的标题和badgevalue需要通过导航控制器的属性设置,而不是通过标签控制器的属性设置
设置标签栏样式
a、系统样式
self.tabbaritem = [[uitabbaritem alloc]initwithtabbarsystemitem:uitabbarsystemitemfavoritestag:100]];
b、自定义样式
self.tabbaritem = [[uitabbaritem alloc]initwithtitle:nsstring *image:uiimage * selectedimage:uiimage *];
设置属性
a、标签标题
通过tabbaritem.title设置标签标题
b、背景图片
标签栏的高度49,如果图片高度超出标签栏,图片不会自动压缩
设置默认选中的标签栏
selectedindex:标签栏的坐标
设置标签栏颜色
tabbar.bartintcolor
设置工程中所有tabbar的背景颜色
[[uitabbar appearance] setbartintcolor:[uicolor *]];
[uitabbar appearance]返回工程中所有的uitabbar
设置工程中所有导航栏的背景颜色(对导航栏有用)
设置字体属性
nsdictionary *dic = @{nsforegroundcolorattributename:[uicolor *],
nsfontattributename:[uifontsystemfontofsize:20]};
[[uitabbaritem appearance] settitletextattributes:dicforstate:uicontrolstatenormal];
day_10uitableview基本使用
一、创建一个表视图对象
uitableview *tab = [[uitableview alloc]initwithframe:[uiscreen mainscreen].boundsstyle:uitableviewstyleplain];
有两种风格的uitableview:
uitableviewstylegrouped和uitableviewstyleplain
二、设置属性
a、设置行高
tab.rowheight
b、设置分割线颜色
tab.separatorcolor
c、设置代理(delegate提供外观设置,datasource提供数据源(主要给cell赋值))
遵循代理
三、添加到父视图
代理必须实现的两个方法:设置有多少分区,每个分区有多少行
tableview:cellforrowatindexpath:确定每个分区有多少行
tableview:numberofrowsinsection:确定有多少个分区
确定有多少个分区,每个分区多少行之后,为每一行的cell配置数据
方法名:tableview:cellforrowatindexpath:
indexpath.section:当前显示的分区(返回nsinteger)
indexpath.row:当前显示的分区的行数(返回nsinteger)
1、设置重用符号
uitableviewcell *cell = [tableviewdequeuereusablecellwithidentifier:@“reuse”];
2、判断如果cell为空,创建cell
if(cell == nil){
cell = [[uitableviewcellalloc]initwithstyle:uitableviewcellstylesubtitle reuseidentifier:@“reuse”];
}
3、cell自带了textlabel(标题标签),detailtextlabel(详细内容标签),imageview(图片视图)
设置textlabel.text,detailtextlabel.text,imageview.image
4、返回cell
return cell;
代理的其他方法
1、设置分区的行的高度
tableview:heightforrowatindexpath:
返回cgfloat
2、设置分区头标题
tableview:titleforheaderinsection:
返回一个nsstring
3、设置分区头高度
tableview:heightforheaderinsection:
返回一个cgfloat
4、设置分区头视图(可以在分区头添加view)
tableview:viewforheaderinsection:
返回一个视图(label或者imageview等等)
5、设置右边栏标题(通讯录右边的a-z,通过点击跳到对应的分区)
sectionindextitlesfortableview:
返回一个数组
6、选中某个单元格方法
tableview:didselectrowatindexpath:
无返回值
用法:选中之后跳转到详细页面
获取plist文件的所有信息
nsstring *s = [[nsbundle mainbundle]pathforresource:@“plist文件名” oftype:@“文件后缀”];
plist文件使用字典保存就用字典接收,用数组就用数组接收,使用对应的对象类型接收数据
nsdictionary *dic =[[nsdictionary alloc]initwithcontextsoffile:s];
day_11 uitableview编辑
添加编辑按钮
self.navigationitem.rightbarbuttonitem = self.editbuttonitem;
tableview编辑分四步
1、使tableview处于编辑状态
2、确定哪些cell可以被编辑
3、确定cell的编辑模式
4、完成编辑提交
删除操作
先操作数据源,再操作ui
1、删除数组中某一个元素
2、操作ui
删除某一行
[self.tableview deleterowsatindexpaths:@[indexpath]withrowsanimation:uitableviewrowanimationtop];
删除某一分区
nsindexset *set = [nsindexsetindexsetwithindex:indexpath.section];
[self.tableview deletesections:set withrowanimation:2];
cell的移动
1、确定哪些单元格可以被移动
2、操作数据,移动完成
sourceindexpath:起始坐标
destinationindexpath:移动后到达的坐标
a、先添加后删除
b、刷新整个ui
[self.tableview reloaddata];
限制跨分区移动
//a 跨分区移动
- (nsindexpath*)tableview:(uitableview *)tableview targetindexpathformovefromrowatindexpath:(nsindexpath*)sourceindexpath toproposedindexpath:(nsindexpath *)proposeddestinationindexpath{
//判断目标路径和起始路径如果相同,移动,否则,不能移动
if(相同){
returnproposeddestinationindexpath;
}else{
return sourceindexpath;
}
}
day_12 uitableviewcell
数组里面是字典,可以创建一个类作为model存储数据,通过kvc赋值
步骤:
model里面应实现setvalue:forundefinedkey:方法
1、遍历数组
for (nsdictionary *dic in self.array)
2、创建类对象
student *s = [[student alloc]init];
3、给对象赋值
[s setvaluesforkeyswithdictionary:dic];
创建一个类继承于uitableviewcell(自定义cell用来展示数据)
给类里面的属性实例化的时候把frame写在layoutsubviews里面
这个方法用来布局子视图
方法被触发的时机:
a、当子视图被添加到父视图上
b、屏幕做旋转
c、滚动视图
动态计算图片高度(等比例缩放)
缩放比例:用图片的宽度除以100(1比1的比例)
图片视图的高度:用图片的高度除以缩放比例
影响文本高度的几个因素:
文本内容的多少,文本所占宽度,文本字体的大小
nsdictionary *dic = @{uifontattributename:[uifontsystemfontofsize:17]};
//17号字体
文本高度:
cgfloat h = [text boundingrectwithsize:cgsizemake(200,10000)options:nsstringdrawinguseslinefragmentorigin attributes:dic context:nil].size.height;
day_13 uikit-xib
找到对应的nib文件,利用nib文件注册cell
uinib *nib = [uinibnibwithnibname:@“文件名" bundle:nil];
[self.tableview registernib:nib forcellreuseidentifier:@“重用标示符”];
视图与视图之间的对齐
leading edges:左对齐
trailing edges:右对齐
top edges:上对齐
bottom edges:下对齐
horizontal centers:纵向中心对齐
vertical centers:横向中心对齐
baselines:基线对齐
视图本身的位置
horizontally in container:以屏幕的纵向中心线对齐
vertically in container:以屏幕的横向中心对齐
两者结合就可以让view以屏幕的中心点对齐
视图的大小
width:视图的宽度
height:视图的高度
选中两个视图
equal width:两个视图等宽
equal height:两个视图等高
aspect ratio:设置宽高比
day_14 storyboard
sizeclass
iphone4s,iphone5/5s,iphone6
竖屏:(w:compacth:regular)
横屏:(w:compact h:compact)
iphone6 plus
竖屏:(w:compacth:regular)
横屏:(w:regular h:compact)
ipad
竖屏:(w:regular h:regular)
横屏:(w:regular h:regular)
day_15 uicollectionview
1、创建layout对象
2、创建uicollectionview
3、遵循代理
4、实现代理方法
5、注册自定义cell类
registerclass
6、添加到父视图上
day_16 uiimagepickercontroller
1、创建按钮用来进入相册
2、初始化uiimagepickercontroller
3、选择调用相册还是摄像头
4、设置代理
5、allowediting:允许编辑
6、用present方法弹出pick控制器
实现选中图片后执行的方法
imagepickercontroller:didfinishpickimgmediawithinfo:
用dismiss返回
编辑后的图片
info[@“uiimagepickercontrollereditedimage"]
上一篇: js时间戳转化的两种方式
下一篇: IOS 开发过程中问题汇总