ios项目实用技巧(不断更新)

有时候一点小知识可能要花很多时间才能搞明白,很小的东西就是一直卡在那里,下面介绍一下我在项目中遇到的问题,供大家参考

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指令

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就行了。

你可能感兴趣的:(ios项目实用技巧(不断更新))