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

2017-02-09  本文已影响0人  海里的神秘骑士

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

1.监听UITextField的获得焦点和失去焦点事件


[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

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.缓存相关

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 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.自动拉伸问题

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

上一篇 下一篇

猜你喜欢

热点阅读