给button加圆角的方式
1.cornerRadius。
2.使用贝塞尔曲线画圆角
贝塞尔和Core Graphics画圆角:用贝塞尔曲线画出一个圆形图,然后将button的image设置为该图;
3.使用CAShapeLayer和贝塞尔设置圆角:alloc一个CAshapeLayer,用贝塞尔画出圆形path赋值给layer,将button的layer.mask属性设置为layer;
CALayer和UIVIew
1 :首先呢CAlayer 是直接继承自NSObjec的,而UIview、UIVC、UIkit类中的、UIAppliation都是继承自UIResponder,在其中定义了各种事件处理的接口;
2:一个 Layer 的 frame 是由它的 anchorPoint,position,bounds,和 transform 共同决定的,而一个 View 的 frame 只是简单的返回 Layer的 frame,同样 View 的 center和 bounds 也是返回 Layer 的一些属性
3:UIView是CALayer的Delegate,它偏向于管理显示内容,而layer偏向于绘制内容;
4:修改非rootLayer会产生隐式动画;
Button圆角的触控区域
扩展触控区域要用到Runtime,因为Category不能添加属性,这时候就需要动态的为其添加扩展距离的属性,然后用Associative Object关联对象,动态的添加扩展距离属性;
1. static char topNameKey; //设置属性。扩展的大小;
2. (void) setEnlargeEdgeWithTop:(CGFloat) top right:(CGFloat) right bottom:(CGFloat) bottom left:(CGFloat) left //设置关联属性
3. {
4. objc_setAssociatedObject(self, &topNameKey, [NSNumber numberWithFloat:top], OBJC_ASSOCIATION_COPY_NONATOMIC);
1.
2. 扩展大小;
3. (CGRect) enlargedRect
4. {
5. NSNumber* topEdge = objc_getAssociatedObject(self, &topNameKey);
6. NSNumber* rightEdge = objc_getAssociatedObject(self, &rightNameKey);
7. NSNumber* bottomEdge = objc_getAssociatedObject(self, &bottomNameKey);
8. NSNumber* leftEdge = objc_getAssociatedObject(self, &leftNameKey);
9. if (topEdge && rightEdge && bottomEdge && leftEdge)
10. {
11. return CGRectMake(self.bounds.origin.x - leftEdge.floatValue,
12. self.bounds.origin.y - topEdge.floatValue,
13. self.bounds.size.width + leftEdge.floatValue + rightEdge.floatValue,
14. self.bounds.size.height + topEdge.floatValue + bottomEdge.floatValue);
15. }
16. else
17. {
18. return self.bounds;
19. }
20. }
重写HitTest
1. - (UIView*) hitTest:(CGPoint) point withEvent:(UIEvent*) event
2. {
3. CGRect rect = [self enlargedRect];
4. if (CGRectEqualToRect(rect, self.bounds))
5. {
6. return [super hitTest:point withEvent:event];
7. }
8. return CGRectContainsPoint(rect, point) ? self : nil;
9. }
hittest
IOS响应链,点击事件和手势哪个先触发
image.png如果hit-test view或first responder不处理此事件,则将事件传递给其nextResponder处理,若有UIViewController对象则传递给UIViewController,传递给其superView。
如果view的viewController也不处理事件,则viewController将事件传递给其管理view的superView。
视图层级结构的顶级为UIWindow对象,如果window仍不处理此事件,传递给UIApplication.
若UIApplication对象不处理此事件,则事件被丢弃。
巧妙使用Responder:
根据一个view对象,没有直接的方法可以得到管理它的viewController,但我们使用responder chain可以间接的得到,代码如下:
@implementation UIView (ParentController)
-(UIViewController*)parentController{
UIResponder *responder = [self nextResponder];
while (responder) {
if ([responder isKindOfClass:[UIViewController class]]) {
return (UIViewController*)responder;
}
responder = [responder nextResponder];
}
return nil;
}
@end
https://blog.csdn.net/chun799/article/details/8223612
GCD,dispatch_once的作用(线程安全)
https://www.jianshu.com/p/2d57c72016c6
iOS死锁的触发条件
双向阻塞会发生死锁;
比如我用GCD创建一个Sync同步的主线程任务,这个任务是一个闭包,此时就会等待闭包执行完毕,而此时主线程又是阻塞状态,造成了双向的阻塞;
循环引用
https://www.jianshu.com/p/ddfd1b3c0298
HTTP和HTTPS
HTTPS和HTTP的区别主要如下:
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
链接:https://www.jianshu.com/p/6db0c6dc97a9
SSL证书,CA证书
https://www.cnblogs.com/handsomeBoys/p/6556336.html
Socket
可选类型的实现
(some、none)EMUM枚举
TCP和UDP
image.pngTcp/IP。慢启动
https://blog.csdn.net/jtracydy/article/details/52366461
进程通信方式
消息传递(管道、FIFO、消息队列)
同步(互斥量、条件变量、读写锁、文件和写记录锁、信号量)
共享内存(匿名的和具名的)
远程过程调用(Solaris门和Sun RPC)
1.管道(pipe)
管道是一种具有两个端点的通信通道,一个管道实际上就是只存在在内存中的文件,对这个文件操作需要两个已经打开文件进行,他们代表管道的两端,也叫两个句槟,管道是一种特殊的文件,不属于一种文件系统,而是一种独立的文件系统,有自己的数据结构,根据管道的使用范围划分为无名管道和命名管道。
无名管道用于父进程和子进程之间,通常父进程创建管道,然后由通信的子进程继承父进程的读端点句柄和写端点句柄,或者父进程有读写句柄的子进程,这些子进程可以使用管道直接通信,不需要通过父进程。
命名管道,命名管道是为了解决无名管道只能在父子进程间通信而设计的,命名管道是建立在实际的磁盘介质或文件系统(而不是只存在内存中),任何进程可以通过文件名或路径建立与该文件的联系,命名换到需要一种FIFO文件(有先进先出的原则),虽然FIFO文件的inode节点在磁盘上,但仅是一个节点而已,文件的数据还是存在于内存缓冲页面中,和普通管道相同。
2.信号
信号,用于接受某种事件发生,除了用于进程间通信之外,进程还可以发送信号给进程本身。除了系统内核和root之外,只有具备相同id的进程才可以信号进行通信。
3.消息队列
消息队列是消息的链表,包括Posix消息队列和system v消息队列(Posix常用于线程,system常用于进程),有权限的进程可以向消息队列中添加消息,有读权限的进程可以读走消息队列的消息。
消息队列克服了信号承载信息量少,管道只能承载无格式字节流及缓冲区大小受限等缺陷。
4.共享内存
共享内存使多个进程可以访问同一块内存空间,是最快的IPC形式,是针对其他通信方式运行效率低而设计的,往往与其他进程结合使用,如与信号量结合,来达到进程间的同步与互斥。传递文件最好用共享内存的方式。
进程线程区别
https://blog.csdn.net/yanxiaolx/article/details/51763372
进程是cpu资源分配的最小单位,线程是cpu调度的最小单位。
Swift重载运算符
OC和C++实现类的方式
OC和C++的区别
一个应用问题,怎么设计完成一个网盘系统(图的遍历计算总大小、多线程下载)
控制同时下载的文件的个数(控制并发数目)
算法题:二维数组螺旋输出
美团三面:
你在上两面哪里表现的好,哪里不好?
大学中你觉得最难的一门课是什么,怎么去克服的?
团队中出现矛盾怎么解决
怎么协调与团队成员的关系
对你影响最大的一个项目
你对美团的技术团队有了解么(。。之前不小心看到了美团技术团队的博客然后巴拉巴拉扯了一下)
你对美团公司的了解呢
你平时是怎么学习的
CPU知道线程和进程么?
CPU怎么调度进程的
阻塞IO/非阻塞IO。。。
用户态和内核态
MVVM的特点和好处
IOS进程锁机制
进程通信的方式
IOS代码规范
IOS代码风格
Swift什么优点
动态语言和静态语言
弱类型和强类型语言
网络请求数据交换格式了解多少
代码自动化的问题
又一个2048游戏,写一下他的需求文档,你会怎么写
你有什么想问的(我问了我们美团上海的主要是做什么的)
网友评论