iOS UI篇

一、UIView和CALayer是什么关系?

1,UIView能够显示在屏幕上归功于CALayer,通过调用drawRect方法来渲染自身内容,调节CALayer的属性可以调整UIView的外观,UIView继承自UIResponder,UIView可以响应用户的交互事件,而CALayer不可以,Xcode6之后可以方便的通过视图调试功能查看图层之间的关系。

2,UIView是iOS系统中界面元素的基础,所有的界面元素都继承自他,他内部是由Core Animation来实现的,他真正的绘图部分,是由一个叫做CALayer的类管理。UIView的本身,更像是一个CALayer的管理器,访问他跟绘图和坐标有关的属性,frame和bounds等,实际上内部都是访问他所在的CALayer的相关属性。

3,UIView有个layer属性,可以返回他的主CALayer实例,UIView有个layerClass方法,返回主layer所使用的类,UIView的子类可以通过重载这个方法,来让UIView使用不同的CALayer来显示

- (class) layerClass {

//使某个UIView的子类使用GL来进行绘制

return([CAEAGLLayer class]);

}

4,UIView的CALayer类似UIView的子view树形结构,也可以向他的layer上添加子layer,来完成某些特殊的显示。

5,UIView的layer树形在系统内部被系统维护着三分copy:

①逻辑树:就是代码里可以操纵的,例如更改layer的属性等等就在这一份。

②动画树:这是一个中间层,系统正式在这一层上更改属性,进行各种渲染操作。

③显示树:这一层的内容是当前正被显示在屏幕上的内容。这三层的逻辑结构都是一样的,区别只有各自的属性。

二、loadView的作用?

1,loadView用来自定义view,只要实现了这个方法,其他通过xib或Storyboard创建的view都不会被加载。

三、IBOutlet练出来的视图属性为什么可以被设置成weak?

1,因为父控件的subViews数组已经对它有一个强引用了。

四、沙盒目录结构是怎样的?各自用于哪些场景?

1,Application:存放程序源文件,上架前经过数字签名,上架后不可修改。

2,Documents:常用目录,iCoud备份目录,存放数据。

3,Library:Caches:存放体积大又不需要备份的数据;Preference:设置目录,iCoud会备份设置信息。

4,tmp:存放临时文件,不会被备份,而且这个问价下的数据有可能被随时清除的可能。

五、pushViewController和presentViewController有什么区别?

1,两者都是在多个视图控制器间跳转的函数。

2,presentViewController提供的是一个模态视图控制器(modal).

3,pushViewController提供一个栈控制器数组,push、pop .

六、请简述UITableViewCell的复用机制?

1,每次创建cell的时候通过dequeueReusableCellWithIdentifier:方法创建cell,这个方法会先到缓存池中寻找所指定标识的cell,有就取出来使用,没有就直接返回nil.

2,如果没有找到自定标识的cell,那么会通过initWithStyle:reuseldetifier:创建一个cell。

3,当cell完全离开界面就会被放到缓存池中,以供下次复用。

七、如何高性能的给UIImageView加圆角?

1,使用视图图层的圆角半径和使用圆角属性进行设置;self.view.layer.cornerRadius =5;

self.view.layer.masksToBounds =YES;

不过这种方式会强制Core Animation提前进行离屏渲染,而离屏渲染会给性能带来负面影响,会有卡顿现象的出现。现在苹果已经做了优化,大大减小了这种方式对性能的影响。

2,正确的解决方案是使用绘图技术:

- (UIImage *)circleImage

{

// NO代表透明

UIGraphicsBeginImageContextWithOptions(self.size,NO,0.0);

//获得上下文

CGContextRef ctx = UIGraphicsGetCurrentContext();

//添加一个圆

CGRect rect = CGRectMake(0,0,self.size.width,self.size.height);

CGContextAddEllipseInRect(ctx, rect);

//裁剪

CGContextClip(ctx);

//将图片画上去

[selfdrawInRect:rect];

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

//关闭上下文

UIGraphicsEndImageContext();

returnimage;

}

3,还有一种方案:使用贝塞尔曲线切割这个图片,给UIImageView添加了圆角,其实也是通过绘图技术实现的。

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,100,100)];

imageView.center = CGPointMake(200,300);

UIImage *anotherImage = [UIImage imageNamed:@"image"];

UIGraphicsBeginImageContextWithOptions(imageView.bounds.size,NO,1.0);

[[UIBezierPath bezierPathWithRoundedRect:imageView.bounds

cornerRadius:50] addClip];

[anotherImage drawInRect:imageView.bounds];

imageView.image = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

[self.view addSubview:imageView];

八、使用drawRect有什么影响?

1,drawRect方法依赖于Core Graphics框架进行自定义的绘制。

2,缺点:他处理touch事件时每次按钮被点击后,都会用setNeedDisplay进行强制重绘,而且不止一次,每次单点触发两次执行,这样会降低性能,占用额外的CPU和内存,如果界面上有多个按钮,对性能的影响就会更大了。

3,这个方法的调用机制也是非常特别的,当你调用setNeedDisplay方法时,UIKit将会被当前图层标记为dirty,但还是会显示原来的内容,直到下一次的视图渲染周期,才会将标记为dirty的图层重新建立Core Graphics上下文,然后将内存中的数据恢复出来,在使用CGContextRef进行绘制。

九、描述下SDWebImage里面给UIImageView加载图片的逻辑?(SDWebImage实现原理)

1,SDWebImage中为UIImageView提供了一个分类UIImageView+WebCache.h这个分类中有一个最常用的接口sd_setImageWithURL:placeholderImage:,会在真实图片出现前先显示站位图片,当真实图片被加载出来后再替换站位图片。

2,加载图片的过程大致如下:

①首先会在SDWebImageCache中寻找图片是否有对应的缓存,它会以url作为数据的索引现在内存中寻找是否有对应的缓存。

②如果缓存中文找到就会利用通过MD5处理过的key来继续在磁盘中查询对应的数据,如果找到了,就会把磁盘中的数据加载到内存中,并将图片显示出来。

③如果在内存和磁盘缓存中都没有找到,就会向远程服务器发送请求,开始下载图片。

④将图片下载完后显示到界面上,并在内存中保存一份,往磁盘中保存一份,(二级缓存)。

⑤整个整个获取图片的过程都是在子线程中执行,获取到图片后再回到主线程将图片展示到界面上。

3,可以根据以上步骤设计个简单的图片内存缓存器,一定要有移除策略,释放数据模型对象。


十、控制器的生命周期?

1,- (void)loadView;//自定义控制器View,这个方法只有实现了才会执行。

2,- (void)viewDidLoad;// view是懒加载,只要view加载完毕就会调用这个方法。

3,- (void)viewWillAppear:(BOOL)animated;// view即将显示的时候调用。

4,- (void)viewWillLayoutSubviews;// view即将开始布局子控件的时候调用。

5,- (void)viewDidLayoutSubviews;// view已经完成子控件的布局。

6,- (void)viewDidAppear:(BOOL)animated;// view已经出现。

7,- (void)viewWillDisappear:(BOOL)animated;// view即将消失。

8,- (void)viewDidDisappear:(BOOL)animated;// view已经消失。

9,- (void)didReceiveMemoryWarning;//收到内存警告。

10,- (void)viewWillUnload;//即将销毁view该方法以过期。

11,- (void)viewDidUnload;//已经销毁view该方法已过期。

十一、如何进行iOS6、iOS7的适配?

1,通过判断版本来控制,执行相应的代码。

2,功能适配:保证同一个功能在6和7上都能使用。

3,UI适配:保证格子的显示风格。

// iOS版本为7.0以上(包含7.0)

#define iOS7 ([[UIDevice currentDevice].systemVersion doubleValue]>=7.0)

十二、如何渲染UILable的文字?

1,通过NSAttributedString / NSMutableAttributedString富文本属性。

十三、UIScrollView的contentSize能否在viewDidLoad中设置?

1,因为UIScrollView的内容尺寸是根据其内部的内容来决定的,所以是可以在viewDidLoad中设置的。

2,不过最好是在-(void)viewDidLayoutSubviews;方法中来进行设置,因为viewDidLoad拿到的空间的尺寸是不准备的。

十四、触摸事件的传递?

1,触摸事件的传递时从父控件传递到子控件。

2,如果父控件不能接受触摸事件,那么子控件也不能接收触摸事件。

3,不能接收触摸事件的四种情况:

①不接受用户交互:userInteractionEnabled =NO;

②隐藏:hidden =YES;

③透明:alpha <=0.01;

④未启用:enable =NO;

4,UIImageView的userInteractionEnabled属性默认就是NO的,所以UIImageView以及他的子控件默认是不能接收触摸时间的,需要设置为YES,才能接收交互。

5,如何找到最合适处理事件的空间?从后往前传

①首先,判断自己能否接收触摸事件,可以通过重写hitTest:withEvent;来验证。

②其次,判断触摸点是否在自己身上,可以通过pointInside:withEvent;来验证。

③从后往前遍历子控件,重复前面的两个步骤。(遍历最后添加的子控件)

④如果没有符合条件的子控件,那么就自己处理。

十五、事件的响应者链条?从前往后传

1,如果当前的View是控制器的Veiw,那么就将响应时间传递给控制器。

2,如果控制器不存在,则将其传递给他的父控件。

3,在视图层次结构的最顶层视图也不能处理接收到的时间或消息,则将事件或消息传递给UIWindow进行处理。

4,如果UIWindow对象也不处理,则将事件或消息传递给UIApplication对象。

5,如果UIApplication对象也不能处理该事件或消息,则将其丢弃。

6,上一个响应者判断方式:如果当前的Veiw是控制器的View,那么控制器就是上一个响应者。如果当前View不是控制器的View,那么父控件就是上一个响应者。

十六、tableView的性能优化

1.cell重用机制.(合理运用标识)

2.在不等高Cell当中.缓存好cell行高.(不要在返回cell当中做过多的计算.)不要在此方法根据indexPath,获取Cell,返回cell的行高.

3.在cell当中尽量不过多的添加子控件.如果有子控件比较多,可以选择绘制出来.

4.不要在cell当中动态的添加子控件.可以提前把它添加上去,不需要的控件,隐藏起来.不要动态的addSubView

5.在Cell当中,尽量不要使用图层的透明,不要添加阴影,圆角

6.阴影的方式不要能过offset.要通过路径来去做阴影.shaowPath来设置阴影.

7.在Cell当中,imageView宽度跟高度不要出现小数点.

8.在cell当中,图片多大,imageView的尺寸应该跟图片一样大.不然的话,会造成压缩.通过形变进行放大,缩小.


十七、程序的启动原理?

1.执Main

2.执UIApplicationMain函数.

3.创建UIApplication对象,并设置UIApplicationMain对象的代理.

UIApplication的第三个参数就是UIApplication的名称,如果指定为nil,它会默认

为UIApplication.

UIApplication的第四个参数为UIApplication的代理.

4.开启 个主运 循环.保证应 程序不退出.

5.加载info.plist.加载配置 件.判断 下info.plist件当中有没有Main

storyboard file base name

有没有指定storyboard件,如果有就去加载info.plist件,如果没有,那么应

程序加载完毕

应用程序的生命周期:

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

推荐阅读更多精彩内容