开发各种少见问题解决办法。

1. 设置系统tabbar中TabBarItem选中的颜色

示例代码:

* [[UITabBarItem appearance] setTitleTextAttributes:@{NSFontAttributeName : [UIFont systemFontOfSize:10 weight:UIFontWeightMedium],NSForegroundColorAttributeName:[UIColor colorWithHexString:@"#333333"]} forState:UIControlStateSelected];
* [[UITabBarItem appearance] setTitleTextAttributes:@{NSFontAttributeName : [UIFont systemFontOfSize:10 weight:UIFontWeightRegular],NSForegroundColorAttributeName:[UIColor grayColor]} forState:UIControlStateNormal];

2.给设置圆角的的View设置阴影

情况描述
大家都知道给一个View设置圆角和简单,给一个View设置阴影也很简单,但是发现当一个View设置了圆角后,在给其设置阴影会发现一点都不简单了,没有效果。what is happen?
原来设置圆角的代码:masksToBounds = YES 把阴影给剪切掉了啊。怎么办呢?
考虑了很久,想到把设置阴影的View放到一个父视图上,然后在父视图上设置阴影,核心代码如下:

UIView *shadowView = [[UIView alloc]initWithFrame:self.layoutView.frame];
[self.view addSubview:shadowView];
shadowView.layer.shadowColor = [UIColor blackColor].CGColor;
//偏移角度 (当为CGSizeMark(0,0) 则设置阴影的视图的周围都有一圈阴影)
shadowView.layer.shadowOffset = CGSizeMake(5, 5);
shadowView.layer.shadowOpacity = 0.5f;
shadowView.layer.shadowRadius = 9.0;//圆角宽度
shadowView.layer.cornerRadius = 9.0; //圆角半径
shadowView.clipsToBounds = NO;
[shadowView addSubview:self.layoutView];

3.在使用CocoaPod管理项目时,有时会更新podFile文件,这是一般要执行pod update 可能这是会出现把其他三方更新到最新的情况,而这时往往又使我们不愿看到的,这时可以使用如下命令防止这一情况:

pod update --verbose --no-repo-update

4. iOS开发,Xcode 出现Could not build module 'Foundation'类似的错误

1 引用问题

  • 检查pch 是否导入头文件 , 导入是否可用
  • 解决:在引用头文件开始加入#ifdef OBJC 结束时加入#endif,例如
ifndef PureStandard_PrefixHeader_pch
define PureStandard_PrefixHeader_pch
ifdef __OBJC__
import "A.h"
import "B.h"
#endif

2. 系统文件(Xcode文件)被修改

可能性:UIKit等库损坏或被修改(不能修改,一改就坏),也就是你查看Xcode编译器系统文件时不小心改了

  • 可以恢复的就撤销的就撤销。
  • 不能撤销的就只有花几十分钟重新安装Xcode了

5. iOS对象(字典或数组)转化为JSon字符串

使用系统自带的NSJSONSerialization可以满足常用的JSON转化 (可以抛弃所有三方了毕竟很久没更新了)
使用示例:

 NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
    [dictionary setValue:@"hello" forKey:@"one"];
    [dictionary setValue:@"world" forKey:@"two"];
    NSArray *arry=[NSArray arrayWithObjects:@"001",@"002",@"003", nil];
    [dictionary setValue:arry forKey:@"three"];
    NSData *data=[NSJSONSerialization dataWithJSONObject:dictionary  options:NSJSONWritingPrettyPrinted error:nil]; //此处可以传字典数组,或者数组字典
    NSString *jsonStr=[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"jsonStr==%@",jsonStr);

输出结果为:

str=={
  "one" : "hello",
  "two" : "world",
  "three" : [
    "001",
    "002",
    "003"
  ]
}

注意: 此处转换后的JSON字符串带有很多空格和换行符
要去掉的话,根据苹果API 解释可以这样操作:

NSData *data=[NSJSONSerialization dataWithJSONObject:dictionary  options:0 error:nil];  //为0 就会得到我们想要的结果

6. 计算Label中文字的行数和每行中的文字

这中需求其实还是很容易遇到的,可能遇到有不同的解决方案,
这里找到一个比较简便的方案:


#import <CoreText/CoreText.h>  (包含头文件)

- (NSArray *)getLinesArrayOfStringInLabel:(UILabel *)label{
    NSString *text = [label text];
    UIFont *font = [label font];
    CGRect rect = [label frame];

    CTFontRef myFont = CTFontCreateWithName(( CFStringRef)([font fontName]), [font pointSize], NULL);
    NSMutableAttributedString *attStr = [[NSMutableAttributedString alloc] initWithString:text];
    [attStr addAttribute:(NSString *)kCTFontAttributeName value:(__bridge  id)myFont range:NSMakeRange(0, attStr.length)];
    CFRelease(myFont);
    CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString(( CFAttributedStringRef)attStr);
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathAddRect(path, NULL, CGRectMake(0,0,rect.size.width,100000));
    CTFrameRef frame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, 0), path, NULL);
    NSArray *lines = ( NSArray *)CTFrameGetLines(frame);
    NSMutableArray *linesArray = [[NSMutableArray alloc]init];
    for (id line in lines) {
        CTLineRef lineRef = (__bridge  CTLineRef )line;
        CFRange lineRange = CTLineGetStringRange(lineRef);
        NSRange range = NSMakeRange(lineRange.location, lineRange.length);
        NSString *lineString = [text substringWithRange:range];
        CFAttributedStringSetAttribute((CFMutableAttributedStringRef)attStr, lineRange, kCTKernAttributeName, (CFTypeRef)([NSNumber numberWithFloat:0.0]));
        CFAttributedStringSetAttribute((CFMutableAttributedStringRef)attStr, lineRange, kCTKernAttributeName, (CFTypeRef)([NSNumber numberWithInt:0.0]));
        //NSLog(@"''''''''''''''''''%@",lineString);
        [linesArray addObject:lineString];
    }

    CGPathRelease(path);
    CFRelease( frame );
    CFRelease(frameSetter);
    return (NSArray *)linesArray;
}

7. 全局取消视图响应 比如让键盘消失

当然这些控件一般都有自带的取消第一响应者的方法,但是系统也有通用的全局取消方法,最常用的方法如下:


 [self.view endEditing:YES];

但是当有些响应者的视图没在当前视图上,这是用上面的方法就不可行了,我找了半天终于找到一个方法:


[[UIApplication sharedApplication].keyWindow endEditing:YES];

8. UITextField 限制字符长度

网上找了很多方法但是没有找找到完美的放啊,最厚终于找打了一个方法里面具体内容如下:

    [self.truckWeight addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];


- (void)textFieldDidChange:(UITextField *)textField{
    
    NSInteger kMaxLength = 5;
    NSString *toBeString = textField.text;
    NSString *lang = [[UIApplication sharedApplication]textInputMode].primaryLanguage;
    
    if ([lang isEqualToString:@"zh-Hans"]) { //中文输入
        
        UITextRange *selectedRange = [textField markedTextRange];
        //获取高亮部分
        UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
        
        if (!position) {// 没有高亮选择的字,则对已输入的文字进行字数统计和限制
            
            if (toBeString.length > kMaxLength) {
                
                textField.text = [toBeString substringToIndex:kMaxLength];
                
            }
        }
        else{//有高亮选择的字符串,则暂不对文字进行统计和限制
        }
    }else{//中文输入法以外的直接对其统计限制即可,不考虑其他语种情况
        
        if (toBeString.length > kMaxLength) {
            textField.text = [toBeString substringToIndex:kMaxLength];
        }
    } 
}

9. UITextField 只能输入数字并且只有2位小数

这个和上面的限制可以同时使用 还是有很多这种奇葩需求的

- (BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    
    if (textField == self.truckWeight) {
        NSScanner      *scanner    = [NSScanner scannerWithString:string];
        NSCharacterSet *numbers;
        NSRange         pointRange = [textField.text rangeOfString:@"."];
        
        if ( (pointRange.length > 0) && (pointRange.location < range.location  || pointRange.location > range.location + range.length) )
        {
            numbers = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];
        }
        else
        {
            numbers = [NSCharacterSet characterSetWithCharactersInString:@"0123456789."];
        }

        if ( [textField.text isEqualToString:@""] && [string isEqualToString:@"."] )
        {
            return NO;
        }
        short remain = 2; //默认保留2位小数
        NSString *tempStr = [textField.text stringByAppendingString:string];
        NSUInteger strlen = [tempStr length];
        if(pointRange.length > 0 && pointRange.location > 0){ //判断输入框内是否含有“.”。
            if([string isEqualToString:@"."]){ //当输入框内已经含有“.”时,如果再输入“.”则被视为无效。
                return NO;
            }
            if(strlen > 0 && (strlen - pointRange.location) > remain+1){ //当输入框内已经含有“.”,当字符串长度减去小数点前面的字符串长度大于需要要保留的小数点位数,则视当次输入无效。
                return NO;
            }
        }
        
        NSRange zeroRange = [textField.text rangeOfString:@"0"];
        if(zeroRange.length == 1 && zeroRange.location == 0){ //判断输入框第一个字符是否为“0”
            if(![string isEqualToString:@"0"] && ![string isEqualToString:@"."] && [textField.text length] == 1){ //当输入框只有一个字符并且字符为“0”时,再输入不为“0”或者“.”的字符时,则将此输入替换输入框的这唯一字符。
                textField.text = string;
                return NO;
            }else{
                if(pointRange.length == 0 && pointRange.location > 0){ //当输入框第一个字符为“0”时,并且没有“.”字符时,如果当此输入的字符为“0”,则视当此输入无效。
                    if([string isEqualToString:@"0"]){
                        return NO;
                    }
                }
            }
        }
        NSString *buffer;
        if ( ![scanner scanCharactersFromSet:numbers intoString:&buffer] && ([string length] != 0) )
        {
            return NO;
        }
    }
    return YES;
}

10 AF请求失败打印后代服务器具体错误详情方法

在iOS端一般网络请求都是使用AF的,有时和后台调试的时候回遇到各种请求失败,一般的请求失败会在失败中返回具体失败原因,但是也会遇到特殊情况,比如失败原因就一句简单的话,这时候后台也没法具体打印调试信息的时候,可以使用下列方法来打印出具体的后台出错代码位置和基本信息

  /*
                                              //打印服务器错误代码,
                                              
                                              NSData * data = error.userInfo[@"com.alamofire.serialization.response.error.data"];
                                              NSString * str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
                                              NSLog(@"服务器的错误原因:%@",str);
                                              
                                              */

11.获取WebView 内容高度完美方法,网上肯定看到过很多类似的方法:可是很多不是很好,总有各种缺陷:下面找到一中完美解决这个问题的方案(使用KVC)

直接上代码:

self.webView.ScrollView.scrollEnabled = NO;
//注册KVO
[self.webView.scrollView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:nil];

//添加监听
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
    if ([keyPath isEqualToString:@"contentSize"]) {
        CGFloat contentHeight = self.webView.scrollView.contentSize.height;
        // self.webView.height = contentHeight;
        self.webViewHeightContraint.constant = contentHeight; // autoLayout
    }
}
//移除监听
[webView.scrollView removeObserver:self forKeyPath:@"contentSize" context:nil];

12.获取UIWebView加载后的高度

网上有各种方法来获取webView 的内容高度,但是常常有一个问题就是WebView 过长的的时候,内容并没有显示完,这个时候通用的方法就不可行了。

下面提供一个不错的方法通过KVO 来实现获取WebView 的高度
直接上代码:

// 初始化的时候
    [self.contentWebView.scrollView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:nil];  

//添加和移除KVO 观察者


- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
    if ([keyPath isEqualToString:@"contentSize"]) {
        CGFloat contentHeight = self.contentWebView.scrollView.contentSize.height;
        self.contentViewHight.constant = contentHeight;
    }
}

- (void)dealloc{
    
    [self.contentWebView.scrollView removeObserver:self forKeyPath:@"contentSize" context:nil];

}

13. 导航返回到指定页面

我们常常会有一些需求 需要点击返回按钮的时候返回到导航栏栈中的特定页面,这时候一般用的系统的方法如下:

 [self.navigationController  popToViewController: animated:YES]

这个确实可以满足需求,但是一般的返回除了点击左上返回外,还有右滑返回,这时候就会出现滑动到一半显示的还是上个页面视图,这就存在问题了,这时候就需要换一种方式实现这个需求了,那就是在push 到下个页面的时候不要用push方法,而要用setViewControllers: 方法,这样就能解决这个问题了
具体代码如下:

vc =  ******
 NSMutableArray  *currentArr = [NSMutableArray arrayWithArray:self.navigationController.viewControllers];
   
    if (currentArr.count >= 2) {
        [currentArr replaceObjectAtIndex:currentArr.count - 1 withObject:vc];
    }
   
    [self.navigationController setViewControllers:currentArr animated:YES];

别担心这个动画效果和Push效果是一模一样的哦,真佩服乔布斯,

14 判断触摸点是否在某个视图内简单方法

啥都不用说,直接上代码

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
    CALayer *testViewLayer = self.testView.layer.presentationLayer;
    CGPoint touchPoint = [[touches anyObject] locationInView:self.view];
    if (CGRectContainsPoint(testViewLayer.frame, touchPoint)) {
        NSLog(@"触摸点在视图内");
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,397评论 0 17
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥ios动画全貌。在这里你可以看...
    每天刷两次牙阅读 8,485评论 6 30
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌。在这里你可以看...
    F麦子阅读 5,110评论 5 13
  • 昨天晚上熬夜了,我感到良心在谴责自己,于是发了个说说,意思就是以后不能在熬夜了。于是,我决定再看一篇文章就睡觉。 ...
    堇色俞阅读 310评论 6 2
  • 团队学习:对复杂问题要有深入的思考和明晰的理解。这里团队必须学会如何挖掘个人的思想潜力,以超越个人的心智。但组织中...
    小明有料阅读 652评论 0 0