Size Classes 具体使用
UIView和CALayer是什么关系?UIView显示在屏幕上归功于CALayer,通过调用drawRect方法来渲染自身的内容,调节CALayer属性可以调整UIView的外观, UIView继承自UIResponder,比起CALayer可以响应用户事件,Xcode6之后可以方便的通过视图调试功能查看图层之间的关系 UIView是iOS系统中界面元素的基础,所有的界面元素都继承自它。它内部是由Core Animation来实现的,它真正的绘图部分,是由一个叫CALayer(Core Animation Layer)的类来管理。UIView本身,更像是一个CALayer的管理器,访问它的跟绘图和坐标有关的属性,如frame,bounds等,实际上内部都是访问它所在CALayer的相关属性 UIView有个layer属性,可以返回它的主CALayer实例,UIView有一个layerClass方法,返回主layer所使用的类,UIView的子类,可以通过重载这个方法,来让UIView使用不同的CALayer来显示,如:
- (class) layerClass { // 使某个UIView的子类使用GL来进行绘制 return ([CAEAGLLayer class]); }
grayCover = [[CALayer alloc]init]; grayCover.backgroudColor = [[UIColor blackColor]colorWithAlphaComponent:0.2].CGColor; [self.layer addSubLayer:grayCover];
loadView的作用?
IBOutlet连出来的视图属性为什么可以被设置成weak?
IB中User Defined Runtime Attributes如何使用?
沙盒目录结构是怎样的?各自用于那些场景?Application:存放程序源文件,上架前经过数字签名,上架后不可修改 Documents:常用目录,iCloud备份目录,存放数据 Library tmp:存放临时文件,不会被备份,而且这个文件下的数据有可能随时被清除的可能
pushViewController和presentViewController有什么区别
请简述UITableView的复用机制每次创建cell的时候通过dequeueReusableCellWithIdentifier:方法创建cell,它先到缓存池中找指定标识的cell,如果没有就直接返回nil 如果没有找到指定标识的cell,那么会通过initWithStyle:reuseIdentifier:创建一个cell 当cell离开界面就会被放到缓存池中,以供下次复用
如何高性能的给 UIImageView 加个圆角?不好的解决方案 使用下面的方式会强制Core Animation提前渲染屏幕的离屏绘制, 而离屏绘制就会给性能带来负面影响,会有卡顿的现象出现 self.view.layer.cornerRadius = 5; self.view.layer.masksToBounds = YES;
正确的解决方案:使用绘图技术
- (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);
// 将图片画上去 [self drawInRect:rect];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
// 关闭上下文 UIGraphicsEndImageContext();
return image; }
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有什么影响?drawRect方法依赖Core Graphics框架来进行自定义的绘制 缺点:它处理touch事件时每次按钮被点击后,都会用setNeddsDisplay进行强制重绘;而且不止一次,每次单点事件触发两次执行。这样的话从性能的角度来说,对CPU和内存来说都是欠佳的。特别是如果在我们的界面上有多个这样的UIButton实例,那就会很糟糕了 这个方法的调用机制也是非常特别. 当你调用 setNeedsDisplay 方法时, UIKit 将会把当前图层标记为dirty,但还是会显示原来的内容,直到下一次的视图渲染周期,才会将标记为 dirty 的图层重新建立Core Graphics上下文,然后将内存中的数据恢复出来, 再使用 CGContextRef 进行绘制
描述下SDWebImage里面给UIImageView加载图片的逻辑
设计个简单的图片内存缓存器类似上面SDWebImage实现原理即可 一定要有移除策略:释放数据模型对象
控制器的生命周期// 自定义控制器view,这个方法只有实现了才会执行 - (void)loadView { self.view = [[UIView alloc] init]; self.view.backgroundColor = [UIColor orangeColor]; } // view是懒加载,只要view加载完毕就调用这个方法 - (void)viewDidLoad { [super viewDidLoad];
NSLog(@'%s',__func__); }
// view即将显示 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated];
NSLog(@'%s',__func__); } // view即将开始布局子控件 - (void)viewWillLayoutSubviews { [super viewWillLayoutSubviews];
NSLog(@'%s',__func__); } // view已经完成子控件的布局 - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews];
NSLog(@'%s',__func__); } // view已经出现 - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated];
NSLog(@'%s',__func__); } // view即将消失 - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated];
NSLog(@'%s',__func__); } // view已经消失 - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated];
NSLog(@'%s',__func__); } // 收到内存警告 - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning];
NSLog(@'%s',__func__); } // 方法已过期,即将销毁view - (void)viewWillUnload {
} // 方法已过期,已经销毁view - (void)viewDidUnload {
}
你是怎么封装一个view的/** * 纯代码初始化控件时一定会走这个方法 */ - (instancetype)initWithFrame:(CGRect)frame { if(self = [super initWithFrame:frame]) { [self setup]; }
return self; }
/** * 通过xib初始化控件时一定会走这个方法 */ - (id)initWithCoder:(NSCoder *)aDecoder { if(self = [super initWithCoder:aDecoder]) { [self setup]; }
return self; }
- (void)setup { // 初始化代码 }
如何进行iOS6、7的适配通过判断版本来控制,来执行响应的代码 功能适配:保证同一个功能在6、7上都能用 UI适配:保证各自的显示风格
// iOS版本为7.0以上(包含7.0) #define iOS7 ([[UIDevice currentDevice].systemVersion doubleValue]>=7.0)
如何渲染UILabel的文字?
UIScrollView的contentSize能否在viewDidLoad中设置?-(void)viewDidLayoutSubviews;
触摸事件的传递
事件响应者链如果当前view是控制器的view,那么就传递给控制器 如果控制器不存在,则将其传递给它的父控件 在视图层次结构的最顶层视图也不能处理接收到的事件或消息,则将事件或消息传递给UIWindow对象进行处理 如果UIWindow对象也不处理,则将事件或消息传递给UIApplication对象 如果UIApplication也不能处理该事件或消息,则将其丢弃 补充:如何判断上一个响应者
|