自己踩过的坑

iOS 开发中你是否遇到这些经验问题(一) - CocoaChina_让移动开发更简单

iOS 8个实用小技巧(总有你不知道的和你会用到的)

1.switch 中的case要用大括号括起来

2.在Objective-C中向nil发送消息是安全的

3.自定义单元格时,经常将控件家在contentview上。如果在防止重用,移除子视图时,将cell.contentview.subviews写成了cell.subviews

4.懒加载中将if (!_xxxx)中的_删掉了

5.懒加载中的self.xxx 和_xxx的区别。(一个是get方法   一个是实例变量 , 懒加载中一定要调get方法)


6.控件初始化添加后再视图上不可见(80%是frame某一个值设置的有问题)

7.自己添加.pch文件步骤

a:创建文件(xxxxxxxx)(最好创建在跟项目名同名的文件夹中,即创建前点击下那个文件夹下的一个区域)

b:在target的build phase中search language 会看到APPLE LLVM 7.1 language

在这个目录下会有Precompile Prefix Header  将其设置为yes

c:在Prefix Header 中添加自己的.pch文件的路径 其中$(SRCROOT)代表项目的路径 在这之后拼接项目内路径


8.a:(iOS9 及以下)允许http协议的借口的设置在项目的.plist文件中添加App Transport Security Setting(ATS) ,在它的子目录下添加 Allow Arbitrary Loads 并设置为yes。

b:iOS10中,无法设置Allow Arbitrary Loads ,解决方案如下。

1)、在项目的info.plist中添加一个Key:App Transport Security Settings,类型为字典类型。

2)、然后给它添加一个Exception Domains,类型为字典类型;

3)、把需要的支持的域添加給Exception Domains。其中域作为Key,类型为字典类型。

4)、每个域下面需要设置3个属性:NSIncludesSubdomains(yes)、NSExceptionRequiresForwardSecrecy(no)、NSExceptionAllowsInsecureHTTPLoads(yes)。

9.删除项目的资源文件时,要在项目中删除(不能在show in finder中删除),会导致警告。

10.imageNamed方法初始化的image实例,如果name的图片不存在,初始化的值为nil。


11.向数组中插入nil会崩。

12.关于collectionviewflowlayout类的布局思路之一:

a:声明一个数组属性,用于承装所有的布局属性

b:在prepare方法中创建所有cell的index path并调用layoutforindexpath方法,为每一个相应的layoutattr设置相应的值,

c:在layoutforrect方法中,返回这个数组。

13.待解决:对于collection view来说,每一个cell是如何完成初始化的。

答:在cellforindexpath方法中,忘记了if(!cell){初始化cell的代码},

14.UISearchBar继承于UIView,与tableview相似的用法。通过代理实现回调的一些处理。

15.在自定义的tableviewcell中,它的frame的值仍然是默认的值(44),需要在设置他的字视图之前,将它的值改成需要的值的大小。


16.防止tableview重用时,将content view的字视图移除后,设置好cell的字视图的属性后,要将这些子视图重新添加到cell.contentView上。

17.button的内部其实挺复杂的。(继承于UIControl)

其中imageedgeinset的属性是对于image属性。对image view,back image 没有效果。

18.在block中修改局部变量的值,需要用__block进行修饰。用到self时,要用__weak进行修饰。

19.-drawrect方法不要用。

20.只读属性的值如何更改?(需要使用运行时的东西,具体做法不详)


21.开发过程中,常用的代码要形成代码块。增加效率。

22.永远是眼高手低

23.先创建layout类,在写collection view。collectionview初始化的时候一定记得注册单元格。会崩。

24.定义全局的静态变量写在@implementation后

25.在一个控制器中,表的作用仅仅是显示数据停留在界面层的作用。不应该通过表的属性获取一些信息值。信息值应该存在于有关的datamodel类中,专门做信息的传递。通过cellforindexpath方法获取的cell,如果这个cell不再屏幕范围内,会返回为nil。


26.array初始化后添加的字符串做的是值的拷贝。例如数组添加了一个变量,然后在改变着歌变量的值,数组中的值不会随之改变。因为是做的值的拷贝。

27.刚刚编译时突然报红No such file or directory: '/Users...,在项目里搜对应文件发现它就静静的在那,没有任何异常,解决方法:删掉TARGETS - Build Phases - Compile Sources 里白框的文件

28.appdelegate 的类目的使用。对于delegate可以使用category的方式对其进行分类。更加清晰。

app delegate 的分类处理

29.对于iOS7以及更新版本 ,textview 输入时上下跳动的bug。iOS7以后UITextView 技巧 - 奋进的闹钟 - 博客园

坑1:

iOS7及以上的版本上,UITextView出现这样的问题:弹出键盘时,没输入任何文字,但是光标位置不是在最上方。

解决方案: iOS7以后新增了一个属性automaticallyAdjustsScrollViewInsets,将其置为NO即可。别忘了加版本判断。

if (IOS7_And_Later) {

self.automaticallyAdjustsScrollViewInsets = NO;

}

坑2:

iOS7及以上的版本上,UITextView输入中文时,在输入多行后,光标有时会上下跳动,输入文字的时候内容有时会往上跳,光标都显示不出来。这个bug坑死好多人啊,特别是做聊天输入框的时候,不得已找一些非正常的方法解决。从网上找的各种解决方案都不行。

复制代码

- (void)textViewDidChangeSelection:(UITextView *)textView

{

//fix ios7 bug (modified by 老岳).

if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {

CGRect r = [textView caretRectForPosition:textView.selectedTextRange.end];

CGFloat caretY =  MAX(r.origin.y - textView.frame.size.height + r.size.height + 8, 0);

if (textView.contentOffset.y < caretY && r.origin.y != INFINITY) {

textView.contentOffset = CGPointMake(0, caretY);

}

}

}


30.检查IDFA的方法:

步骤:

1、打开终端cd到要检查的文件的根目录。

2、执行下列语句:grep -r advertisingIdentifier .  (别少了最后那个点号)。


31.aruchive项目时,弹出Not a PNG filCommand copypng emitted errors but did not return a nonzero exit code to indicate failure。项目图片问题。

可能的原因a:项目中有图片不是png图片,将图片格式华为png格式。

b:Two targets were added for same image. Goto project target ->Build Phases -> Copy Bundle Resources and search for your image file name.


32.UIScrollView 的几种属性的含义。(很低级,但是,知之为知之,不知为不知,是知也。没那么简单)

contentSize :(CGSize)视图内容大小。展示的主要区域

contentInset:(UIEdgeInset)视图缩进的数量

contentOffset:(CGPoint)视图偏移量(他的值是视图内容的坐上角和scrollView的左上角的差值(用小demo测试过),初始化后暂时为(0,0))

最后,scrollview滚动区域大小是 contentSize contentInset 的总和。

33.项目刚被创建后的suprooting Files的无力文件夹式不存在的。因此在写pch文件的路径时候要注意。

34.将文件夹拖入项目中时要勾选项目意义

a:group b:Folder reference

1. Group 分组(黄色)

在xCode的工程中,右键New Group, 即可创建,也就是黄色的文件夹。

工程中想要分类管理的文件,可以分门别类的放在不同的group里面

group本身不影响文件的物理存放,也就是实际存放位置,只是在Project文件中

2.Folder reference(蓝色)

在管理大量资源文件时候,利用foler reference可方便和实际文件夹构造保持一致.

tips:Folder reference 形势拖入时,文件夹下的文件路径又可能找不到,在build setting 的搜索 search path 将 header search path 中添加某一特定的文件路径即可。例如:$(SRCROOT)/testOne/Category

35.经常遇到xcode8打不开项目的问题。(打不开特定项目,或打开项目无响应)

电脑上安装了其他版本的xcode(我安装了Xcode7.3),卸载其他版本的Xcode后,可以正常打开。


36.uiwebview (继承于UIView) 没有bounce属性。设置不滑动代码为 [(UIScrollView *)[[webView subviews] objectAtIndex:0] setBounces:NO];

37.webview 加载本地html5文件urlstring 需要拼接路径。

[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"xxx/xxx/xx.html" relativeToURL:[[NSBundle mainBundle] bundleURL]]]];

38.学校是可以申请公司级别的开发者账号的。

公司和教育机构必须提供为其法人实体注册的 D-U-N-S Number;而对于政府组织,D-U-N-S Number 则是可选信息。如果您以个人身份注册,则无需 D-U-N-S Number。

39.CADispalyLink  的区别 NSTimer

最主要的是刷新的频率不同。前者和页面刷新的频率相同(每秒60次)。后者可以自定义刷新间隔。

因此前者适合对页面做实时的更新。后者是可循环处理相同任务及其他场景。



40.对mask(遮罩)的理解(果然还是看图说话什么的管用)


自己踩过的坑_第1张图片
遮罩的理解


关于遮罩的解释。会显示父视图中自己本身不透明的区域

将一个layer设置为mask的时候,该 layer会被从其父视图中移除

设置mask时,mask的坐标系统会变为其对象的坐标系统

41.iOS中的随机数    iOS 随机数

1.arc4random() 需要自己取模。

2.arc4random_uniform(x) 产生[0~(x-1))范围内的随机数;(包括0)

42.要对cell做内容改动时,不要直接获取 cell并修改属性值。要先修改数据源,然后通过cellforrowatidexpath对cell的展示内容进行更新。

43.脱.app文件到iTunes生成ipa时候,要确保编译通过,否则无法产生正常的包。

你可能感兴趣的:(自己踩过的坑)