美文网首页
项目中的小知识点(持续更新)

项目中的小知识点(持续更新)

作者: 哈哈大p孩 | 来源:发表于2016-12-18 14:18 被阅读57次

    1.改变字符串中某几个字的颜色
    这是富文本,如下:

    NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:@"123456789"];
    [str addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0,1)];
    label.attributedText = str; 
    

    2.关于dataWithContentsOfURL请求经常返回data时空,用下面这种方法可以基本解决问题,当然偶尔还有可能出现。。。
    data = [NSURLConnection sendSynchronousRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:_lunboUrlArray[i]]] returningResponse:NULL error:nil];

    3.用MJRefresh刷新返回崩溃,多半是没有在dealloc方法里free,如果你free了,多半是你不止创建了一次tableview,你自己找找,看是不是在一个地方重复创建了tableview。

    4.dictionaryWithObjectsAndKeys的坑
    我们在初始化字典时候,经常会用到dictionaryWithObjectsAndKeys,然而,这个方法有个坑,就是当元素中有个value是空的时候,后面的元素统一置为空了,而且还不会报错~不会报错!!
    解决方法:用setValue forkey ,注意value为字符串。
    当然了setObject forkey也可以,但是为空时候会报错(有提示的),需要判断是否是空,所以还是用前者吧。

    5.touchesBegan: withEvent: / touchesMoved: withEvent: / touchesEnded: withEvent: 等只能被UIView捕获(如有问题请指出对请指出,路过的大牛请勿喷),当我们创建
    UIScrollView 或 UIImageView 时,当点击时UIScrollView 或 UIImageView 会截获touch事件,导致touchesBegan: withEvent:/touchesMoved: withEvent:/touchesEnded: withEvent: 等方法执行。解决办法:当UIScrollView 或 UIImageView 截获touch事件后,让其传递下去即可(就是传递给其父视图UIView)

    可以通过写UIScrollView 或 UIImageView 的category 重写touchesBegan: withEvent: / touchesMoved: withEvent: / touchesEnded: withEvent: 等来实现
    在.m中实现如下方法

    - (void)touchesBegan:(NSSet<UITouch *> *)**touches** withEvent:(UIEvent *)event{ // 选其一即可 [super touchesBegan:**touches** withEvent:event];// [[self nextResponder] touchesBegan:**touches** withEvent:event];}
    

    6.引用第三方文件的时候,如果有.mm文件的,一定要注意,在other linker flags 里面写-ObjC(被坑惨了)

    7.iOS中当有导航栏的情况下,tableView设置起始点为0,0,是会自动默认在导航栏下面开始,如果不要这种默认效果,我们只需要在viewdidload中self.automaticallyAdjustsScrollViewInsets = NO;即可。具体的原因应该是tableView有headview时候会默认的。这个问题我在解决MJRefresh下拉刷新时候碰到的bug,这样可以修复导致弹不上去。

    8.iOS中文件下载
    AF3.0 中 NSURLSessionDownloadTask,

    NSURLSessionDownloadTask *_downloadTask;
    
    NSURL *URL = [NSURL URLWithString:@"http://pic6.nipic.com/20100330/4592428_113348097000_2.jpg"];
        
        NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
        
        //AFN3.0+基于封住URLSession的句柄
        AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
        
        //请求
        NSURLRequest *request = [NSURLRequest requestWithURL:URL];
        
        //下载Task操作
        _downloadTask = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
            
            // @property int64_t totalUnitCount;  需要下载文件的总大小
            // @property int64_t completedUnitCount; 当前已经下载的大小
            
            // 给Progress添加监听 KVO
            NSLog(@"%f",1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount);
            // 回到主队列刷新UI
            dispatch_async(dispatch_get_main_queue(), ^{
                self.progressView.progress = 1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount;
                _titlelabel.text = [NSString stringWithFormat:@"当前进度为:%.2f%%",(1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount) * 100];
            });
            
        } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
            
            //- block的返回值, 要求返回一个URL, 返回的这个URL就是文件的位置的路径
            
            NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
            NSString *path = [cachesPath stringByAppendingPathComponent:response.suggestedFilename];
            return [NSURL fileURLWithPath:path];
            
        } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
            // filePath就是你下载文件的位置,你可以解压,也可以直接拿来使用
            
            NSString *imgFilePath = [filePath path];// 将NSURL转成NSString
    //        UIImage *img = [UIImage imageWithContentsOfFile:imgFilePath];
            NSLog(@"img == %@", imgFilePath);
            if (imgFilePath) {
                [self cancelDownload];
                _webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 64, MAIN_SCREEN_WIDTH, MAIN_SCREEN_HEIGHT - 44 - 64)];
                [_webView setUserInteractionEnabled:YES];//是否支持交互
                //[webView setDelegate:self];
                _webView.delegate=self;
                [_webView setOpaque:NO];//opaque是不透明的意思
                [_webView setScalesPageToFit:YES];//自动缩放以适应屏幕
                [self.view addSubview:_webView];
                NSURL *url = [NSURL fileURLWithPath:imgFilePath];
                NSURLRequest *request = [NSURLRequest requestWithURL:url];
                [_webView loadRequest:request];
            }
        }];
        [_downloadTask resume];
    

    取消下载

    [_downloadTask cancel];
        _downloadTask = nil;
    

    9.获取元素在数组中的位置

    [myArray indexOfObject:num]
    

    10.关于引用c文件时候的错误,最方法的做法是将.c文件修改为.m。具体参考http://www.jianshu.com/p/66eeefdbc246

    11.利用正则表达式来解决字符串替换一个范围内的内容

        NSRegularExpression *regExp = [[NSRegularExpression alloc] initWithPattern:@"[0-9A-Z]."
                                                                           options:NSRegularExpressionCaseInsensitive
                                                                             error:nil];
        NSString *aaa = [regExp stringByReplacingMatchesInString:model.accountNum
                                                     options:NSMatchingReportProgress
                                                       range:NSMakeRange(0, model.accountNum.length - 3)
                                                withTemplate:@"**"];
    

    12.字符串前空格

    if (_nameTF.text.trim.length == 0) {
            [Tool HUDShowAddedTo:self.view withTitle:@"收件人姓名开头不能输入空格" delay:1.5];
            return;
        }
    

    13.只让输入字母和数字的键盘

    UIKeyboardTypeASCIICapable
    

    14.textfield中禁止输出空格

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
        if (textField == _pinpaiTF) {
            NSString *tem = [[string componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]componentsJoinedByString:@""];
            if (![string isEqualToString:tem]) {
                return NO;
            }
        }
        return YES;
    }
    

    15.设置uitextfield为圆角不透明

    textFiled1.borderStyle=UITextBorderStyleRoundedRect
    

    16.判断是否是真机还是模拟器

    TARGET_IPHONE_SIMULATOR
    TARGET_OS_IPHONE
    

    17.获取设备名字

    [[UIDevice currentDevice] name];
    

    18获取设备上的信息,包括创建的唯一标识

    这个作者写的挺好的,我也试过了可以的,http://www.jianshu.com/p/a7018a6d107b

    19.NSData转字符串,为空,是因为encoding不对,里面的内容应该不是汉字,用如下方法

    NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding (kCFStringEncodingGB_18030_2000); 
    NSString *rawString=[[NSString alloc]initWithData:inData encoding:enc]; 
    

    20.二维码扫描

    下面的链接是github地址,写的挺好的,原生的,view的背景可换成黑色,就不会白色一闪了。
    [https://github.com/liutongchao/LCQRCodeUtil]

    21.图片的裁剪

    - (UIImage*)imageWithImage:(UIImage*)image scaledToSize: (CGSize)newSize
    {
        //下面方法,第一个参数表示区域大小。第二个参数表示是否是非透明的。如果需要显示半透明效果,需要传NO,否则传YES。第三个参数就是屏幕密度了
        UIGraphicsBeginImageContextWithOptions(newSize, NO, [UIScreen mainScreen].scale);
    
        [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
    
        UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();
    
        UIGraphicsEndImageContext();
    
         return scaledImage;   //返回的就是已经改变的图片
     }
    

    22.获取当前时区,北京时间

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
        [formatter setDateFormat : @"yyyy.MM.dd"];
        NSDate *dateTimeOne = [formatter dateFromString:_timeStringOne];
    

    23.强行禁止侧滑(说多了都是泪)

    id traget = self.navigationController.interactivePopGestureRecognizer.delegate;
    UIPanGestureRecognizer * pan = [[UIPanGestureRecognizer alloc]initWithTarget:traget action:nil];
    [self.view addGestureRecognizer:pan];
    
    直接将代码拷贝到viewDidLoad总就行了
    

    24 将label中的某段话的颜色改变

     telLabel.text = @"如有疑问请联系客服 12345677";
        NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:telLabel.text];
        [str addAttribute:NSForegroundColorAttributeName value:[UIColor blackColor] range:NSMakeRange(0,9)];
        telLabel.attributedText = str;
    

    25.修改button中部分字体颜色

    NSString*str =@"已有账号,去登录";
        NSMutableAttributedString* attributedString1 = [[NSMutableAttributedString alloc]initWithString:str];
        [attributedString1 addAttribute:NSForegroundColorAttributeName value:BSColor(25, 130, 210, 1.0)range:NSMakeRange(0,5)];
        [registerBtn setAttributedTitle:attributedString1 forState:UIControlStateNormal];
        [registerBtn sizeToFit];
    

    26 Xcode没有提示

    1.找到 这个 DerivedData 文件夹 删除 (路径: ~/Library/Developer/Xcode/DerivedData)
    2.删除这个 com.apple.dt.Xcode 文件 (路径: ~/Library/Caches/com.apple.dt.Xcode)
    3.重启xcode即可

    27.xcode中pch的相对路径的设置

    有时候我们本地复制一个工程,作为版本记录,他的pch还是指向原来工程的路径,这个时候,我们修改一下pch的路径,$(SRCROOT)/工程名称/文件夹/pch

    28.textfield的代理方法

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    

    获取textfield的值

    NSMutableString *textString = [textField.text mutableCopy];
      [textString replaceCharactersInRange:range withString:string];
    

    29.tableView加了个footerview,滑不到底部的问题

    _tableView.contentInset = UIEdgeInsetsMake(0, 0, 67, 0);
    

    设置一下上面的代码即可

    30.数组倒叙

    NSMutableArray *array = [NSMutableArray arrayWithObjects:@"1",@"2",@"3",nil];  
    //2.倒序的数组  
    NSArray* reversedArray = [[array reverseObjectEnumerator] allObjects];  
    

    31 启动页封装比较好的

    github地址:https://github.com/CoderZhuXH/XHLaunchAd

    32.自定义相机功能,底层的一些东西,看下面两个文章

    https://www.2cto.com/kf/201409/335951.html 还有 https://www.cnblogs.com/carlos-mm/p/6524604.html,前者是摄像头反转的问题,后者是相机上加自定义的框,裁剪。

    33.禁止侧滑

    id traget = self.navigationController.interactivePopGestureRecognizer.delegate;
        UIPanGestureRecognizer * pan = [[UIPanGestureRecognizer alloc]initWithTarget:traget action:nil];
        [self.view addGestureRecognizer:pan];
    

    相关文章

      网友评论

          本文标题:项目中的小知识点(持续更新)

          本文链接:https://www.haomeiwen.com/subject/eoflpttx.html