GeekBand iOS应用开发实战学习笔记(第四周)

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两种尺寸。


Size Class

布局时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

UISwitch 的外观

用代码添加和修改属性

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,475评论 4 372
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,744评论 2 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,101评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,732评论 0 221
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,141评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,049评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,188评论 2 320
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,965评论 0 213
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,716评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,867评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,341评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,663评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,376评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,200评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,990评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,179评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,979评论 2 279

推荐阅读更多精彩内容