IOS开发

  • 重置密码
    http://sc.chinaz.com/info/140328474587.htm

  • CocoaPods第三方库管理
    http://www.360doc.com/content/14/0309/10/11029609_358970353.shtml

  • 布局库
    https://github.com/SnapKit/Masonry

  • 循环引用,无法释放
    self ws

  • 获取设备id
    https://github.com/ylechelle/OpenUDID

  • 用pod添加一个第三方库的步骤
    库的地址:https://github.com/ylechelle/OpenUDID
    终端里输入命令
    用pod搜索,若能搜到就能用pod管理:pod search OpenUDID
    cd到项目的根目录
    pod install --verbose --no-repo-update

  • 使用linq的库
    LinqToObjectiveC

  • dictionary转class的库
    Mantle

  • copy和strong的区别
    @property (nonatomic, strong)
    @property (nonatomic, copy)

  • ios证书
    钥匙串->证书->导出
    .p12文件

  • ios中view自适应键盘的出现,不会出现键盘挡住输入框的情况
    加入第三方库IQKeyboardManager
    pod 'IQKeyboardManager', '~> 3.2.0.3'

  • tableViewCell的自定义
    一般一个页面里就一个tableView,因为多个tableView并不是一起滑动操作的
    一个tableView里分多个块(section)

  • app程序启动上面都有黑底边
    可以设置一下app的launch image,如果实在不需要,那就设置成全黑图片

  • mac上的svn版本管理工具
    cornerstone

  • 证书配置
    新环境开始时,需要用真机测试
    apple developer后台添加了真机uid后
    本地增加.p12证书,xcode选择team,developer后台下载Provisioning Profiles文件
    本地双击了对应的.mobileprovision文件后,项目的Build Settings,Code Signing Identity中要选择一下

  • 收起软键盘
    textView输入时,自动弹出的软键盘,想要点击其他地方就可以收起软键盘
    收起软键盘的方法有:textView resignFirstResponder

  • 截获点击事件的方法有:
    // 声明点击事件 UITapGestureRecognizer* tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(Actiondo:)]; [self.view addGestureRecognizer:tapGesture]; // 自定义点击处理 -(void)Actiondo:(id)sender { // 注销当前view(或它下属的text fields)的first responder状态 [self.view endEditing:YES]; }

  • 素材图片的扣取
    打开对应界面的psd,如果宽度640,扣出来的原大小素材图片就是2x大小,再缩小一倍大小就是1x
    找到对应素材位置的图层(要选中那个图层,一般可以通过切换对应图层前面的眼睛图标来回切换是否显示图层来确定是否选择中缺),用选择工具框中,复制到另一个新地方(ctrl+N)
    在新的地方,选择 图像->裁剪,选择透明像素,就可以去除多余的地方
    保存为web用格式

  • NSDictionary初始化
    键值不可以为整数,可以转换成NSNumber

  • ios多线程
    搜gcd

  • 点击事件带坐标
    普通的addTarget,对应的action方法,参数是 (id)sender
    换成
    UITapGestureRecognizer* tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(Actiondo:)]; [self.btn addGestureRecognizer:tapGesture]; //给自己的btn增加了一个新类型的点击处理事件 -(void)Actiondo:(UITapGestureRecognizer *)sender { CGPoint = [sender locationInView:self.view]; }

  • 手机端调用的api版本
    服务端api,地址中可以带上版本号,以同时满足各版本的请求
    例如:http://www.xxx.com/api/myproject/version7/gettopics.php

  • 绑定的数据刷新
    例如TableView、CollectionView等,可以通过reloadData来刷新数据

  • 显示png出现不透明,例如黄边的问题
    UIImageView设置背景色backgroundColor=[UIColor clearColor]

  • UICollectionView横向cell间距,会出现多10
    UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; [layout setSectionInset:UIEdgeInsetsMake(0,0,0,0)]; [layout setScrollDirection:UICollectionViewScrollDirectionHorizontal]; [layout setMinimumInteritemSpacing:3]; // 横向间距 [layout setMinimumLineSpacing:0]; // 只是单行横向也要设置 [layout setItemSize:CGSizeMake(30,30)]; self.collectionView = [[UICollectionVIew alloc] initWithFrame:CGRectMake(0,0,320,40) collectionViewLayout:layout];

  • 获取tableView的偏移量
    self.tableView.contentOffset

  • 单击事件后获取sender
    [self.btn addTarget:self action:@selector(actionClick:) forControlEvents:UIControlEventTouchUpInside]; -(void)actionClick:(id)sender { UIButton *btn = (UIButton*)sender; }

  • 调试看值
    可以鼠标停在变量上,弹出信息
    如果不弹出,可以在下方输出信息框的 蓝色的(lldb)后,输入 po self.array 回车 来打印出self.array的值
    po就是print object的意思

  • 使用gcd多线程获取数据同时更新UI,但UI刷新不及时
    如果使用的不是主线程来获取数据(例如dispatch_async(dispatch_get_global_queue)),那么写在一起的用于更新UI的代码也是在非主线程中的
    所以如果要及时更新UI,在非主线程的调用中,写一个主线程更新UI(dispatch_async(dispatch_get_main_queue))

  • ControllerView之间发送通知
    参数:
    NSDictionary* userInfo = @{@"key1":@"val1"};
    发送:
    [NSNotificationCenter defaultCenter] postNotificationName:@"唯一的通知名" object:nil userInfo:userInfo];
    接收者们:
    [NSNotificationCenter defaultCenter] addObserver:self selector:@selector(MyCallBack:) name:@"唯一的通知名" object:nil]; -(void)MyCallBack:(NSNotification *)notification { NSDictionary *userInfo = notification.userInfo; }

  • 异步网络请求处理方式之一
    无参数时:ASIHTTPRequest
    有参数时:ASIFormDataRequest

  • 系统自带的alertView
    UIAlertView *myAlert = [UIAlertView alloc] initWithTitle:@"这里是提示语" message:nil delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定",nil]; [myAlert show]; //实现那个delegate -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { // buttonIndex 对应上面的按钮index:0-取消 1-确定 }

  • cell中使用到了sd_setImage结果出现了残影
    问题不在sd_setImage,而是在cell重用时,没有先设置imageView setImage=nil,然后再用sd_setImage

  • 编辑框,编辑时的软键盘弹不出来了
    如果是使用的 [textView becomeFirstResponder],来设置编辑框变成用户输入的第一响应者,来达成弹出软键盘的效果
    需要注意,该textView是否在不经意间被设置成了不可编辑状态(比如键盘类型切换时,文字/表情),使他不能被设置为响应者
    解决办法是注意在上一次软键盘收起的时候,设置textView.editable = YES 还原编辑框的可编辑状态

  • UITapGestureRecognizer 与 tableview collectionView等的选中事件冲突时
    重写UIGestureRecognizerDelegate委托
    可以判断[touch.view class]
    但是如果这个tableView里面的cell使用了自定义的样式里面包好了UIView等等的话,就无法通过view的class来判断了
    可以给self.view这个背景view添加一个tag,然后判断touch.view.tag是否是这个tag就可以判断出来了

  • UIView动画
    [UIView beginAnimations:nil context:nil]; // 开始动画 [UIView setAnimationDuration:10.0]; // 动画时长 CGPoint point = _imageView.center; point.y += 150; // 向下移动 [_imageView setCenter:point]; [UIView commitAnimations]; // 提交动画

  • cell里使用Masonry布局库布局,mas_makeConstraints没有生效或受影响
    可能是cell复用时,make没有生效的原因
    解决办法是改用mas_remakeConstraints

  • 使用Masonry布局后,使用UIView animation来做动画,发现动画不自然(控件从四周聚集起来的样子),或没有生效
    因为autolayout和动画有冲突,需要我们手动的立即刷新一下控件的位置(在动画前,在动画结束后,各刷新一下)
    WS(ws); // 起始位置 [self.backVIew mas_remakeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(ws.mas_bottom).with.offset(0); make.left.equalTo(ws.mas_left).with.offset(0); make.right.equalTo(ws.mas_right).with.offset(0); }]; // 动画前立即刷新一下 [self.backView setNeedsLayout]; [self.backView layoutIfNeeded]; // 动画 [UIView animateWithDuration:0.5f animations:^{ [self.backView mas_updateConstraints:^(MASConstraintMaker *make){ make.top.equalTo(ws.mas_bottom).with.offset(-300); // 注意这里只能对在起始位置设置过的属性进行修改 }]; // 动画后立即刷新一下 [self.backView setNeedsLayout]; [self.backView layoutIfNeeded]; }];

  • 隐藏顶部栏StatusBar
    一般使用 [[UIApplication sharedApplication] setStatusBarHidden:YES]; 即可
    还一种方法,是修改当前window的级别 self.window.windowLevel = UIWindowLevelStatusBar;
    LevelStatusBar要大于LevelNormal,所以会显示在上面

  • 服务端返回json,app解析出来的emoji表情出现了问题
    app解析json,有下面两种方式
    // 方式1(这种方式解析出来的emoji可能会出现问题) NSData *data = [request responseData]; // (ASIHTTPRequest *)request NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSDictionary *dic = [str JSONValue]; // 方式2(这样的解析在某些时候可以替代方式1) NSData *data = [request responseData]; NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];

  • UIButton同时设置图片和文字
    btn setImage
    btn setTitle
    间距:btn setTitleEdgeInsets(文字)

  • UITableView style
    UITableViewStylePlain:
    section header会固定;
    heightForHeaderInSection设置0有效;
    UITableVIewStyleGrouped:
    section header不会固定;
    heightForHeaderInSection设置0无效;

  • 获取app版本号
    NSBundle *bundle = [NSBundle bundleForClass:[self class]]; [bundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"]; // 4.9.2 [bundle objectForInfoDictionaryKey:@"CFBundleVerion"]; // 16

  • cell中的btn点击后,获取点击到的是哪个cell
    -(void)btnClick:(id)sender { CGPoint btnPosition = [sender convertPoint:CGPointZero toView:self.tableView]; NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:btnPosition]; }

  • ios中获取时间戳
    long nowTime = [[NSDate date] timeIntervalSince1970];

  • app从后台返回来时执行的函数
    appdelegate中的 -(void)applicationDidBecomeActive:(UIApplication *)application{}

  • 设置圆角不生效
    UIView.layer.cornerRedius = 12; // 设置了圆角度数
    UIView.layer.masksToBounds = YES; // 这里要设置一下

  • tableview插入新row时的动画效果
    [itmes addObject:new_row]; // 如果你是用一个items数组来存放所有row的数据的话 [tableView setContentSize:CGSizeMake(tableView.contentSize.width,tableView.contentSize.height+row_height)] // 为新row增加显示的空间 [tableView beginUpdates]; [tableView insertRowsAtIndexPaths:[NSIndexPath indexPathForRow:0 inSection:0] withRowAnimation:UITableViewRowAnimationNone]; // 插入新row [tableView endUpdates]; [tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:[items count]-1 inSection:0 atScrollPosition:UITableViewScrollPositionNona animated:NO]] // 定位到

  • 单个controller可以注册监听app从后台返回来的事件
    [NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myfunc) name:UIApplicationWillEnterForegroundNotification object:nil];

  • 用户标识之一
    \#define IDFA [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]

  • 判断是否安装了某应用,是否打开它
    NSURL *appSchemeUrl = [NSURL URLWithString:@"yourapp://"];if ([[UIApplication sharedApplication] canOpenURL:appSchemeUrl]) { [[UIApplication sharedApplication] openURL:appSchemeUrl]; }else{ NSURL *appStoreUrl = [NSURL URLWithString:@"itms-apps://itunes.apple.com/cn/app/yourid"]; if ([[UIApplication sharedApplication] canOpenURL:appStoreUrl]) { [[UIApplication sharedApplication] openURL:appStoreUrl]; } }

  • 单例的使用
    User.h: @interface User:NSObject +(User*)shareInstance; @end User.m: static id _instance; @implementation User +(User*)shareInstance { static dispatch_once_t once; dispatch_once(&once,^{_instance = [[self alloc] init];}); return _instance; } @end 调用的时候: [User shareInstance];

  • [NSUserDefaults standarUserDefaults] setObject setValue不能放long之类的数值
    用[NSNumber numberWithLong]之类的,用NSNumber包装一下

  • NSString 转成 int,0的转换会有问题
    [@"0" intValue] = nil

  • 监控手势操作
    UISwipeGestureRecognizer *recognizer = [UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)]; recognizer.direction = UISwipeGestureRecognizerDirectionRight; [self.view addGestureRecognizer:recognizer]; -(void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer{ if(recognizer.direction == UISwipeGestureRecognizerDirectionRight) { [self back]; // 这个例子是右滑手势的返回功能 } } -(void)back{ [self.nacigationController popViewControllerAnimated:YES]; }

  • 自定义Framework
    可打出模拟器专用framework,真机专用framework
    要打出通用性的framework,需要合并两个framework
    可以在自定义framework项目中,添加Run Script,每次Run时执行一个脚本来自动生成
    if [ "${ACTION}" = "build" ]thenINSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}.frameworkDEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.frameworkSIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.frameworkif [ -d "${INSTALL_DIR}" ]thenrm -rf "${INSTALL_DIR}"fimkdir -p "${INSTALL_DIR}"cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"#ditto "${DEVICE_DIR}/Headers" "${INSTALL_DIR}/Headers"lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"#open "${DEVICE_DIR}"#open "${SRCROOT}/Products"fi

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,478评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,825评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,482评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,726评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,633评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,018评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,168评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,320评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,264评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,288评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,995评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,587评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,909评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,284评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,862评论 2 339

推荐阅读更多精彩内容