有时候一点小知识可能要花很多时间才能搞明白,很小的东西就是一直卡在那里,下面介绍一下我在项目中遇到的问题,供大家参考
1.监听UITextField的获得焦点和失去焦点事件
- addTarget(继承自UIControl)
[self addTarget:self action:@selector(editingDidBegin) forControlEvents:UIControlEventEditingDidBegin];
[self addTarget:self action:@selector(editingDidEnd) forControlEvents:UIControlEventEditingDidEnd];
UIControlEventEditingDidBegin
1.开始聚焦
2.获得焦点
3.弹出键盘
UIControlEventEditingDidEnd
1.结束编辑
2.失去焦点
3.滚下键盘
- 代理
- 通知
- 利用内部的某些机制
/** 调用时刻:成为第一响应者(开始编辑\弹出键盘\获得焦点) */
- (BOOL)becomeFirstResponder{
[self setValue:[UIColor whiteColor] forKeyPath:FRPlaceholderColorKeyPath];
return [super becomeFirstResponder];
}
/** 调用时刻:不做第一响应者(结束编辑\退出键盘\失去焦点) */
- (BOOL)resignFirstResponder{
[self setValue:[UIColor grayColor] forKeyPath:FRPlaceholderColorKeyPath];
return [super resignFirstResponder];
}
2.枚举类型遇到<<
说明是可以组合使用的,如a = 1 << 0;b = 1 << 1;
3.tableView的间距
self.tableView.sectionHeaderHeight = 0;
self.tableView.sectionFooterHeight = 0;
// 代理方法
4.cell创建的时候没有调用initWithFrame
而是调用initWithStyle
方法
5.UITableViewCell的使用问题
- 循环使用
只要有其他的cell设置过imageView.image,其他不需要显示图片的cell都要设置imageView.image = nil,这是防止循环利用时出现bug,即不需要图片的cell也会出现图片
- 自定义右边箭头图片
// cell右边的箭头
self.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
// 自定义图片
self.accessoryView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"arrow"]];
6.设置图片的拉伸
在右边的Sllcing中的Sllces中选择 水平拉伸 或者 垂直拉伸 或者 水平和垂直 都进行拉伸
7.Cocoapods
- Podfile.lock文件
- 描述最后一次更新Pods时,所有第三方框架的版本号
- 常用指令的区别
- pod install
- 根据Podfile文件安装第三方框架
- 会根据Podfile.lock文件中的版本号来安装第三方框架
- 如果一开始Podfile.lock文件不存在,就会按照Podfile文件中的版本号来安装第三方框架
- pod update
- 根据Podfile文件安装第三方框架
- 将所有第三方框架更新到最新版本,并且创建一个新的Podfile.lock文件
- 安装框架之前,默认会执行pod repo update指令
- pod update --no-repo-update
- 根据Podfile文件安装第三方框架
- 安装框架之前,不会执行pod repo update指令
- pod install
8. 将解析出来的字典弄成plist文件保存在本地
[responseObject writeToFile:@"/Users/free/Desktop/me.plist" atomically:YES];
9.解决tableView设置tableFooterView的contentSize不正确的问题
tableView.tableFooterView = footerView;
// 重新刷新数据(其实也会重新计算contentSize)
[tableView reloadData];
10.沙盒目录路径
NSLog(@"%@",NSHomeDirectory());
11.缓存相关
- 不能下载东西到Documents,否则苹果不允许上传
- 一般缓存的东西放在沙盒中Library目录下的Caches文件夹中
12.控制器如果检测到自己的subView中的第一个子View是scrollView,会自动将其Y值设为64,控制器本身的Y值默认是20
13.
// 不允许自动调整scrollView的内边距
self.automaticallyAdjustsScrollViewInsets = NO;
14.穿透效果
以iphone7为例:
在scrollView上添加tableView,
scrollView的高度设置为667,tableview的内边距设置为(64,0,49,0);
15.触发UIScrollViewDelegate
的停止滑动方法
/**
在scrollView滚动动画结束时,就会调用这个方法
前提:认为拖拽scrollView产生的滚动动画
*/
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
FRLogFunc;
}
/**
在动画结束时,就会调用该方法
前提:当使用setContentOffset:animated:或者scrollRectVisible:animated:方法让scrollView产生了滚动动画
*/
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView{
FRLogFunc;
}
16.viewWithTag实现的大致思路
- (UIView *)viewWithTag:(NSInteger)tag{
if (self.tag == tag) return self;
for (UIView *subView in self.subViews) {
return [subView viewWithTag:tag];
}
}
17.默认情况下,所有控件的tag都是0。
18.一个请求任务被取消了(cancel),会自动调用AFN请求的failure这个block。
19.用AFN请求出错的问题
if (error.code == NSURLErrorCancelled) { // error:取消请求
// 取消了任务
FRLog(@"取消了任务");
}else {
// 其他错误
FRLog(@"all请求失败 - %ld",error.code);
}
20.设置tableViewCell之间的间距问题
- 重写cell的setFrame方法
/** 重写这个方法的目的:能拦截所有设置cell frame的操作 */
- (void)setFrame:(CGRect)frame{
// 先修改再调用super,这样每个cell的间距都会留下5的间距
frame.size.height -= 5;
// 需要改左右边距也可以在这里修改
frame.origin.x += 5;
frame.size.width -= 2 * 5;
[super setFrame:frame];
}
21.自动拉伸问题
-
从xib中加载进来的控件
autoresizingMask
属性默认值是UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight
如果一个控件显示出来的大小和当初设置的frame大小不一致,有可能是因为
autoresizingMask
属性值包含了UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight
,解决方案:
self.autoresizingMask = UIViewAutoresizingNone;
22.父类中的某个内容,只允许子类来修改\提供,不能由外界来修改\提供
只提供get方法就行
//如:
- (NSString *)conString;
23.关于readonly属性
// 这个属性会生成count的get方法 和 _type成员变量
@propertr (nonatomic, assign, readonly) NSInteger count;
24.关于ios 10之后访问相册崩溃的问题
在info.plist里面配置下面两个参数就可以了
25.AFN中取消网络请求方法
[manager invalidateSessionCancelingTasks:YES];
// 或者
[self.manager.tasks makeObjectsPerformSelector:@selector(cancel)];
26.在AFN的网络请求block中使用weakSelf,这是为了防止控制器销毁了但是网络仍在请求数据
__weak typeof(self) weakSelf = self;
27.利用图形上下文做圆形图片(设置太多的layer.cornerRadius会导致应用程序卡顿)
// 开启图形上下文
UIGraphicsBeginImageContext(image.size);
// 上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();
// 添加一个圆
CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);
CGContextAddEllipseInRect(ctx, rect);
// 裁剪
CGContextClip(ctx);
// 绘制图片
[image drawInRect:rect];
// 获得图片
self.imageListView.image = UIGraphicsGetImageFromCurrentImageContext();
// 关闭图形上下文
UIGraphicsEndImageContext();
28.对象属性名不能以new
开头
29. 判断当前控制器的view是否在window上
// 如果当前控制器的view不在window上,就直接返回
if (self.view.window == nil) return ;
30.异常的捕获
// 在异常的前面加上这个
@throw [NSException exceptionWithName:@"异常的名字" reason:@"异常的原因" userInfo:nil];
31.添加找不到的头文件
在Build Setting中搜header se,在Header Search Paths中添加$(SRCTOOT)
(表示这个项目的路径)
32.根据collectionview的偏移量来判断是左滑还是优化,变大为左滑,变小为右滑
33.测试网络:http://httpbin.org/
34.CGPoint转成NSValue,然后通过NSValue的CGPointValue转回去
35.ios下dyld:Library not load解决方案
一顿搜索之后发现这个问题得产生是因为引用得一些framework只能存在于高版本得sdk中,但是,如果编译到低版本的ios就会发生这样的问题,我的真机是iOS6的版本的,GameController.framework可能高于这个版本,这里只需要在对应的target下的Build Phases标签里,找到Link Binary With Libraries,在里面找到GameController.framework,把status由Required 修改成Optional,然后再运行就OK了。其他的framework报错也适用,只需要修改对应的framework的status就行了。