iOS开发中遇到的那些坑.docx

上传人:b****8 文档编号:10949017 上传时间:2023-02-23 格式:DOCX 页数:20 大小:521.38KB
下载 相关 举报
iOS开发中遇到的那些坑.docx_第1页
第1页 / 共20页
iOS开发中遇到的那些坑.docx_第2页
第2页 / 共20页
iOS开发中遇到的那些坑.docx_第3页
第3页 / 共20页
iOS开发中遇到的那些坑.docx_第4页
第4页 / 共20页
iOS开发中遇到的那些坑.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

iOS开发中遇到的那些坑.docx

《iOS开发中遇到的那些坑.docx》由会员分享,可在线阅读,更多相关《iOS开发中遇到的那些坑.docx(20页珍藏版)》请在冰豆网上搜索。

iOS开发中遇到的那些坑.docx

iOS开发中遇到的那些坑

iOS开发中遇到的那些坑

从事iOS开发有些年月了,从最开始的磕磕绊绊,不知所措,到现在的遇到困难都能快速做出最佳方案处理,中间经历了不可或缺的痛苦。

在项目开发中,本人有用印象笔记记录的习惯,所以很多重复出现的坑,很快迎刃而解,而不在同一个地方摔倒两次。

为此,特意总结了一下开发中经常遇到的坑,有些可能和你形成共鸣,有些在你看来或许是小儿科,不喜勿喷。

[objc]viewplaincopy

Avalidprovisioningprofileforthisexecutablewasnotfound.

解决问题所在:

发布证书无法运行在真机上!

XCode8的项目在xcode7运行报错:

[objc]viewplaincopy

Thedocument“ViewController.xib”requiresXcode8.0orlater.ThisversiondoesnotsupportdocumentssavedintheXcode8format.OpenthisdocumentwithXcode8.0orlater.

有两种方法解决这个问题:

1.你同事也升级Xcode8,比较推荐这种方式,应该迎接改变。

2.右击XIB或SB文件->Openas->SourceCode,删除xml文件中下面一行字段。

场景:

tabbar左右pan手势切换,其中一个VC是UIPageViewController,这样会导致到pageView的时候不能切换tabbar,如何禁掉pageVC切换呢?

出于UIPageViewController和UItableView等产生手势冲突,我们往往要禁用其翻页手势,代码如下:

self.pageViewController.dataSource=nil;

网络上搜到的重写手势等方法,亲测无效,所以给出这个最简单粗暴的方法。

[objc]viewplaincopy

//tabbar的切换动画(一般不用哦)

-(void)viewWillDisappear:

(BOOL)animated

{

[superviewWillDisappear:

animated];

CATransition*transition=[CATransitionanimation];

[transitionsetDuration:

1];

[transitionsetType:

@"fade"];

[self.tabBarController.view.layeraddAnimation:

transitionforKey:

nil];

}

[objc]viewplaincopy

//解决带有轮播图的手势冲突

-(BOOL)gestureRecognizer:

(UIGestureRecognizer*)gestureRecognizershouldReceiveTouch:

(UITouch*)touch

{

if(touch.view.frame.origin.y<100){

returnNO;

}

returnYES;

}

[objc]viewplaincopy

//1,禁止.DS_store生成:

打开“终端”,复制黏贴下面的命令,回车执行,重启Mac即可生效。

defaultswritecom.apple.desktopservicesDSDontWriteNetworkStores-boolTRUE

//2,恢复.DS_store生成:

defaultsdeletecom.apple.desktopservicesDSDontWriteNetworkStores

FMDB根据条件查询数据库出现的错误:

问题:

注意选项A...我竟然匹配不到这种字符,\r\n\t都不行

方案:

中文全角空格...你想说什么...我转了下...\u3000已解决!

[objc]viewplaincopy

//Objective-C拓展了C,自然很多用法是和C一致的。

比如浮点数转化成整数,就有以下四种情况。

//1.简单粗暴,直接转化

floatf=1.5;inta;a=(int)f;NSLog("a=%d",a);

//输出结果是1。

(int)是强制类型转化,丢弃浮点数的小数部分。

//2.高斯函数,向下取整

floatf=1.6;inta;a=floor(f);NSLog("a=%d",a);

//输出结果是1。

floor()方法是向下取整,类似于数学中的高斯函数[].取得不大于浮点数的最大整数,对于正数来说是舍弃浮点数部分,对于复数来说,舍弃浮点数部分后再减1.

//3.ceil函数,向上取整。

floatf=1.5;inta;a=ceil(f);NSLog("a=%d",a);

//输出结果是2。

ceil()方法是向上取整,取得不小于浮点数的最小整数,对于正数来说是舍弃浮点数部分并加1,对于复数来说就是舍弃浮点数部分.

//4.通过强制类型转换四舍五入。

floatf=1.5;inta;a=(int)(f+0.5);NSLog("a=%d",a);

关于block传值及数据同步总结:

ABC三个界面间C界面修改内容达到AB界面刷新最新的数据保持ABC数据同步:

1.C到B可以用block回调传值2.B界面到A界面只需在B界面Back的时候发出拉取数据并刷新cell即可解决数据不同步现象。

[objc]viewplaincopy

//在iOS开发过程中,我们可能会碰到一些系统方法弃用,weak、循环引用、不能执行之类的警告。

有代码洁癖的孩子们很想消除他们,今天就让我们来一次Fuck警告!

//首先学会基本的语句

#pragmaclangdiagnosticpush

#pragmaclangdiagnosticignored"-Wdeprecated-declarations"

//这里写出现警告的代码

#pragmaclangdiagnosticpop//这样就消除了方法弃用的警告!

iOS8调用相机警告:

错误代码:

Snapshottingaviewthathasnotbeenrenderedresultsinanemptysnapshot.Ensureyourviewhasbeenrenderedatleastoncebeforesnapshottingor

snapshotafterscreenupdates.

IOS8多了一个样式UIModalPresentationOverCurrentContext,

IOS8中presentViewController时请将控制器的modalPresentationStyle设置为UIModalPresentationOverCurrentContext,问题解决!

错误点:

ENABLE_BITCODE错误设置(mrc下)

解决方法:

[objc]viewplaincopy

//默认选中第一行

[tableViewselectRowAtIndexPath:

[NSIndexPathindexPathForRow:

0inSection:

0]animated:

NOscrollPosition:

UITableViewScrollPositionNone];

//实现了选中第一行的方法

[selftableView:

_mainIndustryTableViewdidSelectRowAtIndexPath:

[NSIndexPathindexPathForItem:

0inSection:

0]];

例如:

//默认下选中状态

-(void)customAtIndex:

(UITableView*)tableView

{

//默认选中第一行

[tableViewselectRowAtIndexPath:

[NSIndexPathindexPathForRow:

0inSection:

0]animated:

NOscrollPosition:

UITableViewScrollPositionNone];

if([tableViewisEqual:

_mainIndustryTableView]){

[selftableView:

tableViewdidSelectRowAtIndexPath:

[NSIndexPathindexPathForItem:

0inSection:

0]];

}

}

 

iOSheaderview与tableview之间距离控制?

[objc]viewplaincopy

//view作为tableView的tableHeaderView,单纯的改变view的frame是无济于事的,tableView不会大度到时刻适应它的高度(以后Apple会不会改变就不知道了),

//所以,如何告诉tableView它的tableHeaderView已经改变了?

很简单,就一句话(关键最后一句):

[webViewsizeToFit];

CGRectnewFrame=headerView.frame;

newFrame.size.height=newFrame.size.height+webView.frame.size.height;

headerView.frame=newFrame;

[self.tableViewsetTableHeaderView:

headerView];

//这样以后,效果就出来了。

不过这种过度显得有些生硬,能不能加一点点动画,让它变得顺眼一些呢?

试试下面的代码:

[self.tableViewbeginUpdates];

[self.tableViewsetTableHeaderView:

headerView];

[self.tableViewendUpdates];

 

Cell分割线不全:

[objc]viewplaincopy

-(void)viewDidLayoutSubviews{

if([_listTableViewrespondsToSelector:

@selector(setSeparatorInset:

)]){

[_listTableViewsetSeparatorInset:

UIEdgeInsetsZero];

}

if([_listTableViewrespondsToSelector:

@selector(setLayoutMargins:

)]){

[_listTableViewsetLayoutMargins:

UIEdgeInsetsZero];

}

}

-(void)tableView:

(UITableView*)tableViewwillDisplayCell:

(UITableViewCell*)cellforRowAtIndexPath:

(NSIndexPath*)indexPat{

if([cellrespondsToSelector:

@selector(setLayoutMargins:

)]){

[cellsetLayoutMargins:

UIEdgeInsetsZero];

}

if([cellrespondsToSelector:

@selector(setSeparatorInset:

)]){

[cellsetSeparatorInset:

UIEdgeInsetsZero];

}

}

//自绘分割线

-(void)drawRect:

(CGRect)rect

{

CGContextRefcontext=UIGraphicsGetCurrentContext();

CGContextSetFillColorWithColor(context,[UIColorwhiteColor].CGColor);

CGContextFillRect(context,rect);

CGContextSetStrokeColorWithColor(context,[UIColorcolorWithRed:

0xE2/255.0fgreen:

0xE2/255.0fblue:

0xE2/255.0falpha:

1].CGColor);

CGContextStrokeRect(context,CGRectMake(0,rect.size.height-1,rect.size.width,1));

}

 

iOS7.0以后的UILabel会自动将Text行尾的空白字符全部去除,除了常见的半角空格(\0×20)和制表符(\t)之外,全角空格(\u3000)也被计算在内,甚至连多余的换行符(\r,\n)也被自动去除了。

这一点虽然方便直接将控件赋值和无需取值后再trim,但是太过智能化了之后,往往不能满足一些本可以简单实现的需求。

需求1.使用添加\n方式将上下文本连续空两行,即实现文本的2倍行距。

iOS7.0之前解决办法:

在每个换行符后面添加一个空格

即如果要显示为:

aaaaaaa

空行

空行

bbbbbb

使用以下格式进行文本赋值

lbl.text=@"aaaaaaa\n\u0020\n\u0020bbbbbb";

iOS7.0之后需要增加,不增加则无效

lbl.numberOfLines=0;//0表示行数不固定

lbl.lineBreakMode=UILineBreakModeWordWrap;//允许换行(可选)

需求2.在所有的UILabel的text后增加一个空格,并使text右对齐。

iOS7.0之前解决办法:

直接在text后增加空格即可,即text在赋值前增加空格。

lbl.text=[NSStringstringWithFormat:

@"%@%@","aaaaa","\u0020"];

iOS7.0之后需要重写UILabel的drawTextInRect方法,通过缩短默认文本绘制Rect的宽度半个字体宽度来实现。

(当然也可以在底部铺一个view调整,暨简单又高效)

具体实现代码如下:

[objc]viewplaincopy

#import"MyLabel.h"

@implementationMyLabel

-(id)initWithFrame:

(CGRect)frame{

self=[superinitWithFrame:

frame];

if(self){

returnself;

}

}

-(void)drawTextInRect:

(CGRect)rect{

//从将文本的绘制Rect宽度缩短半个字体宽度

//self.font.pointSize/2

return[superdrawTextInRect:

CGRectMake(rect.origin.x,rect.origin.y,rect.size.width-self.font.pointSize/2,rect.size.height)];

}

@end

//附录:

//UILabel会自动清除的空白字符(UNICODE)

\u0009CHARACTERTABULATION

\u000ALINEFEED

\u000DCARRIAGERETURN

\u0020SPACE

\u0085NEXTLINE

\u00A0NBSP

\u1680OGHAMSPACEMARK

\u180EMONGOLIANVOWELSEPARATOR

\u2000ENQUAD

\u200AHAIRSPACE

\u200BZEROWIDTHSPACE

\u2028LINESEPARATOR

\u2029PARAGRAPHSEPARATOR

\u202FNARROWNO-BREAKSPACE

\u205FMEDIUMMATHEMATICALSPACE

\u3000IDEOGRAPHICSPACE

 

监听UITextField的text的变化:

[objc]viewplaincopy

//注册监听

[[NSNotificationCenterdefaultCenter]postNotificationName:

UITextFieldTextDidChangeNotificationobject:

nil];

[[NSNotificationCenterdefaultCenter]addObserver:

selfselector:

@selector(changeForKeyWord:

)name:

UITextFieldTextDidChangeNotificationobject:

nil];

//监听关键词变化

-(void)changeForKeyWord:

(NSNotification*)sender

{

//关键词改变时清除地区查询条件纪录

[[NSUserDefaultsstandardUserDefaults]setObject:

@"0"forKey:

@"proRow"];

[[NSUserDefaultsstandardUserDefaults]setObject:

@"0"forKey:

@"section"];

}

//监听UITextField的点击事件

[[NSNotificationCenterdefaultCenter]postNotificationName:

UITextFieldTextDidBeginEditingNotificationobject:

nil];

[[NSNotificationCenterdefaultCenter]addObserver:

selfselector:

@selector(enterEdited:

)name:

UITextFieldTextDidBeginEditingNotificationobject:

nil];

-(void)enterEdited:

(NSNotification*)sender

{

//事件写这里!

希望帮到你!

}

改变cell的选中颜色:

[objc]viewplaincopy

cell.selectedBackgroundView=[[UIViewalloc]initWithFrame:

cell.frame];

cell.selectedBackgroundView.backgroundColor=COLOR_BACKGROUNDVIEW;

//不需要任何颜色可以这么设置:

cell.selectionStyle=UITableViewCellSelectionStyleNone;

旋转图片:

[objc]viewplaincopy

#pragmamark-----更新按钮动画

-(void)rotate360DegreeWithImageViews:

(UIImageView*)myViews{

CABasicAnimation*rotationAnimation=[CABasicAnimationanimationWithKeyPath:

@"transform.rotation.z"];

rotationAnimation.toValue=[NSNumbernumberWithFloat:

M_PI*2.0];

rotationAnimation.duration=1.0;

rotationAnimation.cumulative=YES;rotate360DegreeWithImageViews

rotationAnimation.repeatCount=100000;

[myViews.layeraddAnimation:

rotationAnimationforKey:

@"rotationAnimation"];

}

[myViews.layerremoveAllAnimations];//停止

 

UIView的exclusiveTouch属性

通过设置[selfsetExclusiveTouch:

YES];

可以达到同一界面上多个控件接受事件时的排他性,从而避免一些问题。

[objc]viewplaincopy

//1.设置的时候在ib里面记得选择无边框的,要不然随便你设置,都是无效的,也是坑死了。

_textBoxName.layer.borderWidth=1.0f;

_textBoxName.layer.borderColor=[UIColorcolorWithRed:

0xbf/255.0fgreen:

0xbf/255.0fblue:

0xbf/255.0falpha:

1].CGColor;

//2.在uitextfield中文字最左边距离左侧边框的距离

_textBoxName.leftView=[[UIViewalloc]initWithFrame:

CGRectMake(0,0,16,51)];

_textBoxName.leftViewMode=UITextFieldViewModeAlways;

 

当你使用UISearchController在UITableView中实现搜索条,在搜索框已经激活并推入新的VC的时候会发生搜索框重叠的情况

解决办法:

那就是definesPresentationContext这个布尔值。

 

画个曲线如何做呢?

如图:

[objc]viewplaincopy

UIView*myCustomView=[[UIViewalloc]initWithFrame:

CGRectMake(0,204,kScreenWidth,120)];

myCustomView.backgroundColor=[UIColorwhiteColor];

[viewaddSubview:

myCustomView];

UIBezierPath*bezierPath=[UIBezierPathbezierPath];

[bezierPathmoveToPoint:

CGPointMake(0,0)];

[bezierPath

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 少儿英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1