总结:iOS中的小坑
本文主要用于自己记录一些我在开发当中有意无意收集的一下小技巧或者代码段。
如有版权问题请告知,我将尽快删除。(大部分也是我从度娘搜罗而来)
如果有错误的地方,请诸位帮忙提醒,感激不尽。
文中代码仅供参考,并不能作为实在的开发中的源码,而且本人不添加使用环境,请读者自行理解。
1.为View添加渐变色。
<pre>CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = rect;
//渐变色颜色数组
gradient.colors = [NSArray arrayWithObjects:(id)[UIColor redColor].CGColor,
(id)[UIColor yellowColor].CGColor,
(id)[UIColor greenColor].CGColor,nil];
[self.layer insertSublayer:gradient atIndex:0];</pre></code>
2.画一条虚线
<pre>CGContextRef context = UIGraphicsGetCurrentContext();
CGContextBeginPath(context);
//设置线宽
CGContextSetLineWidth(context, 0.5);
CGContextSetStrokeColorWithColor(context, CustomColor(198, 198, 198).CGColor);
CGFloat lengths[] = {15,5};
//注意2(count)的值等于lengths数组的长度
CGContextSetLineDash(context, 0, lengths, 2);
CGContextMoveToPoint(context, 0, TopHeight);
CGContextAddLineToPoint(context, ScreenWidth - 20, TopHeight);
CGContextStrokePath(context);
CGContextClosePath(context);</pre>
3.这几天的进度基本做完了,一直没有敲代码。在这里推荐一篇文章吧。也是我一直觉得非常好的文章。、
[关于View以及程序的架构。]
http://casatwy.com/iosying-yong-jia-gou-tan-viewceng-de-zu-zhi-he-diao-yong-fang-an.html
4.今天在做一个自定义的CollectionView的时候发生了一件很郁闷的事情。
didSelectRowAtIndexPath不响应了。。绞尽脑汁冥思苦想,终于发现问题所在。
<pre>if (!_collectionView) {
UICollectionViewFlowLayout *laout = [[UICollectionViewFlowLayout alloc]init];
[laout setScrollDirection:UICollectionViewScrollDirectionVertical];
_collectionView = [[UICollectionView alloc]initWithFrame:CGRectZero collectionViewLayout:laout];
_collectionView.backgroundColor = [UIColor whiteColor];
_collectionView.delegate = self;
_collectionView.dataSource = self;
[_collectionView registerClass:[StationSelectMoneyCollectionCell class] forCellWithReuseIdentifier:collectionCellID];
}</pre>
//因为我的CollectionView是作为一个TableView 的Cell存在的,而且是动态布局的,我把它写在if里,于是我无法改变CollectionView的大小。所以是不可能响应到的。。所以我把它的布局写在外面,完美解决。
_collectionView.frame = CGRectMake(10, 10, ScreenWidth - 20, _height - 10);
5.今天做了一个东西,觉得很神奇。分享出来。(ps:自己做的)
一个类似于支付宝支付密码的东西
在这里主要说一下思路。因为源码还没有完全脱离出来所以不能贴出Demo了。
上面的东西不用多说了。
1).主要在于密码输入的时候,在输入密码的地方的下层放置一个TextField,然后将一个ImageView盖在上面,创建出6个黑色的点,算好坐标,隐藏。
2).注册一个TextField 的通知UITextFieldTextDidChangeNotification。自定义监听方法。
3).截字,并且根据TextField的文字长度决定黑点的显示数量。
<pre>if (_textField.text.length > 6) {
_textField.text = [_textField.text substringToIndex:6];
}
for (UIImageView *image in _passwordImageView.subviews) {
image.hidden = YES;
}
for (NSInteger i = 0; i < _textField.text.length; i ++) {
UIImageView *sub = [_passwordImageView.subviews objectAtIndex:i];
sub.hidden = NO;
}</pre>
大体就是这样的。。如果大家有什么更好的办法欢迎补充~~~
6.关于文字长度的自适应方法。
偶然间发现
[str sizeWithFont:(UIFont *) constrainedToSize:(CGSize) lineBreakMode:(NSLineBreakMode)] 已经挂掉了。。所以在这里给出替代方法的使用方法。
<pre>NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc]init];
paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping;
NSDictionary *attributes = @{NSFontAttributeName:[UIFont systemFontOfSize:font],
NSParagraphStyleAttributeName:paragraphStyle.copy};
CGSize size = [str boundingRectWithSize:allowSize
options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
attributes:attributes context:nil].size;</pre>
哎呦,不错呦。。
7.禁止多个按钮同时点击
对于测试组的同事经常提的bug:两个手指同时点击界面上的多个可点击的视图而出现各种错误。
有官方的解决方法,将不允许同时点击的视图都设置下参数:
<pre>[view setExclusiveTouch:YES];</pre>
8.获取当前对象的类名。
如果只是NSLog输出的话可以用NSStringFromClass([selfclass]);
如果是用来作为赋值或判断的话可以这么用:<pre><code>[NSString = stringWithUTF8String:object_getClassName(selfClass)];</pre></code>
9.关于iOS9有许多坑是毋庸置疑的。。。
下面让我们来看一下关于iOS9的适配吧~
1).关于iOS9的网络连接问题
在Info.plist中添加这个字段(是一个字典)NSAppTransportSecurity
在字典下添加这个字段(是一个Bool类型,原则YES)NSAllowsArbitraryLoads
2).关于友盟分享
友盟的SDK里是有的。
友盟的iOS9适配
3).如果你发现你的程序还有崩溃的话,那么你可以关闭BitCode功能
关闭BitCode功能
10.collectionView的cell之间的距离调整
storyBoard
11.用Storyboard实现简单的Cell高度自适应
在给Cell中内容添加约束的时候,如果某一个Label的高度是可变的,那么就给它设定一个最小值(假设它为一行)
在Controller中实现estimatedHeightForRowAtIndexPath:方法。返回Row的估算高度。然后就可以实现Cell的高度自适应了。(这里我使用的最小值)效果如下:
11.关于此证书签发者无效的问题
今天早上 上班发现钥匙串中的所有证书 都 提示此证书签发者无效
经查找得知系统证书WWDR在2016年2月14日失效,需要更新WWDR系统证书
下载证书地址:
https://developer.apple.com/certificationauthority/AppleWWDRCA.cer
下载之后 双击安装
到这 还需要一步
在登陆里面删除过期的证书 在系统里面 删除过期的证书 就可以完美的解决了。所有的证书 都可以使用了
12.关于这个 linker command failed with exit code 1 报错的小总结
网上有很多关于这个错误的总结出现( linker command failed with exit code 1)错误总结
这里我只增加一点:需要在对应的.m文件里对已经声明的类添加(特指创建Model的时候、、)
<pre>@implementation
@end </pre>
13.self.view.bounds不准确
情景:在更改一个原来用XIB做的Controller,去掉所有的关联然后代码重写时发现:
在iPhone6的模拟器上输出self.view.bound时为 {{0, 0}, {320, 568}}
将对应Controller的XIB删除,完美解决
14.报错:The file “XXX” couldn’t be opened because you don’t have permission to view it.
原因之一:改错了Bundle identifer
错误原因
15.在日常开发中CollectionView的应用必不可少。Cell放置图片也是家常便饭。碰到一个问题,collectionView的重用机制是起作用的,但是在来回划动的过程中内存还是一直在增加。我的原因是因为我在Cell中使用了Image 作为接受对象,然后再Set方法里对ImageView进行复制。所以导致内存增加。解决办法很简单,将ImageView暴露出来,然后直接使用ImageView.image = image OK 解决。
待更新。。。