IOS开发基础知识--碎片47
1:解决ios静态库中的类别(category)在工程中不能使用
解决方法为:找到 target 的图标,更改其 Other Linker Flags 为: -all_load 或 -force_load
-force_load,后跟随一个文件位置,可以更精确地加载所需文件。
简单点说就是,Objective-C 的动态特性使得需要,为链接器添加一个标签(设置 Other Linker Flags 为 -ObjC)来解决通过 Category 向类添加方法的问题。
但这个标签 -ObjC 在 64 位 和 iOS 中有问题,需要使用 -all_load 或 -force_load。
总结如下:
如果,第三库中没有 category,Other Linker Flags 无需设置
如果,第三方库中有 category,需要设置为 -ObjC
如果,某些 Xcode 版本中,出现问题,修改设置为 -all_load
2:画虚线的两种方式
- a:重写drawRect
- - (void)drawRect:(CGRect)rect{
- [super drawRect:rect];
- CGContextRef currentContext = UIGraphicsGetCurrentContext();
- //设置虚线颜色
- CGContextSetStrokeColorWithColor(currentContext, [UIColor BlackColor].CGColor);
- //设置虚线宽度
- CGContextSetLineWidth(currentContext, );
- //设置虚线绘制起点
- CGContextMoveToPoint(currentContext, , );
- //设置虚线绘制终点
- CGContextAddLineToPoint(currentContext, self.frame.origin.x + self.frame.size.width, );
- //设置虚线排列的宽度间隔:下面的arr中的数字表示先绘制3个点再绘制1个点
- CGFloat arr[] = {,};
- //下面最后一个参数“2”代表排列的个数。
- CGContextSetLineDash(currentContext, , arr, );
- CGContextDrawPath(currentContext, kCGPathStroke);
- }
- b:通过UIImage的绘图方法来绘制
- // 画虚线
- // 创建一个imageView 高度是你想要的虚线的高度 一般设为2
- _lineImg = [[UIImageView alloc] initWithFrame:CGRectMake(, , kScreenWidth, )];
- // 调用方法 返回的iamge就是虚线
- _lineImg.image = [self drawLineByImageView:_lineImg];
- // 添加到控制器的view上
- [self.view addSubview:_lineImg];
- // 返回虚线image的方法
- - (UIImage *)drawLineByImageView:(UIImageView *)imageView{
- UIGraphicsBeginImageContext(imageView.frame.size); //开始画线 划线的frame
- [imageView.image drawInRect:CGRectMake(, , imageView.frame.size.width, imageView.frame.size.height)];
- //设置线条终点形状
- CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
- // 5是每个虚线的长度 1是高度
- float lengths[] = {,};
- CGContextRef line = UIGraphicsGetCurrentContext();
- // 设置颜色
- CGContextSetStrokeColorWithColor(line, [UIColor colorWithWhite:0.408 alpha:1.000].CGColor);
- CGContextSetLineDash(line, , lengths, ); //画虚线
- CGContextMoveToPoint(line, 0.0, 2.0); //开始画线
- CGContextAddLineToPoint(line, kScreenWidth - , 2.0);
- CGContextStrokePath(line);
- // UIGraphicsGetImageFromCurrentImageContext()返回的就是image
- return UIGraphicsGetImageFromCurrentImageContext();
- }
3:CGContextRef介绍
Graphics Context是图形上下文,也可以理解为一块画布,我们可以在上面进行绘画操作,绘制完成后,将画布放到我们的view中显示即可,view看作是一个画框.
- :写文字
- - (void)drawRect:(CGRect)rect
- {
- //获得当前画板
- CGContextRef ctx = UIGraphicsGetCurrentContext();
- //颜色
- CGContextSetRGBStrokeColor(ctx, 0.2, 0.2, 0.2, 1.0);
- //画线的宽度
- CGContextSetLineWidth(ctx, 0.25);
- //开始写字
- [@"我是文字" drawInRect:CGRectMake(, , , ) withFont:font];
- [super drawRect:rect];
- }
- :画直线
- - (void)drawRect:(CGRect)rect
- {
- //获得当前画板
- CGContextRef ctx = UIGraphicsGetCurrentContext();
- //颜色
- CGContextSetRGBStrokeColor(ctx, 0.2, 0.2, 0.2, 1.0);
- //画线的宽度
- CGContextSetLineWidth(ctx, 0.25);
- //顶部横线
- CGContextMoveToPoint(ctx, , );
- CGContextAddLineToPoint(ctx, self.bounds.size.width, );
- CGContextStrokePath(ctx);
- [super drawRect:rect];
- }
- :画圆
- - (void)drawRect:(CGRect)rect
- {
- //获得当前画板
- CGContextRef ctx = UIGraphicsGetCurrentContext();
- //颜色
- CGContextSetRGBStrokeColor(ctx, 0.2, 0.2, 0.2, 1.0);
- //画线的宽度
- CGContextSetLineWidth(ctx, 0.25);
- //void CGContextAddArc(CGContextRef c,CGFloat x, CGFloat y,CGFloat radius,CGFloat startAngle,CGFloat endAngle, int clockwise)1弧度=180°/π (≈57.3°) 度=弧度×180°/π 360°=360×π/180 =2π 弧度
- // x,y为圆点坐标,radius半径,startAngle为开始的弧度,endAngle为 结束的弧度,clockwise 0为顺时针,1为逆时针。
- CGContextAddArc(ctx, , , , , *M_PI, ); //添加一个圆
- CGContextDrawPath(ctx, kCGPathStroke); //绘制路径
- [super drawRect:rect];
- }
- :画矩形
- - (void)drawRect:(CGRect)rect
- {
- //获得当前画板
- CGContextRef ctx = UIGraphicsGetCurrentContext();
- //颜色
- CGContextSetRGBStrokeColor(ctx, 0.2, 0.2, 0.2, 1.0);
- //画线的宽度
- CGContextSetLineWidth(ctx, 0.25);
- CGContextAddRect(ctx, CGRectMake(, , , ));
- CGContextStrokePath(ctx);
- [super drawRect:rect];
- }
4:判断当前ViewController是push还是present的方式显示的
- NSArray *viewcontrollers=self.navigationController.viewControllers;
- if (viewcontrollers.count > )
- {
- if ([viewcontrollers objectAtIndex:viewcontrollers.count - ] == self)
- {
- //push方式
- [self.navigationController popViewControllerAnimated:YES];
- }
- }
- else
- {
- //present方式
- [self dismissViewControllerAnimated:YES completion:nil];
- }
5:获取实际使用的LaunchImage图片
- - (NSString *)getLaunchImageName
- {
- CGSize viewSize = self.window.bounds.size;
- // 竖屏
- NSString *viewOrientation = @"Portrait";
- NSString *launchImageName = nil;
- NSArray* imagesDict = [[[NSBundle mainBundle] infoDictionary] valueForKey:@"UILaunchImages"];
- for (NSDictionary* dict in imagesDict)
- {
- CGSize imageSize = CGSizeFromString(dict[@"UILaunchImageSize"]);
- if (CGSizeEqualToSize(imageSize, viewSize) && [viewOrientation isEqualToString:dict[@"UILaunchImageOrientation"]])
- {
- launchImageName = dict[@"UILaunchImageName"];
- }
- }
- return launchImageName;
- }
6:判断对象是否遵循了某协议
- if ([self.selectedController conformsToProtocol:@protocol(RefreshPtotocol)])
- {
- [self.selectedController performSelector:@selector(onTriggerRefresh)];
- }
7:判断view是不是指定视图的子视图
- BOOL isView = [textView isDescendantOfView:self.view];
8:阿拉伯数字转中文格式
- +(NSString *)translation:(NSString *)arebic
- {
- NSString *str = arebic;
- NSArray *arabic_numerals = @[@"",@"",@"",@"",@"",@"",@"",@"",@"",@""];
- NSArray *chinese_numerals = @[@"一",@"二",@"三",@"四",@"五",@"六",@"七",@"八",@"九",@"零"];
- NSArray *digits = @[@"个",@"十",@"百",@"千",@"万",@"十",@"百",@"千",@"亿",@"十",@"百",@"千",@"兆"];
- NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:chinese_numerals forKeys:arabic_numerals];
- NSMutableArray *sums = [NSMutableArray array];
- for (int i = ; i < str.length; i ++) {
- NSString *substr = [str substringWithRange:NSMakeRange(i, )];
- NSString *a = [dictionary objectForKey:substr];
- NSString *b = digits[str.length -i-];
- NSString *sum = [a stringByAppendingString:b];
- if ([a isEqualToString:chinese_numerals[]])
- {
- if([b isEqualToString:digits[]] || [b isEqualToString:digits[]])
- {
- sum = b;
- if ([[sums lastObject] isEqualToString:chinese_numerals[]])
- {
- [sums removeLastObject];
- }
- }else
- {
- sum = chinese_numerals[];
- }
- if ([[sums lastObject] isEqualToString:sum])
- {
- continue;
- }
- }
- [sums addObject:sum];
- }
- NSString *sumStr = [sums componentsJoinedByString:@""];
- NSString *chinese = [sumStr substringToIndex:sumStr.length-];
- NSLog(@"%@",str);
- NSLog(@"%@",chinese);
- return chinese;
- }
9:如何获取WebView所有的图片地址
- //UIWebView
- - (void)webViewDidFinishLoad:(UIWebView *)webView
- {
- //这里是js,主要目的实现对url的获取
- static NSString * const jsGetImages =
- @"function getImages(){\
- var objs = document.getElementsByTagName(\"img\");\
- var imgScr = '';\
- for(var i=;i<objs.length;i++){\
- imgScr = imgScr + objs[i].src + '+';\
- };\
- return imgScr;\
- };";
- [webView stringByEvaluatingJavaScriptFromString:jsGetImages];//注入js方法
- NSString *urlResult = [webView stringByEvaluatingJavaScriptFromString:@"getImages()"];
- NSArray *urlArray = [NSMutableArray arrayWithArray:[urlResult componentsSeparatedByString:@"+"]];
- //urlResurlt 就是获取到得所有图片的url的拼接;mUrlArray就是所有Url的数组
- }
- //WKWebView
- - (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation
- {
- static NSString * const jsGetImages =
- @"function getImages(){\
- var objs = document.getElementsByTagName(\"img\");\
- var imgScr = '';\
- for(var i=;i<objs.length;i++){\
- imgScr = imgScr + objs[i].src + '+';\
- };\
- return imgScr;\
- };";
- [webView evaluateJavaScript:jsGetImages completionHandler:nil];
- [webView evaluateJavaScript:@"getImages()" completionHandler:^(id _Nullable result, NSError * _Nullable error) {
- NSLog(@"%@",result);
- }];
- }
10:navigationBar根据滑动距离的渐变色实现
- //第一种
- - (void)scrollViewDidScroll:(UIScrollView *)scrollView
- {
- CGFloat offsetToShow = 200.0;//滑动多少就完全显示
- CGFloat alpha = - (offsetToShow - scrollView.contentOffset.y) / offsetToShow;
- [[self.navigationController.navigationBar subviews] objectAtIndex:].alpha = alpha;
- }
- //第二种
- - (void)scrollViewDidScroll:(UIScrollView *)scrollView
- {
- CGFloat offsetToShow = 200.0;
- CGFloat alpha = - (offsetToShow - scrollView.contentOffset.y) / offsetToShow;
- [self.navigationController.navigationBar setShadowImage:[UIImage new]];
- [self.navigationController.navigationBar setBackgroundImage:[self imageWithColor:[[UIColor orangeColor]colorWithAlphaComponent:alpha]] forBarMetrics:UIBarMetricsDefault];
- }
- //生成一张纯色的图片
- - (UIImage *)imageWithColor:(UIColor *)color
- {
- CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
- UIGraphicsBeginImageContext(rect.size);
- CGContextRef context = UIGraphicsGetCurrentContext();
- CGContextSetFillColorWithColor(context, [color CGColor]);
- CGContextFillRect(context, rect);
- UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();
- UIGraphicsEndImageContext();
- return theImage;
- }
11:iOS 开发中一些相关的路径
- 模拟器的位置:
- /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs
- 文档安装位置:
- /Applications/Xcode.app/Contents/Developer/Documentation/DocSets
- 插件保存路径:
- ~/Library/ApplicationSupport/Developer/Shared/Xcode/Plug-ins
- 自定义代码段的保存路径:
- ~/Library/Developer/Xcode/UserData/CodeSnippets/
- 如果找不到CodeSnippets文件夹,可以自己新建一个CodeSnippets文件夹。
- 描述文件路径
- ~/Library/MobileDevice/Provisioning Profiles
IOS开发基础知识--碎片47的更多相关文章
- IOS开发基础知识碎片-导航
1:IOS开发基础知识--碎片1 a:NSString与NSInteger的互换 b:Objective-c中集合里面不能存放基础类型,比如int string float等,只能把它们转化成对象才可 ...
- IOS开发基础知识--碎片33
1:AFNetworking状态栏网络请求效果 直接在AppDelegate里面didFinishLaunchingWithOptions进行设置 [[AFNetworkActivityIndicat ...
- IOS开发基础知识--碎片42
1:报thread 1:exc_bad_access(code=1,address=0x70********) 闪退 这种错误通常是内存管理的问题,一般是访问了已经释放的对象导致的,可以开启僵尸对象( ...
- IOS开发基础知识--碎片50
1:Masonry 2个或2个以上的控件等间隔排序 /** * 多个控件固定间隔的等间隔排列,变化的是控件的长度或者宽度值 * * @param axisType 轴线方向 * @param fi ...
- IOS开发基础知识--碎片3
十二:判断设备 //设备名称 return [UIDevice currentDevice].name; //设备型号,只可得到是何设备,无法得到是第几代设备 return [UIDevice cur ...
- IOS开发基础知识--碎片11
1:AFNetwork判断网络状态 #import “AFNetworkActivityIndicatorManager.h" - (BOOL)application:(UIApplicat ...
- IOS开发基础知识--碎片14
1:ZIP文件压缩跟解压,使用ZipArchive 创建/添加一个zip包 ZipArchive* zipFile = [[ZipArchive alloc] init]; //次数得zipfilen ...
- IOS开发基础知识--碎片16
1:Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id) 对象在运行时获取其类型的能力称为内省.内省可以有多种方法实现. 判断对象类型 -(BOO ...
- IOS开发基础知识--碎片19
1:键盘事件顺序 UIKeyboardWillShowNotification // 键盘显示之前 UIKeyboardDidShowNotification // 键盘显示完成后 UIKeyboar ...
随机推荐
- Web APi之异常处理(Exception)以及日志记录(NLog)(十六)
前言 上一篇文章我们介绍了关于日志记录用的是Log4net,确实也很挺强大,但是别忘了我们.NET有专属于我们的日志框架,那就是NLog,相对于Log4net而言,NLog可以说也是一个很好的记录日志 ...
- 应用程序框架实战三十四:数据传输对象(DTO)介绍及各类型实体比较
本文将介绍DDD分层架构中广泛使用的数据传输对象Dto,并且与领域实体Entity,查询实体QueryObject,视图实体ViewModel等几种实体进行比较. 领域实体为何不能一统江湖? 当你阅读 ...
- vc下的静态链接库与动态链接库(一)
一.静态库与动态库的区别 目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Lib ...
- 【记录】VS2012新建MVC3/MVC4项目时,报:此模板尝试加载组件程序集“NuGet.VisualStudio.Interop...”
最近电脑装了 VisualStudio "14" CTP,由于把其他版本的 VS 卸掉,由高到低版本安装,当时安装完 VisualStudio "14" CTP ...
- M端总结
最近在项目开发过程中涉及到了移动端,现在对此进行总结. 在此次M端的开发过程中,遇到了许多问题,在此进行一次总结,希望大家在以后的开发过程中能尽量规避类似的问题,提高开发效率和代码质量.一.布局1.移 ...
- Cesium应用篇:2影像服务(上)
文章中相关范例下载路径:https://yunpan.cn/cByQqkANWN7Pu 访问密码 823d Cesium中提供了多种ImageryProvider方式,来满足用户的实际需 ...
- iOS-LaunchImage启动页
一. 目标: 设置一个漂亮的启动页. 二.步骤 1. 先创建LaunchImage 2. 进一步设置需要适配的启动页机型 3. 设置完成的效果 4.往里面拖图片,如图是适配的图片的配置 5. 在项目中 ...
- [java] 深入理解内部类: inner-classes
[java] 深入理解内部类: inner-classes // */ // ]]> [java] 深入理解内部类: inner-classes Table of Contents 1 简介 ...
- 自动实现接口的实例,mybatis就是这样实现的
思考 很多人用过MyBatis,或者使用过SpringData,那么和传统的jdbc相比,差别在哪里呢?传统的dao层,接口需要有实现,需要连接发出sql,需要接收返回值,但是mybatis只需要实现 ...
- jQuery-1.9.1源码分析系列(十五) 动画处理——缓动动画核心Tween
在jQuery内部函数Animation中调用到了createTweens()来创建缓动动画组,创建完成后的结果为: 可以看到上面的缓动动画组有四个原子动画组成.每一个原子动画的信息都包含在里面了. ...