UIKit坐标系
UIKit坐标系起始点是屏幕的左上方(x = 0, y = 0)。向右移动x轴增加,向下移动y轴增加。
CoreGraphics
缩写是CG,CGPoint{x, y}代表了在屏幕x,y位置上的一个点,创建函数是CGPointMake(x, y)
创建了一个在x,y位置上的点,相比较函数是CGPointEqualToPoint(p1, p2)
比较了p1和p2两个点是否相等。
CGSize{width, height}代表了宽度为width高度为height的大小,创建大小的函数是CGSizeMake(w, h)
,相比较的函数是CGSizeEqualToSize(sz1, sz2)
。
CGRect{origin, size}代表了一个矩形,原点是origin大小是size,创建大小的函数是CGRectMake(o, s)
,相比较的函数是CGRectEqualToRect(r1, r2)
,缩放的函数是CGRectInset(r, dx, dy)
将矩形r的宽缩小dx高缩小dy。
View的定位
Frame: 一个View对象自身在父类View对象中的位置和大小,frame = { origin:{40, 160}, size:{400,400}}。表示一个View对象的左上角点的位置在父类View对象x=40, y=60处,对象本身的大小是宽400高400。UIView的初始化方法是:-[UIView initWithFrame:(CGRect)frame]
Bounds:一个View对象传递给子类View对象的位置和大小信息。Bounds的数据结构和frame一致。例如:如果一个子类的frame = { origin:{40, 160}, size:{400,400}},再将父类Bounds的origin设置为{40, 160}(一般来说Bounds的origin为{0,0})那么子类的View将会出现在父类的左上角,因为父类的origin为{40,160}也就是x从40开始,y从160开始。
Center:是一个View的中心点,对于View对象本身来说位置为origin{x + width/2, y + height/2}
Autoresizing
UIView的autoresizingMask可以指定本View和父View之间的关系。FlexibleWidth和FlexibleHeight指定了本身的宽和高可以根据父类的变化而变化。FlexibleTopMargin,FlexibleBottomMargin,FlexibleleftMargin,FlexibleRightMargin指定了本View的边和父View上下左右边的距离可以变化。(注:未设置为Flexible属性的话全部默认是不可以变动的)
Autoresizing是在iOS6之前使用的比较多,现在的版本在用interface设置autoresizing时需要将Auto Layout关掉。从nib中定义的view默认都开着autoresizing。
Autolayout
Autolayout是用约束条件(constraint)描述View定位属性之间的关系,相比较autoresizing(只可以定位本身和父类的关系)autolayout可以支持更加复杂的多视图类定位关系。
constraint用来表示类视图之间的线性关系。通过设置constraint属性UIView对象可以按照我们希望的定位和大小出现在不同分辨率的iOS设备屏幕上。
Autolayout可以通过nib的“Use Auto Layout”选项打开,或者用代码直接添加constraint,还可以将UIView子类的requiresConstraintBasedLayout方法重载,返回YES。(也可以返回NO来关闭Autolayout)
AutolayoutConstraint的常用属性:
Leading Space to Container Margin:前方(字符串开始的方向)与边界保持距离
Trailing Space to Container Margin:后方(字符串结束的方向)与边界保持距离
Vertical Space to Top Layout Guide:顶部与上方边界保持距离
Vertical Space to Bottom Layout Guide:底部与下方边界保持距离
Center Horizontally in Container:水平居中
Center Vertically in Container:垂直居中
在storyboard编辑框的右下角还有几个按钮也是用来调节AutolayoutConstraint属性的。
Stack按钮可以把几个UIVIew对象打包成一组,成组编辑可以调节其水平或垂直排列。Align按钮调节对齐。Pin按钮调节边距。Resolve Auto Layout Issues按钮可以刷新界面看到调节后的结果,或者让电脑设置一个推荐的AutolayoutConstraint属性。
随着iOS设备产品线的越来越丰富,有了更多不同的屏幕分辨率,iOS9以后也增加了分屏功能,这样程序的窗口分变率必须要能根据用户的需求而改变。
Trait(设备特性)可以返回设备的属性,首先要遵守UITraitEnvironment protocol协议,UIScreen, UIWindow, UIViewController, UIPresentationController, UIView这些跟屏幕显示有关的类都遵守了该协议。遵守该协议的类都有.traitCollection属性,该属性有4类信息:1、 vertiacl/horizontalSizeClass表示屏幕的逻辑大小,有垂直和水平两个值。2、displayScale表示一个逻辑点会映射几个像素。3、userInterfaceIdiom用来表示是iphone类设备还是ipad类设备。4、forceTouchCapability用来判断设备是否支持压感反应。
Size Class:用来表示设备屏幕边长的大小,只分为紧凑Compact和正常Regular两种尺寸。
布局时View的大小
View布局时有个属性叫Aligment Rectangle
通过alignmentRectForFrame:方法传递View的frame进去将返回一个Aligment Rectangle,算法是Aligment Rectangle = frame - alignmentRectInsets
反之通过frameForAlignmentRect:方法传AlignmentRect进去将返回frame。
aligmentRectInsets是View的显示界面和对其界面的相差面积(默认aligmentRectInsets是零,所以显示界面和对其界面默认是重合的)。
固有尺寸(Intrinsic Content Size)
有一些界面组件可以提供自己的固定尺寸
UIVIew不能提供自身的固定尺寸,其自身大小必须要由constraint按照屏幕布局经过计算后得出适合的尺寸。
Slider可以提供自身的固定width参数,Label,Button, Switch, TextField可以提供固定的width和height参数。TextView和ImageView的固有尺寸是可变的,可以根据constraint的参数和布局推算出来。
当界面的大小需要通过constraint推算出来的时候,可以提供一些参数让constraint做为推算依据。
Content Hugging表示要不要拉伸或增加额外空间(padding),默认的优先级是250(优先级越低的条件越容易被牺牲,优先级1000是最大,表示条件必须执行)。
Content Compression Resistance表示要不要被压缩,默认优先级是750。
布局相关调用
updateConstraints
不能直接调用updateConstraints。
updateConstraintIfNeeded 在有必要的情况下才刷新界面布局,如果没有变化就不刷新。
setNeedsUpdateConstraints 直接刷新界面布局,不管有没有变化,先刷新一遍。
layoutSubviews
使用autolayout时必须先调用父类
layoutIfNeeded和setNeedsLayout函数和上面updateConstraints调用函数的用法类似。
更多的系统UI组件
UIKit Catalog文档
UIKit Catalog例子
界面组件的分类
以展示/导航为主的界面称为View
UIActivityIndicatorView
UIAlertController
UIImageView
UIPickerView
UIProgressView
UISearchBar
UISearchController
UIStackView
UITextView
UIToolbar
以操作响应为主的称为Control
UIButton
UIPageControl
UISegmentedControl
UITextField
UISlider
UIStepper
UISwitch
一个控件的基本用法
例子:UISwitch
用代码添加和修改属性
例子:UIWebView(建议在iOS8以后使用WKWebView)
UIWebView可以浏览网页,还可以浏览系统支持的各种格式的文档(PDF,WORD,KINDLE等)
创建
initWithFrame:(CGRect)
内容来源
load方法
loadRequest:(NSURLRequest*) 从网上加载一个文档
loadData:MIMEType:textEncodingName:baseURL:
loadHTMLString:baseURL:
交互控制
网络访问:.loading; .request; -stopLoading; -reload;
导航:-goBack; goForward;
JavaScript调用:-stringByEvaluatingJavaScriptFromString:
.delegate