把iOS开发中常用的或者重要的东西记录下来,用来复习和巩固。
1、一般自定义导航栏,统一设置导航栏颜色
self.navigationBar.barTintColor = [UIColor orangeColor];
[UINavigationBar appearance].barTintColor = [UIColor redColor];
2、控件设置背景图片,一些控件没有setBackgroundImage方法的可以用这个设置背景图片
[self.view setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"1.png"]]];
3、调用系统应用
打电话: [[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"tel://400-800-082"]];
浏览器: [[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"http://www.baidu.com"]];
Email: [[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"mailto://"]];
系统设置: [[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"prefs:root=WIFI"]];
4、隐藏UINavigationBar
在viewWillAppear:[self.navigationController setNavigationBarHidden:YES animated:YES];
在 viewWillDisappear: [self.navigationController setNavigationBarHidden:NO animated:YES];
5、设置震动和声音
导入:AudioToolbox.framework框架
在需要用到的地方导入 #import <AudioToolbox/AudioToolbox.h>
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);//震动
AudioServicesPlaySystemSound(1000);//新邮件提示音
6、删除所有子控件
[self.view.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
7、加载plist文件
NSString *path = [[NSBundle mainBundle]pathForResource:@"images" ofType:@"plist"]; //如果plist根数据为数组 NSArray *arr = [NSArray arrayWithContentsOfFile:path]; //如果plist根数据为字典 NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:path];
8、计算文件和文件夹大小
- (float)fileSizeAtPath:(NSString *)Path{
//文件管理者
NSFileManager *mgr = [NSFileManager defaultManager];
//判断字符串是否为文件/文件夹
BOOL dir = NO;
BOOL exists = [mgr fileExistsAtPath:Path isDirectory:&dir];
//文件/文件夹不存在
if (exists == NO) return 0;
//path是文件夹
if (dir){
//遍历文件夹中的所有内容
NSArray *subpaths = [mgr subpathsAtPath:Path];
//计算文件夹大小
float totalByteSize = 0;
for (NSString *subpath in subpaths){
//拼接全路径
NSString *fullSubPath = [Path stringByAppendingPathComponent:subpath];
//判断是否为文件
BOOL dir = NO;
[mgr fileExistsAtPath:fullSubPath isDirectory:&dir];
if (dir == NO){//是文件
NSDictionary *attr = [mgr attributesOfItemAtPath:fullSubPath error:nil];
totalByteSize += [attr[NSFileSize] floatValue];
}
}
return totalByteSize/(1024.0*1024.0);
} else{//是文件
NSDictionary *attr = [mgr attributesOfItemAtPath:Path error:nil];
return [attr[NSFileSize] floatValue]/(1024.0*1024.0);
}
}
9、app提交审核上架关于IDFA广告标识符——IDFA(identifier for advertising)
app提交审核最后一步:此app是否含有广告标识符IDFA?后面有两个选项:是、否?
怎么选择或者看自己项目中是否采集了IDFA呢?可以在项目中General下拉到framework,看有没有一个AdSupport.framework的framework,有的话就选择是,没有就选择否。
10.各种图形的绘制
图形的绘制是在UIView的-(void)drawRect:(CGRect)rect方法中,一般drawRect方法是在什么时候调用呢:
46B83D18-8D5C-4A1B-A851-EA4110F3C01D.png
- 是在controller的loadView ——>ViewDidLoad——>之后调用的。(没有设置rect大小不被调用)
2.调用了sizeTofit方法之后。 如果调用sizeTofit方法计算出size,sizeTofit方法就会自动调用- (CGSize)sizeThatFits:(CGSize)size这个方法,因为要计算出size,所以这个时候drawRect就会被调用。
A4CE27B5-C33E-4DAF-AE71-FF6E38F607F2.png3.通过设置contentMode属性值为UIViewContentModeRedraw。那么将在每次设置或更改frame的时候自动调用drawRect:。大致意思和2差不多,这里是Redraw,就是说需要用到rect的时候就会调用drawRect!(自己的理解,这样理解应该没错吧 )
6591D553-D4B7-48FC-8A1F-2001BF0FE6C7.png4.直接调用setNeedsDisplay,或者setNeedsDisplayInRect:触发drawRect:,但是有个前提条件是rect不能为0。setNeedsDisplay刷新显示肯定是会调用drawRect,然后setNeedsDisplayInRect这个方法是需要传入rect的,所以这两个方法也是调用drawRect的。
绘制:
CGContextRef context = UIGraphicsGetCurrentContext();
//1.画一条线
//线条颜色
CGContextSetRGBStrokeColor(context, arc4random()%256/255.0, arc4random()%256/255.0, arc4random()%256/255.0, 1);
//线条的起始位置
CGContextMoveToPoint(context, 20, 20);
//线条的结束位置
CGContextAddLineToPoint(context, 200, 20);
//绘制路径
CGContextStrokePath(context);
//2.写文字
//线条宽度
CGContextSetLineWidth(context, 1.0);
//颜色
CGContextSetRGBFillColor(context, 0.5, 0.5, 0.5, 1.0);
UIFont *font = [UIFont boldSystemFontOfSize:18.0];
NSString *string = @"姓名:a pretty boy \n 年龄 : 18 \n 性别 : boy";
[string drawInRect:CGRectMake(20, 40, 200, 90) withAttributes:@{NSFontAttributeName:font}];
//3.画一个正方形图形 (无边框)
//正方形填充颜色
CGContextSetRGBFillColor(context, 0.5, 0.5, 0.5, 1.0);
CGContextFillRect(context, CGRectMake(20, 150, 100, 100));
CGContextStrokePath(context);
//4.正方形有边框
//正方形边框颜色
CGContextSetRGBStrokeColor(context, 0.5, 0.5, 0.5, 1.0);
//边框宽度
CGContextSetLineWidth(context, 2.0);
CGContextAddRect(context, CGRectMake(150, 150, 100, 100));
CGContextStrokePath(context);
//5.椭圆
CGRect arect = CGRectMake(20, 260, 150, 100);
CGContextSetRGBStrokeColor(context, 0.6, 0.9, 0, 1.0);
CGContextSetLineWidth(context, 2);
CGContextAddEllipseInRect(context, arect);
CGContextDrawPath(context, kCGPathStroke);
//6.绘制图片
NSString* imagePath = [[NSBundle mainBundle] pathForResource:@"1" ofType:@"png"];
UIImage * myImageObj = [[UIImage alloc] initWithContentsOfFile:imagePath];
[myImageObj drawInRect:CGRectMake(20, 370, 200, 200)];
NSString *s = @"我的小狗";
[s drawAtPoint:CGPointMake(60, 400) withAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:16]}];
```
CDC33464-F977-493B-AD3D-1BB9AA1B1651.png
更多绘制看这里:http://blog.csdn.net/zhibudefeng/article/details/8463268/
##11.layoutSubviews在以下情况下会被调用:这个方法,默认没有做任何事情,需要子类进行重写
>1、addSubview会触发layoutSubviews。
>2、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化。
>3、滚动一个UIScrollView会触发layoutSubviews。
>4、旋转Screen会触发父UIView上的layoutSubviews事件。
>5、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件。
>6、直接调用setLayoutSubviews。
setNeedsLayout方法:
标记为需要重新布局,不立即刷新,但layoutSubviews一定会被调用,配合layoutIfNeeded立即更新。setNeedDisplay在receiver标上一个需要被重新绘图的标记,在下一个draw周期自动重绘,iphone device的刷新频率是60HZ,也就是1/60秒后重绘。 如果要立即刷新,要先调用[view setNeedsLayout],把标记设为需要布局,然后马上调用[view layoutIfNeeded],实现布局
-layoutIfNeeded方法:
如果有需要刷新的标记,立即调用layoutSubviews进行布局(如果没有标记,不会调用layoutSubviews),在layoutSubviews的注释里有这么一句:called by layoutIfNeeded automatically 自动调用layoutIfNeeded方法。
- (void)layoutSubviews; // override point. called by layoutIfNeeded automatically. As of iOS 6.0, when constraints-based layout is used the base implementation applies the constraints-based layout, otherwise it does nothing.
##12、使用cocoapods导致的 library not found for -lAFNetworking 等的问题
之前的项目在cocoapods升级之后报错了
library not found for -lAFNetworkingclang: error: linker command failed with exit code 1 (use -v to see invocation)
之前我在网上搜到的解决方法就是将Other Linker Flags 改为all_load就可以了。
关于Other Linker Flags里面添加的参数-ObjC、-all_load和-force_load讲解:http://www.jianshu.com/p/7579eda7cbef
刚刚看到了第二种解决方案:在 Search Paths 中 Library Search Paths 添加
"$PODS_CONFIGURATION_BUILD_DIR/AFNetworking"
##13、修改button字体靠左:
我们平时使用label什么的让字体居左居右都是用的textAlignment ,但是给button设置btn.titleLabel.textAlignment = NSTextAlignmentLeft;是不起作用的,它只是让标签中的文本左对齐,并没有改变标签在按钮中的对齐方式。所以,我们要用
btn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
这行代码让按钮中的标签左对齐,当然还有(center、right、fill),但是这样又会使button紧靠左边不好看,为了美观,我们需要添加下面这行代码:
btn.titleEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0);
这样就比较美观了。
##14、设置GIF动态图
设置GIF动图
导入#import <SDWebImage/UIImage+GIF.h>
NSString *path = [[NSBundle mainBundle]pathForResource:@"v_news" ofType:@"gif"];
NSData *data = [NSData dataWithContentsOfFile:path];
UIImage image = [UIImage sd_animatedGIFWithData:data];
UIImageView gifview=[[UIImageView alloc]initWithFrame:CGRectMake(10,20,image.size.width2, image.size.height2)];
gifview.image=image;
[self addSubview:gifview];
##15、点9图
![123.png](https://img.haomeiwen.com/i2900479/c9d877ec4ca44cfb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
如果项目中要用到横向的长条状图片,而美工又不能给你做图,恰好手上有如上一张图,那就只能将就着用了,但是如果直接用图片就会变形很丑。如下:
![6289F45F-9579-4EF6-BC55-B8BED30BDAB5.png](https://img.haomeiwen.com/i2900479/9b468dcdcb7048a8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
所以就用到了点9图,UIEdgeInsetsMake里面分别是上、左、下、右
UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(20, 100, 150, 50)];
UIImage *image = [UIImage imageNamed:@"123.png"];
image = [image resizableImageWithCapInsets:UIEdgeInsetsMake((image.size.height-1)/2, (image.size.width-1)/2, (image.size.height-1)/2, (image.size.width-1)/2) resizingMode:UIImageResizingModeStretch];
[btn setBackgroundImage:image forState:UIControlStateNormal];
[self.view addSubview:btn];
最终效果如下:
![8A325262-A2A7-4C3E-B8DC-01A43752745E.png](https://img.haomeiwen.com/i2900479/f5153676a1be33b0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
这里就把平时的一些小知识点全记录在这里了,持续更新!!!
网友评论