iOS随笔 - 实时更新

1、给 pod 进工程的库添加分类 添加的分类

注意 :创建的分类不能和库文件放在一块,会报 fileNotFound, 需要拖拽到别的文件(pod的东西我们没权限干涉)

2、 RGB颜色表

MIMEType 参考手册

3、Xcode8.0 去除控制台多余打印

选择Product->Scheme->Edit Scheme ...或者直接按 command + shift + < 快捷键,在弹出的窗口中Environment Variables 下添加 OS_ACTIVITY_MODE 设为 disable 。

如图:
iOS随笔 - 实时更新_第1张图片
4、真机中的所有log日志会被屏蔽掉,原因是ios10 开始为了提高真机性能,所以把log日志屏蔽了

系统的 NSLog() 已经不好使了,如果想在ios10系统的手机上也能打印日志,我们需要用到printf() 替换 NSLog()

#ifndef __OPTIMIZE__
  #define NSLog(...) printf("%f %s\n",[[NSDate date]timeIntervalSince1970],  [[NSString stringWithFormat:__VA_ARGS__]UTF8String]);
#endif
5、Xcode8快速注释无效的解决

解决方法:命令运行 sudo /usr/libexec/xpccachectl
然后必须重启电脑后生效。

6、枚举两种类型
typedef enum {
    //以下是枚举成员 TestA = 0,
    TestB,
    TestC,
    TestD
}Test;//枚举名称
//亦可以如下定义(推荐:结构比较清晰)
typedef NS_ENUM(NSInteger, Test1){
    //以下是枚举成员
    Test1A = 0,
    Test1B = 1,
    Test1C = 2,
    Test1D = 3
};
8 、修改searchbar文字内容及placeholder属性、光标


遍历searchbar的子view,取到TextField文本框,通过修改它的属性完成搜索框的改变.

for (UIView *view in searchBar.subviews){
        for (id subview in view.subviews){
            if ( [subview isKindOfClass:[UITextField class]] ){
       
                //文字大小
                [(UITextField *)subview setFont:[UIFont systemFontOfSize:20]];

                 //placeholder颜色
                NSAttributedString *attri = [[NSAttributedString alloc] initWithString:searchBar.placeholder attributes:@{NSForegroundColorAttributeName: [UIColor purpleColor], NSFontAttributeName: [UIFont systemFontOfSize:13]}];
                [(UITextField *)subview setAttributedPlaceholder:attri];
                
                //修改文本框文字内容颜色
                [(UITextField *)subview setDefaultTextAttributes:@{NSForegroundColorAttributeName:[UIColor greenColor]}];
      
                break;
            }
        }
    }
9、修改TextField的placeholder边距

自定义子类TextField,重写- (void)drawPlaceholderInRect:(CGRect)rect;

- (void)drawPlaceholderInRect:(CGRect)rect{
    UIColor *placeholderColor = [UIColor redColor];//设置颜色
    [placeholderColor setFill];
    
    CGRect placeholderRect = CGRectMake(rect.origin.x+30, (rect.size.height- self.font.pointSize)/2, rect.size.width, self.font.pointSize);//设置距离
    
    NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
    style.lineBreakMode = NSLineBreakByTruncatingTail;
    style.alignment = NSTextAlignmentCenter;
    
    NSDictionary *attr = [NSDictionary dictionaryWithObjectsAndKeys:style,NSParagraphStyleAttributeName, self.font, NSFontAttributeName, placeholderColor, NSForegroundColorAttributeName, nil];
    
    [self.placeholder drawInRect:placeholderRect withAttributes:attr];
}
10、利用贝塞尔曲线和CAShapeLayer可以绘制出各种路线

,再配合CAAnimation类的相关动画类即可完成酷炫的动画效果

11、The file “XXX.app” couldn’t be opened because you don’t have permission to view it.

解决方案:http://www.cnblogs.com/gaox97329498/p/4734917.html

12、真机状态cell侧滑失效

注意:需要实现此方法

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{}
13、在xib或storyboard中给label文字换行

需要组合键:option+enter

14、self.view.window属性和代理中window差异

self.view.window 想到了之前的一个面试题,个人感觉此处的window和代理window也没多少差别,打印地址一样。文档解释:This property is nil if the view has not yet been added to a window. 代理中的全局性强,view中的可以临时使用,也差不多少
资料

15、截屏-snapshotViewAfterScreenUpdates

在iOS7 以前, 获取一个UIView的快照有以下步骤: 首先创建一个UIGraphics的图像上下文,然后将视图的layer渲染到该上下文中,从而取得一个图像,最后关闭图像上下文,并将图像显示在UIImageView中。
现在我们只需要一行代码就可以完成上述步骤了:
UIView *snapView = [view snapshotViewAfterScreenUpdates:NO];
返回一个副本view。
截屏可以看这里

16、字典遍历

swift 3.0特别方便

for (key, value) in charDicts {                         //遍历字典
            print("key:\(key), value:\(value)")                 //
        }```
oc中这种方法也很方便

[dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
NSLog(@"key = %@ and obj = %@", key, obj);
}];```
或者分别遍历字典的[keys]和[values]

for (NSString *s in [dictionary allKeys]) {
    NSLog(@"key: %@", s);
}
17、实现web页面的缩放
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    //(initial-scale是初始缩放比,minimum-scale=1.0最小缩放比,maximum-scale=5.0最大缩放比,user-scalable=yes是否支持缩放)
    NSString *meta = [NSString stringWithFormat:@"document.getElementsByName(\"viewport\")[0].content = \"width=self.view.frame.size.width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=3.0, user-scalable=yes\""];
    
    [webView stringByEvaluatingJavaScriptFromString:meta];
}
18、网址含中文
- (NSString *)UTF8string:(NSString *)urlPath
{
    NSString *urlString = [urlPath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    
    //iOS10 上边的方法弃用
    if (currentSystemVersion >= 10.0) {
        urlString = [urlPath stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
    }
    return urlString;
}
19、文字属性
CGFloat fontSize = 15.f;
NSString *textString = @"非金融账户仅需要手机号码即可注册。由于并未对您的身份信息进行核实与校验,因此只能体验和使用本App中的部分服务或功能(例如浏览部分基金或资讯),若您需要使用基金交易等高价值服务或功能,您可以选择:";
    
    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    paragraphStyle.lineSpacing = 10.f;
    
    // 字号;字体颜色;段落格式(行间距等);字间距
    NSDictionary *attributes = @{NSFontAttributeName : [UIFont systemFontOfSize:fontSize],
                                 NSForegroundColorAttributeName : UIColorFromRGB(0x4a4a4a),
                                 NSParagraphStyleAttributeName : paragraphStyle,
                                 NSKernAttributeName:@1.5f};
    
    NSMutableAttributedString *attributeText = [[NSMutableAttributedString alloc] initWithString:textString attributes:attributes];
    
    CGSize titleSize = [textString boundingRectWithSize:CGSizeMake(CGRectGetWidth(popingView.frame) - padding *2, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil].size;
    
    UILabel *textLabel = [[UILabel alloc] init];
    textLabel.font = [UIFont systemFontOfSize:fontSize];
    textLabel.frame = CGRectMake(0, 0 , 375, titleSize.height);
    [popingView addSubview:textLabel];
    textLabel.backgroundColor = [UIColor greenColor];
    textLabel.numberOfLines = 0;
    textLabel.attributedText = attributeText;
19、字体UIFont

1.iOS9.0以后系统自带了平方字体PingFangSC,但是在iOS9.0以前,是没有平方字体PingFangSC的,如果我们想用平方字体,在iOS9.0以上是好的,但是在低于9.0的系统上是找不到这个字体的。
UIFont*font = [UIFontfontWithName:@"PingFangSC-Regular"size:18];
需要手动导入第三方字体,代码处理如下:

 //在ios8上是nil,如果不作处理,苹果会帮我们设置默认字体
if(font==nil){
  //这个是我手动导入的第三方平方字体
  font = [UIFontfontWithName:@"PingFang-SC-Regular"size:18];
 }
20、宏使用:这种情况下需要多包装一层
#define NUMBER   10
#define _CALCULATE(A,B)  (A##10##B)
#define CALCULATE(A,B)  \
    _CALCULATE(A,B)
21、 在使用pan gesture拖拽时,注意要在每次计算完拖拽点后清零
- (void)pan:(UIPanGestureRecognizer *)ges
{
    // 获取当前手势的位置
    CGPoint localPoint = [ges translationInView:ges.view];
    NSLog(@"%@", NSStringFromCGPoint(localPoint));
    // 获取到手势view
    UIButton *btn = (UIButton *)[ges view];
    // 计算新的位置坐标
    CGPoint newCenter = CGPointMake(btn.center.x + localPoint.x, btn.center.y + localPoint.y);
    // 更新btn的位置
    btn.center = newCenter;
    // 每次移动完,将移动量置为0,否则下次移动会加上这次移动量
    [ges setTranslation:CGPointZero inView:ges.view];
}
22、 需求:实现在一串字符串中高亮一部分文字并能点击这部分实现相应的功能(超链接,富文本)

比如:

iOS随笔 - 实时更新_第2张图片
Snip20170421_2.png

方案:UITextView + NSAttributeString富文本 ,(注意禁止掉textview可点击属性和滚动性)

- (void)createAttributeStr
{
    UITextView *_textview = [[UITextView alloc] init];
    _textview.frame = self.view.frame;
    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:@"请遵守以下协议《支付宝协议》《微信协议》《建行协议》《招行协议》《中国银行协议》《上海银行协议》"];
    [attributedString addAttribute:NSLinkAttributeName
                             value:@"zhifubao://"
                             range:[[attributedString string] rangeOfString:@"《支付宝协议》"]];
    [attributedString addAttribute:NSLinkAttributeName
                             value:@"weixin://"
                             range:[[attributedString string] rangeOfString:@"《微信协议》"]];
    [attributedString addAttribute:NSLinkAttributeName
                             value:@"jianhang://"
                             range:[[attributedString string] rangeOfString:@"《建行协议》"]];
    [attributedString addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:font] range:NSMakeRange(0, attributedString.length)];
    
    
    UIImage *image = [UIImage imageNamed: @"new_feature_share_true"];
    CGSize size = CGSizeMake(font + 2, font + 2);
    UIGraphicsBeginImageContextWithOptions(size, false, 0);
    [image drawInRect:CGRectMake(0, 2, size.width, size.height)];
    UIImage *resizeImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    NSTextAttachment *textAttachment = [[NSTextAttachment alloc] init];
    textAttachment.image = resizeImage;
    NSMutableAttributedString *imageString = [[NSMutableAttributedString alloc] initWithAttributedString:[NSAttributedString attributedStringWithAttachment:textAttachment]];
    [imageString addAttribute:NSLinkAttributeName
                        value:@"checkbox://"
                        range:NSMakeRange(0, imageString.length)];
    [attributedString insertAttributedString:imageString atIndex:0];
    
    _textview.attributedText = attributedString;
    _textview.linkTextAttributes = @{NSForegroundColorAttributeName: [UIColor blueColor],
                                     NSUnderlineColorAttributeName: [UIColor lightGrayColor],
                                     NSUnderlineStyleAttributeName: @(NSUnderlinePatternSolid)};
    
    _textview.delegate = self;
    _textview.editable = NO;        //必须禁止输入,否则点击将弹出输入键盘
    _textview.scrollEnabled = NO;
}
#pragma mark --- UITextViewDelegate ----
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange {
    if ([[URL scheme] isEqualToString:@"jianhang"]) {
        NSLog(@"建行支付---------------");
        return NO;
    } else if ([[URL scheme] isEqualToString:@"zhifubao"]) {
        NSLog(@"支付宝支付---------------");
        return NO;
    } else if ([[URL scheme] isEqualToString:@"weixin"]) {
        NSLog(@"微信支付---------------");
        return NO;
    } else if ([[URL scheme] isEqualToString:@"checkbox"]) {
        self.isSelect = !self.isSelect;
        [self protocolIsSelect:self.isSelect];
        return NO;
    }
    return YES;
}
23 、Block:

在mrc下,①只要block内部不引用外部的局部变量,block对象类型都是全局的。②引用了外部局部变量,block就会被分配到栈上。③只有给block变量加上copy才会分配到堆上(只能用copy关键字,使用retain关键字还是在栈上),从而才能被其他地方调用。

在arc下,①只要block引用了外部局部变量,block就会被放到堆上(系统默认调用了copy,但是程序员习惯性还是显示写明),和mac下不同。②block类型多为NSGlobalBlock或者NSMallocBlock,(NSStackBlock不常见,需要强行__weak声明)。

24 、父视图设置alpha值,子视图透明图不受影响
/* 
 1.用一张半透明的图片做背景。
 2.使用colorWithWhite:alpha:类方法
 3.使用colorWithRed:green:blue:alpha:类方法
 4.使用colorWithAlphaComponent:实例方法
 */
25、 performSelector:withObject:afterDelay: 内部大概是怎么实现的,有什么注意事项

创建一个定时器,时间结束后系统会使用runtime通过方法名称(Selector本质就是方法名称)去方法列表中找到对应的方法实现并调用方法

注意事项
调用performSelector:withObject:afterDelay:方法时,先判断希望调用的方法是否存在respondsToSelector:
这个方法是异步方法,必须在主线程调用,在子线程调用永远不会调用到想调用的方法

26、使用AutoLayout后 在ViewDidLoad中打印frame不对

原因:此时的view还没有加载出来,所有的控件的frame都是在当前storyboard中状态,接着才会调用viewWillLayoutSubviews,viewDidLayoutSubviews修改添加的约束
方案:在viewDidLoad中手动添加setNeedsLayout, layoutIfNeeded;
或者在viewWillLayoutSubviews,viewWillAppear中等到frame设置完成的方法里再取frame值

27、issue “file xxx.png is missing from working copy” at project building

适合本人的解决方法:

  • First I Committed and Pushed my changes

Xcode Main Menu > Source Control > Commit

  • Then I Discarded All Changes to get rid of the errors

Xcode Main Menu > Source Control > Discard All Changes

  • After that, the errors stating "file xxx.png is missing from working copy" disappeared.
28、CGContextStrokePath() 、CGContextFillPath () 和 CGContextDrawPath()

当用核心绘图时,eg:给圆环填充颜色,

    CGContextAddArc(context, 100, 60, 50, 0, M_PI * 2, 0);
    CGContextSetLineWidth(context, 10);
    CGContextSetStrokeColorWithColor(context, [UIColor yellowColor].CGColor);
    CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor);
    //* 无效,需要采用下面的 kCGPathFillStroke */
    //CGContextStrokePath(context);
    //CGContextFillPath(context);
    CGContextDrawPath(context, kCGPathFillStroke);

原因:顺序执行完stroke或fill后,会停留在当前结束的点,继续执行下面的fill或stroke只会重复绘制当前点

30、 iOS-数据返回字段null、导致的程序crash问题解决

前提是你用的是AFNetworking第三方。
设置下面属性:

  • serializer.removesKeysWithNullValues = YES;
  • 搜索AFURLResponseSerialization.m类,在定位到AFJSONResponseSerializer类,如下图:

iOS随笔 - 实时更新_第3张图片
WX20171018-112639.png

参考: iOS-数据返回字段null、导致的程序crash问题解决

31、移除导航条和tabbar黑线
[UITabBar appearance].clipsToBounds = YES;
[UINavigationBar appearance].clipsToBounds = YES;
32、AFN请求报错情况如下
Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo={NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.}

afn 默认的解析方式为json,后端返给的可能是非json格式,安卓有可能正常接收,如果在不修改后端数据格式的时候,ios可以通过作如下处理:


iOS随笔 - 实时更新_第4张图片
WX20171120-100230.png

ps:出现Error Domain=NSCocoaErrorDomain Code=-1060;
afn解析不了html格式的返回,在AFURLResponseSerialization.h里搜索self.acceptableContentTypes,添加上@"text/html",@"text/plain"。 此时可能会报上面的NSCocoaErrorDomain Code=3840错误,在进行如上操作。

33、tableView列表下拉刷新过大导致崩溃

index 3 beyond bounds for empty array

  • 原因:在下拉的时候我们需要请求最新的数据,清空原数组,此时,由于下拉的过大,导致下边的cell移除了屏幕,此时就会调用tableview的代理方法,而此时的数据源却被我们提前清空了,因此导致了数组的越界。
  • 方法:改变清空数组的时机,在请求结束后再remove
34、pop到指定页面popToViewController报Tried to pop to a view controller that doesn't exist.

例如:a->b->c->d, 然后d->a
error情况:

YDWeController *weVC = [YDWeController new];
[self.navigationController popToViewController: weVC animated:YES];

如果想pop到指定的页面需要知道需要a在栈里的位置

YDWeController *weVC = self.navigationController.childViewControllers[0];
[self.navigationController popToViewController: weVC animated:YES];

或者通过遍历

for (UIViewController *controller in self.navigationController.viewControllers) {  
        if ([controller isKindOfClass:[YDWeController class]]) {  
            YDWeController * weVC =(YDWeController *)controller;  
            [self.navigationController popToViewController: weVC animated:YES];  
        }else{  
            [self popToPreviousView];  
        }  
    } 
35、tableview 下回收键盘

一般想到的是touchBegen方法,但是此时无效,因为响应事件的还是vc的view,通过查询资料找到如下三种方法

iOS随笔 - 实时更新_第5张图片
方法一

iOS随笔 - 实时更新_第6张图片
方法二

iOS随笔 - 实时更新_第7张图片
方法三搞个基类
36、navigationBar 的属性 translucent 是否透明

解析default = YES,此时的屏幕尺寸是从最顶端开始计算,如果改成NO,则从导航栏下面开始计算
遇到的案例:在不同的页面入口进入相同的页面,底部会隐藏一定高度,在尝试修改self.edgesForExtendedLayout = UIRectEdgeNone无效后,或者重新计算frame.y是否减64,但是相对麻烦,最后发现是栈底控制器的导航栏的navigationBar.translucent = NO。导致后push的页面都是从导航栏下面开始计算的frame,所以页面少了一截。

37、隐藏状态栏
# step1:  在工程的info.plist文件中, 添加View controller-based status bar appearance-->值为: YES

# step2: 在指定的controller文件中, 实现下面方法

//在试图将要已将出现的方法中
- (void)viewDidAppear:(BOOL)animated{
    
    [super viewDidAppear:animated];
    
    if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) {
        
        //调用隐藏方法
        [self prefersStatusBarHidden];
        
        [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
        
    }

}

//实现隐藏方法
- (BOOL)prefersStatusBarHidden{
    
    return YES;
}

注释:info.plist文件中,View controller-based status bar appearance项设为YES,
则View controller对status bar的设置优先级高于application的设置。
为NO则以application的设置为准,view controller的prefersStatusBarHidden方法无效,是根本不会被调用的。
38、版本更新(非后台版)

链接:利用 iTunes 接口检查 App 版本更新

39 、设置富文本后多余文字不显示省略号...

正常情况下UILable 会自动添加..., 当给文字设置了富文本后省略号不会再显示,需要最后重新设置lineBreakMode换行符样式为NSLineBreakByTruncatingTail.
label.lineBreakMode = NSLineBreakByTruncatingTail;

40 返回数据为 :12,@“12”, @“abc” ,非集合类解析时,
    NSString *num=@"\"hah\"";
    NSError *error;
    NSData *createdData = [num dataUsingEncoding:NSUTF8StringEncoding];
    id response=[NSJSONSerialization JSONObjectWithData:createdData options:NSJSONReadingAllowFragments error:&error];
    NSLog(@"Response= %@",response);

NSJSONReadingMutableContainers:返回可变容器,NSMutableDictionary或NSMutableArray。

NSJSONReadingMutableLeaves:返回的JSON对象中字符串的值为NSMutableString

NSJSONReadingAllowFragments:允许JSON字符串最外层既不是NSArray也不是NSDictionary,但必须是有效的JSON Fragment。例如使用这个选项可以解析 @“123” 这样的字符串。参见链接

你可能感兴趣的:(iOS随笔 - 实时更新)