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:画虚线的两种方式

  1. a:重写drawRect
  2.  
  3. - (void)drawRect:(CGRect)rect{
  4. [super drawRect:rect];
  5. CGContextRef currentContext = UIGraphicsGetCurrentContext();
  6. //设置虚线颜色
  7. CGContextSetStrokeColorWithColor(currentContext, [UIColor BlackColor].CGColor);
  8. //设置虚线宽度
  9. CGContextSetLineWidth(currentContext, );
  10. //设置虚线绘制起点
  11. CGContextMoveToPoint(currentContext, , );
  12. //设置虚线绘制终点
  13. CGContextAddLineToPoint(currentContext, self.frame.origin.x + self.frame.size.width, );
  14. //设置虚线排列的宽度间隔:下面的arr中的数字表示先绘制3个点再绘制1个点
  15. CGFloat arr[] = {,};
  16. //下面最后一个参数“2”代表排列的个数。
  17. CGContextSetLineDash(currentContext, , arr, );
  18. CGContextDrawPath(currentContext, kCGPathStroke);
  19. }
  1. b:通过UIImage的绘图方法来绘制
  2.  
  3. // 画虚线
  4. // 创建一个imageView 高度是你想要的虚线的高度 一般设为2
  5. _lineImg = [[UIImageView alloc] initWithFrame:CGRectMake(, , kScreenWidth, )];
  6. // 调用方法 返回的iamge就是虚线
  7. _lineImg.image = [self drawLineByImageView:_lineImg];
  8. // 添加到控制器的view上
  9. [self.view addSubview:_lineImg];
  10.  
  11. // 返回虚线image的方法
  12. - (UIImage *)drawLineByImageView:(UIImageView *)imageView{
  13. UIGraphicsBeginImageContext(imageView.frame.size); //开始画线 划线的frame
  14. [imageView.image drawInRect:CGRectMake(, , imageView.frame.size.width, imageView.frame.size.height)];
  15. //设置线条终点形状
  16. CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
  17. // 5是每个虚线的长度 1是高度
  18. float lengths[] = {,};
  19. CGContextRef line = UIGraphicsGetCurrentContext();
  20. // 设置颜色
  21. CGContextSetStrokeColorWithColor(line, [UIColor colorWithWhite:0.408 alpha:1.000].CGColor);
  22. CGContextSetLineDash(line, , lengths, ); //画虚线
  23. CGContextMoveToPoint(line, 0.0, 2.0); //开始画线
  24. CGContextAddLineToPoint(line, kScreenWidth - , 2.0);
  25.  
  26. CGContextStrokePath(line);
  27. // UIGraphicsGetImageFromCurrentImageContext()返回的就是image
  28. return UIGraphicsGetImageFromCurrentImageContext();
  29. }

3:CGContextRef介绍

Graphics Context是图形上下文,也可以理解为一块画布,我们可以在上面进行绘画操作,绘制完成后,将画布放到我们的view中显示即可,view看作是一个画框.

  1. :写文字
  2.  
  3. - (void)drawRect:(CGRect)rect
  4. {
  5. //获得当前画板
  6. CGContextRef ctx = UIGraphicsGetCurrentContext();
  7. //颜色
  8. CGContextSetRGBStrokeColor(ctx, 0.2, 0.2, 0.2, 1.0);
  9. //画线的宽度
  10. CGContextSetLineWidth(ctx, 0.25);
  11. //开始写字
  12. [@"我是文字" drawInRect:CGRectMake(, , , ) withFont:font];
  13. [super drawRect:rect];
  14. }
  15.  
  16. :画直线
  17.  
  18. - (void)drawRect:(CGRect)rect
  19. {
  20. //获得当前画板
  21. CGContextRef ctx = UIGraphicsGetCurrentContext();
  22. //颜色
  23. CGContextSetRGBStrokeColor(ctx, 0.2, 0.2, 0.2, 1.0);
  24. //画线的宽度
  25. CGContextSetLineWidth(ctx, 0.25);
  26. //顶部横线
  27. CGContextMoveToPoint(ctx, , );
  28. CGContextAddLineToPoint(ctx, self.bounds.size.width, );
  29. CGContextStrokePath(ctx);
  30. [super drawRect:rect];
  31. }
  32.  
  33. :画圆
  34.  
  35. - (void)drawRect:(CGRect)rect
  36. {
  37. //获得当前画板
  38. CGContextRef ctx = UIGraphicsGetCurrentContext();
  39. //颜色
  40. CGContextSetRGBStrokeColor(ctx, 0.2, 0.2, 0.2, 1.0);
  41. //画线的宽度
  42. CGContextSetLineWidth(ctx, 0.25);
  43. //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π 弧度
  44. // x,y为圆点坐标,radius半径,startAngle为开始的弧度,endAngle为 结束的弧度,clockwise 0为顺时针,1为逆时针。
  45. CGContextAddArc(ctx, , , , , *M_PI, ); //添加一个圆
  46. CGContextDrawPath(ctx, kCGPathStroke); //绘制路径
  47. [super drawRect:rect];
  48. }
  49.  
  50. :画矩形
  51.  
  52. - (void)drawRect:(CGRect)rect
  53. {
  54. //获得当前画板
  55. CGContextRef ctx = UIGraphicsGetCurrentContext();
  56. //颜色
  57. CGContextSetRGBStrokeColor(ctx, 0.2, 0.2, 0.2, 1.0);
  58. //画线的宽度
  59. CGContextSetLineWidth(ctx, 0.25);
  60. CGContextAddRect(ctx, CGRectMake(, , , ));
  61. CGContextStrokePath(ctx);
  62. [super drawRect:rect];
  63. }

 4:判断当前ViewController是push还是present的方式显示的

  1. NSArray *viewcontrollers=self.navigationController.viewControllers;
  2.  
  3. if (viewcontrollers.count > )
  4. {
  5. if ([viewcontrollers objectAtIndex:viewcontrollers.count - ] == self)
  6. {
  7. //push方式
  8. [self.navigationController popViewControllerAnimated:YES];
  9. }
  10. }
  11. else
  12. {
  13. //present方式
  14. [self dismissViewControllerAnimated:YES completion:nil];
  15. }

5:获取实际使用的LaunchImage图片

  1. - (NSString *)getLaunchImageName
  2. {
  3. CGSize viewSize = self.window.bounds.size;
  4. // 竖屏
  5. NSString *viewOrientation = @"Portrait";
  6. NSString *launchImageName = nil;
  7. NSArray* imagesDict = [[[NSBundle mainBundle] infoDictionary] valueForKey:@"UILaunchImages"];
  8. for (NSDictionary* dict in imagesDict)
  9. {
  10. CGSize imageSize = CGSizeFromString(dict[@"UILaunchImageSize"]);
  11. if (CGSizeEqualToSize(imageSize, viewSize) && [viewOrientation isEqualToString:dict[@"UILaunchImageOrientation"]])
  12. {
  13. launchImageName = dict[@"UILaunchImageName"];
  14. }
  15. }
  16. return launchImageName;
  17. }

6:判断对象是否遵循了某协议

  1. if ([self.selectedController conformsToProtocol:@protocol(RefreshPtotocol)])
  2. {
  3. [self.selectedController performSelector:@selector(onTriggerRefresh)];
  4. }

7:判断view是不是指定视图的子视图

  1. BOOL isView = [textView isDescendantOfView:self.view];

8:阿拉伯数字转中文格式

  1. +(NSString *)translation:(NSString *)arebic
  2. {
  3. NSString *str = arebic;
  4. NSArray *arabic_numerals = @[@"",@"",@"",@"",@"",@"",@"",@"",@"",@""];
  5. NSArray *chinese_numerals = @[@"一",@"二",@"三",@"四",@"五",@"六",@"七",@"八",@"九",@"零"];
  6. NSArray *digits = @[@"个",@"十",@"百",@"千",@"万",@"十",@"百",@"千",@"亿",@"十",@"百",@"千",@"兆"];
  7. NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:chinese_numerals forKeys:arabic_numerals];
  8.  
  9. NSMutableArray *sums = [NSMutableArray array];
  10. for (int i = ; i < str.length; i ++) {
  11. NSString *substr = [str substringWithRange:NSMakeRange(i, )];
  12. NSString *a = [dictionary objectForKey:substr];
  13. NSString *b = digits[str.length -i-];
  14. NSString *sum = [a stringByAppendingString:b];
  15. if ([a isEqualToString:chinese_numerals[]])
  16. {
  17. if([b isEqualToString:digits[]] || [b isEqualToString:digits[]])
  18. {
  19. sum = b;
  20. if ([[sums lastObject] isEqualToString:chinese_numerals[]])
  21. {
  22. [sums removeLastObject];
  23. }
  24. }else
  25. {
  26. sum = chinese_numerals[];
  27. }
  28.  
  29. if ([[sums lastObject] isEqualToString:sum])
  30. {
  31. continue;
  32. }
  33. }
  34.  
  35. [sums addObject:sum];
  36. }
  37.  
  38. NSString *sumStr = [sums componentsJoinedByString:@""];
  39. NSString *chinese = [sumStr substringToIndex:sumStr.length-];
  40. NSLog(@"%@",str);
  41. NSLog(@"%@",chinese);
  42. return chinese;
  43. }

9:如何获取WebView所有的图片地址

  1. //UIWebView
  2. - (void)webViewDidFinishLoad:(UIWebView *)webView
  3. {
  4. //这里是js,主要目的实现对url的获取
  5. static NSString * const jsGetImages =
  6. @"function getImages(){\
  7. var objs = document.getElementsByTagName(\"img\");\
  8. var imgScr = '';\
  9. for(var i=;i<objs.length;i++){\
  10. imgScr = imgScr + objs[i].src + '+';\
  11. };\
  12. return imgScr;\
  13. };";
  14.  
  15. [webView stringByEvaluatingJavaScriptFromString:jsGetImages];//注入js方法
  16. NSString *urlResult = [webView stringByEvaluatingJavaScriptFromString:@"getImages()"];
  17. NSArray *urlArray = [NSMutableArray arrayWithArray:[urlResult componentsSeparatedByString:@"+"]];
  18. //urlResurlt 就是获取到得所有图片的url的拼接;mUrlArray就是所有Url的数组
  19. }
  1. //WKWebView
  2. - (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation
  3. {
  4. static NSString * const jsGetImages =
  5. @"function getImages(){\
  6. var objs = document.getElementsByTagName(\"img\");\
  7. var imgScr = '';\
  8. for(var i=;i<objs.length;i++){\
  9. imgScr = imgScr + objs[i].src + '+';\
  10. };\
  11. return imgScr;\
  12. };";
  13.  
  14. [webView evaluateJavaScript:jsGetImages completionHandler:nil];
  15. [webView evaluateJavaScript:@"getImages()" completionHandler:^(id _Nullable result, NSError * _Nullable error) {
  16. NSLog(@"%@",result);
  17. }];
  18. }

10:navigationBar根据滑动距离的渐变色实现

  1. //第一种
  2. - (void)scrollViewDidScroll:(UIScrollView *)scrollView
  3. {
  4. CGFloat offsetToShow = 200.0;//滑动多少就完全显示
  5. CGFloat alpha = - (offsetToShow - scrollView.contentOffset.y) / offsetToShow;
  6. [[self.navigationController.navigationBar subviews] objectAtIndex:].alpha = alpha;
  7. }
  1. //第二种
  2. - (void)scrollViewDidScroll:(UIScrollView *)scrollView
  3. {
  4. CGFloat offsetToShow = 200.0;
  5. CGFloat alpha = - (offsetToShow - scrollView.contentOffset.y) / offsetToShow;
  6.  
  7. [self.navigationController.navigationBar setShadowImage:[UIImage new]];
  8. [self.navigationController.navigationBar setBackgroundImage:[self imageWithColor:[[UIColor orangeColor]colorWithAlphaComponent:alpha]] forBarMetrics:UIBarMetricsDefault];
  9. }
  10.  
  11. //生成一张纯色的图片
  12. - (UIImage *)imageWithColor:(UIColor *)color
  13. {
  14. CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
  15. UIGraphicsBeginImageContext(rect.size);
  16. CGContextRef context = UIGraphicsGetCurrentContext();
  17. CGContextSetFillColorWithColor(context, [color CGColor]);
  18. CGContextFillRect(context, rect);
  19. UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();
  20. UIGraphicsEndImageContext();
  21.  
  22. return theImage;
  23. }

11:iOS 开发中一些相关的路径

  1. 模拟器的位置:
  2. /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs
  3.  
  4. 文档安装位置:
  5. /Applications/Xcode.app/Contents/Developer/Documentation/DocSets
  6.  
  7. 插件保存路径:
  8. ~/Library/ApplicationSupport/Developer/Shared/Xcode/Plug-ins
  9.  
  10. 自定义代码段的保存路径:
  11. ~/Library/Developer/Xcode/UserData/CodeSnippets/
  12. 如果找不到CodeSnippets文件夹,可以自己新建一个CodeSnippets文件夹。
  13.  
  14. 描述文件路径
  15. ~/Library/MobileDevice/Provisioning Profiles

IOS开发基础知识--碎片47的更多相关文章

  1. IOS开发基础知识碎片-导航

    1:IOS开发基础知识--碎片1 a:NSString与NSInteger的互换 b:Objective-c中集合里面不能存放基础类型,比如int string float等,只能把它们转化成对象才可 ...

  2. IOS开发基础知识--碎片33

    1:AFNetworking状态栏网络请求效果 直接在AppDelegate里面didFinishLaunchingWithOptions进行设置 [[AFNetworkActivityIndicat ...

  3. IOS开发基础知识--碎片42

    1:报thread 1:exc_bad_access(code=1,address=0x70********) 闪退 这种错误通常是内存管理的问题,一般是访问了已经释放的对象导致的,可以开启僵尸对象( ...

  4. IOS开发基础知识--碎片50

      1:Masonry 2个或2个以上的控件等间隔排序 /** * 多个控件固定间隔的等间隔排列,变化的是控件的长度或者宽度值 * * @param axisType 轴线方向 * @param fi ...

  5. IOS开发基础知识--碎片3

    十二:判断设备 //设备名称 return [UIDevice currentDevice].name; //设备型号,只可得到是何设备,无法得到是第几代设备 return [UIDevice cur ...

  6. IOS开发基础知识--碎片11

    1:AFNetwork判断网络状态 #import “AFNetworkActivityIndicatorManager.h" - (BOOL)application:(UIApplicat ...

  7. IOS开发基础知识--碎片14

    1:ZIP文件压缩跟解压,使用ZipArchive 创建/添加一个zip包 ZipArchive* zipFile = [[ZipArchive alloc] init]; //次数得zipfilen ...

  8. IOS开发基础知识--碎片16

    1:Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id) 对象在运行时获取其类型的能力称为内省.内省可以有多种方法实现. 判断对象类型 -(BOO ...

  9. IOS开发基础知识--碎片19

    1:键盘事件顺序 UIKeyboardWillShowNotification // 键盘显示之前 UIKeyboardDidShowNotification // 键盘显示完成后 UIKeyboar ...

随机推荐

  1. Web APi之异常处理(Exception)以及日志记录(NLog)(十六)

    前言 上一篇文章我们介绍了关于日志记录用的是Log4net,确实也很挺强大,但是别忘了我们.NET有专属于我们的日志框架,那就是NLog,相对于Log4net而言,NLog可以说也是一个很好的记录日志 ...

  2. 应用程序框架实战三十四:数据传输对象(DTO)介绍及各类型实体比较

    本文将介绍DDD分层架构中广泛使用的数据传输对象Dto,并且与领域实体Entity,查询实体QueryObject,视图实体ViewModel等几种实体进行比较. 领域实体为何不能一统江湖? 当你阅读 ...

  3. vc下的静态链接库与动态链接库(一)

    一.静态库与动态库的区别 目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Lib ...

  4. 【记录】VS2012新建MVC3/MVC4项目时,报:此模板尝试加载组件程序集“NuGet.VisualStudio.Interop...”

    最近电脑装了 VisualStudio "14" CTP,由于把其他版本的 VS 卸掉,由高到低版本安装,当时安装完 VisualStudio "14" CTP ...

  5. M端总结

    最近在项目开发过程中涉及到了移动端,现在对此进行总结. 在此次M端的开发过程中,遇到了许多问题,在此进行一次总结,希望大家在以后的开发过程中能尽量规避类似的问题,提高开发效率和代码质量.一.布局1.移 ...

  6. Cesium应用篇:2影像服务(上)

    文章中相关范例下载路径:https://yunpan.cn/cByQqkANWN7Pu 访问密码 823d        Cesium中提供了多种ImageryProvider方式,来满足用户的实际需 ...

  7. iOS-LaunchImage启动页

    一. 目标: 设置一个漂亮的启动页. 二.步骤 1. 先创建LaunchImage 2. 进一步设置需要适配的启动页机型 3. 设置完成的效果 4.往里面拖图片,如图是适配的图片的配置 5. 在项目中 ...

  8. [java] 深入理解内部类: inner-classes

    [java] 深入理解内部类: inner-classes // */ // ]]>   [java] 深入理解内部类: inner-classes Table of Contents 1 简介 ...

  9. 自动实现接口的实例,mybatis就是这样实现的

    思考 很多人用过MyBatis,或者使用过SpringData,那么和传统的jdbc相比,差别在哪里呢?传统的dao层,接口需要有实现,需要连接发出sql,需要接收返回值,但是mybatis只需要实现 ...

  10. jQuery-1.9.1源码分析系列(十五) 动画处理——缓动动画核心Tween

    在jQuery内部函数Animation中调用到了createTweens()来创建缓动动画组,创建完成后的结果为: 可以看到上面的缓动动画组有四个原子动画组成.每一个原子动画的信息都包含在里面了. ...