美文网首页
OC 常用方法总结

OC 常用方法总结

作者: jiangzz | 来源:发表于2021-02-23 10:13 被阅读0次
    一、设置导航栏透明
    @property (nonatomic,assign) BOOL isAnimated;
    ///导航栏透明
    - (void)viewWillAppear:(BOOL)animated{
       [super viewWillAppear:animated];
       [self.navigationController setNavigationBarHidden:YES animated:_isAnimated];
       [self setUI];
       [self requestData];
    }
    
    - (void)viewWillDisappear:(BOOL)animated{
       [super viewWillDisappear:animated];
       if (self.navigationController.viewControllers.count > 1) {
           _isAnimated = YES;
           [self.navigationController setNavigationBarHidden:NO animated:YES];
       }else{
           _isAnimated = NO;
       }
    }
    
    - (void)viewDidLoad {
       [super viewDidLoad];
       self.view.backgroundColor = UIColor.whiteColor;
       _isAnimated = NO;  
    }
    
    二、复制到剪切板
    UIPasteboard *appPasteBoard =  [UIPasteboard generalPasteboard];
       [appPasteBoard setString:“要复制的文字”];
    
    三、获取AppDelegate
    AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    
    四、单例的多线程写法
    ------DataManager.h
    + (instancetype)shareManager
    
    @property (nonatomic, strong) NSString *NAME;
    
    ------DataManager.m
    #import "DataManager.h"
    
    @interface DataManager()<NSCopying,NSMutableCopying>
    
    @end
    
    static DataManager *manager = nil;
    
    @implementation DataManager
    
    + (instancetype)shareManager{
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            manager = [[self alloc]init];
        });
        return manager;
    }
    
    + (id)allocWithZone:(struct _NSZone *)zone{
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            manager = [super allocWithZone:zone];
        });
        return manager;
    }
    - (nonnull id)copyWithZone:(nullable NSZone *)zone {
        return manager;
    }
    
    - (nonnull id)mutableCopyWithZone:(nullable NSZone *)zone {
        return manager;
    }
    @end
    
    --------main
    导入头文件后
    
    ShareManage *manage = [ShareManage shareManager];
    manage.NAME = @"测试单例,输出名称";
    NSLog(@"------%@-------",manage.NAME)
    
    
    
    --------其他页面
    ShareManage *manage = [ShareManage shareManager];
    
    NSLog(@"------%@-------",manage.NAME)
    
    可获取NAME属性值
    
    五、倒计时
    /// 定时器
    @property(nonatomic,strong)dispatch_source_t timer;
    ///倒计时
    -(void)countDownAction{
       if (self.timer) {
              dispatch_cancel(self.timer);
              self.timer = nil;
       }
              
       self.postBut.userInteractionEnabled = NO;
        __block NSInteger count = 60;
       dispatch_queue_t queue = dispatch_get_main_queue();
       //创建一个定时器(dispatch_source_t本质上还是一个OC对象)
       self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
              
       //设置定时器的各种属性
       dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0*NSEC_PER_SEC));
       uint64_t interval = (uint64_t)(1.0*NSEC_PER_SEC);
       dispatch_source_set_timer(self.timer, start, interval, 0);
             
       //设置回调
       __weak typeof(self) weakSelf = self;
       dispatch_source_set_event_handler(self.timer, ^{
          count--;
          if (count==0) {
                dispatch_source_cancel(weakSelf.timer);
                weakSelf.timer = nil;
                [self.postBut setTitle:@"发送验证码" forState:UIControlStateNormal];
                self.postBut.userInteractionEnabled = YES;
          }else{
                [self.postBut setTitle:[NSString stringWithFormat:@"重发(%ld)",(long)count] forState:UIControlStateNormal];
          }
        });
        //启动定时器(默认是暂停)
       dispatch_resume(self.timer);
    }
    
    
    六、富文本 字符串拼接
    ///拼接-工分:
    ///range富文本
    NSString *deposit = [NSString stringWithFormat:@"%@",self.roomDic[@"deposit"]];
    _earnestLabel.text = [NSString stringWithFormat:@"定金: %@ 工分",deposit];
        
    NSRange tempRange =  [_earnestLabel.text rangeOfString:deposit];
    
    NSMutableAttributedString *attributeStr = [[NSMutableAttributedString alloc]initWithString:_earnestLabel.text];
    [attributeStr addAttribute:NSForegroundColorAttributeName value:RGB_COLOR(255, 91, 0) range:tempRange]; [attributeStr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:12] range:tempRange];
    _earnestLabel.attributedText = attributeStr;
    
    七、获取当前时间
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        formatter.dateFormat = @"yyyyMMddHHmmss";
    NSString * str = [formatter stringFromDate:[NSDate date]];
    
    八、获取指定view的截图并保存到相册
    //传入需要截取的view
    -(UIImage *)screenShotView:(UIView *)view{
     UIGraphicsBeginImageContextWithOptions(CGSizeMake(view.frame.size.width,view.frame.size.height ), NO, 0.0); //currentView 当前的view  创建一个基于位图的图形上下文并指定大小为
        [view.layer renderInContext:UIGraphicsGetCurrentContext()];//renderInContext呈现接受者及其子范围到指定的上下文
        UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();//返回一个基于当前图形上下文的图片
        UIGraphicsEndImageContext();//移除栈顶的基于当前位图的图形上下文
        UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil);//然后将该图片保存到图片图
        return viewImage;
    }
    
    九、计算文字宽度
    NSDictionary *attrs = @{NSFontAttributeName : [UIFont boldSystemFontOfSize:9]};
    CGSize size = [cell.shopType.text sizeWithAttributes:attrs];
    
    十、快速获取数组的总和,平均值,最大,最小值
    - (void)caculateArray:(NSArray *)array{
        CGFloat sum = [[array valueForKeyPath:@"@sum.floatValue"] floatValue];
        CGFloat avg = [[array valueForKeyPath:@"@avg.floatValue"] floatValue];
        CGFloat max =[[array valueForKeyPath:@"@max.floatValue"] floatValue];
        CGFloat min =[[array valueForKeyPath:@"@min.floatValue"] floatValue];
        NSLog(@"%fn%fn%fn%f",sum,avg,max,min);
    //    return [NSString stringWithFormat:@"%f",sum];
    }
    
    十一、弹出拨打电话
    1.NSMutableString *str = [[NSMutableString alloc] initWithFormat:@"telprompt://%@",phoneBumber];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:str] options:@{} completionHandler:^(BOOL success) {
                }];
    2.NSMutableString *str=[[NSMutableString alloc] initWithFormat:@"telprompt://%@",phoneBumber];
    [[UIApplication sharedApplication]openURL:[NSURL URLWithString:str] options:@{} completionHandler:nil];
    
    十二、判断手势方向
    CGPoint translation = [scrollView.panGestureRecognizer translationInView:scrollView.superview];
    if (translation.y>0) {
           
     //        NSLog(@"----------下-----------");
        
    }else if(translation.y<0){
     //        NSLog(@"----------上-----------");
    }
    
    
    ///例:
    - (void)scrollViewDidScroll:(UIScrollView *)scrollView{
        
        CGPoint translation = [self.bgScrollView.panGestureRecognizer translationInView:_bgScrollView.superview];
        if (translation.y>0) {
            
                    NSLog(@"----------下-----------");
            
        }else if(translation.y<0){
                    NSLog(@"----------上-----------");
        }
        
    }
    
    十三、字符串生成二维码保存到相册
     -(void)generatingTwoDimensionalCode {
    
        // 创建过滤器
        CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
    
        // 过滤器恢复默认
        [filter setDefaults];
    
        // 给过滤器添加数据
         NSString *string = [NSString stringWithFormat:@"%@",NET_IMAGE(self.dataDic[@"data"][@"code"])];
         NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
    
         [filter setValue:data forKeyPath:@"inputMessage"];
    
         // 获取二维码过滤器生成的二维码
         CIImage *image = [filter outputImage];// 此时的 image 是模糊的
    
         // 高清处理:将获取到的二维码添加到
         UIImage *imagex = [self createNonInterpolatedUIImageFormCIImage:image withSize:300];// withSize 大于等于视图显示的尺寸
         UIImageWriteToSavedPhotosAlbum(imagex, self, @selector(image:didFinishSavingWithError:contextInfo:), (__bridge void *)self);
     }
    
     //--生成高清二维码
     - (UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat) size {
    
         CGRect extent = CGRectIntegral(image.extent);
         CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));
    
         // 创建 bitmap
         size_t width = CGRectGetWidth(extent) * scale;
         size_t height = CGRectGetHeight(extent) * scale;
         CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();
         CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);
         CIContext *context = [CIContext contextWithOptions:nil];
         CGImageRef bitmapImage = [context createCGImage:image fromRect:extent];
         CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
         CGContextScaleCTM(bitmapRef, scale, scale);
         CGContextDrawImage(bitmapRef, extent, bitmapImage);
    
         // 保存 bitmap 到图片
         CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
         CGContextRelease(bitmapRef);
         CGImageRelease(bitmapImage);
         return [UIImage imageWithCGImage:scaledImage];
    
    
     }
    
    - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{
    
        NSLog(@"image = %@, error = %@, contextInfo = %@", image, error, contextInfo);
    
    }
    
    - (void)loadImageFinished:(UIImage *)image{
    
        UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), (__bridge void *)self);
    
    }
    
    十四、数组拼接、字符串分割
    ///数组以某个元素拼接
    [dic setObject:[imageArr componentsJoinedByString:@","] forKey:@"img"];
    ///字符串以某元素分割
    NSArray *imgArr = [NSArray array];
    imgArr = [self.postDataArr[indexPath.row][@"img"] componentsSeparatedByString:@","];
    
    十五、随机颜色
    - (UIColor *)randomColor{
        return [UIColor colorWithRed:((float)arc4random_uniform(256) / 255.0) green:((float)arc4random_uniform(256) / 255.0) blue:((float)arc4random_uniform(256) / 255.0) alpha:1.0];
    }
    
    十六、通知
    实现方法.m
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(action) name:@"JUMPTOHOME" object:nil];
    -(void)action {
      ///通知执行的方法
    }
    
    - (void)dealloc
    {
        [[NSNotificationCenter defaultCenter]removeObserver:self name:@"JUMPTOHOME" object:nil];
    }
    
    调用.m
    [[NSNotificationCenter defaultCenter]postNotificationName:@"JUMPTOHOME" object:nil];
    
    十七、修改字符串中的字符(修改相同的每个字符为另一字符)
    NSString *phoneStr = [self.phoneTF.text stringByReplacingOccurrencesOfString:@" " withString:@""];
    
    十八、延时器
    //第一种:
    [self performSelector:@selector(nextQuestion:) withObject:nil afterDelay:2.0];
    //第二种:
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        //需要调用的方法
    });
    
    //第三种:
    dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(.1/*延迟执行时间*/ * NSEC_PER_SEC));
    dispatch_after(delayTime, dispatch_get_main_queue(), ^{
        [self.textField becomeFirstResponder];
    });
    
    十九、引入WKwebView 手机适配 防止超出屏幕边界
    -(WKWebView *)webView {
        if (!_webView) {
            NSString *jScript = @"var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);";
            
            WKUserScript *wkUScript = [[WKUserScript alloc] initWithSource:jScript injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
            WKUserContentController *wkUController = [[WKUserContentController alloc] init];
            [wkUController addUserScript:wkUScript];
            WKWebViewConfiguration *wkWebConfig = [[WKWebViewConfiguration alloc] init];
            wkWebConfig.userContentController = wkUController;
            _webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:wkWebConfig];
    //        _webView.userInteractionEnabled = NO;
            _webView.navigationDelegate = self;
            _webView.scrollView.bounces = NO;
            _webView.scrollView.alwaysBounceVertical = NO;
    //        _webView.scrollView.scrollEnabled = NO;
            _webView.UIDelegate = self;
            [_webView addObserver:self forKeyPath:@"title" options:NSKeyValueObservingOptionNew context:NULL];
            [_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[self.url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]]];
            
        }
        return _webView;
    }
    
    二十、应用间的跳转
    NSURL *URL = [NSURL URLWithString:@"appB://ios.myapp.cn"];
    [[UIApplication sharedApplication] openURL:URL];
    
    二十一、手势识别

    UITapGestureRecognizer(点按)
    UILongPressGestureRecognizer(长按)
    UISwipeGestureRecognizer(轻扫)
    UIRotationGestureRecognizer(旋转)
    UIPanGestureRecognizer(拖动)
    UIPinchGestureRecognizer(捏合,用于缩放)

    • 例:长按手势
    //1.创建一个手势 并且监听
     UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPress:)];
    //最小触发 按压的时间
     longPress.minimumPressDuration = 2.0;
    //允许多大范围内 触发
     longPress.allowableMovement =  20;
    //2.添加到当前你想 操作的控件上
     [self.myImageVIew addGestureRecognizer:longPress];
    
    二十二、点击tableviewCell,collectionView 滚动到固定的session
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        
        UICollectionViewLayoutAttributes*attributes = [self.collectionView layoutAttributesForItemAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:indexPath.row]];
    
        CGRect rect = attributes.frame;
    
        [self.collectionView setContentOffset:CGPointMake(self.collectionView.frame.origin.x, rect.origin.y - 28) animated:YES];
        
    }
     注:28: session 头高度
    
    二十三、collectionView 获取当前点击的item
    SelectMultipleCategoriesCollectionViewCell * cell = (SelectMultipleCategoriesCollectionViewCell *)[self collectionView:collectionView cellForItemAtIndexPath:indexPath];
    
    二十四、NSUserDefaults存取
    [[NSUserDefaults standardUserDefaults] setObject:@"exampleObject" forKey:@"exampleKey"];//存
    [[NSUserDefaults standardUserDefaults] objectForKey:@"exampleKey"];//取
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"exampleKey"];//移除
    
    ///写入
    //1. 获取系统的偏好设置对象   
       NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    //2. 存储数据
       [defaults setObject:@"小明" forKey:@"name"];    
       [defaults setInteger:100 forKey:@"age"];    
       [defaults setBool:NO forKey:@"isTrue"];    
    //3.立即同步:  强制写入
       [defaults synchronize];
    
    ///读取
    //1.获取到偏好设置的路径    
       NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    
    //2.读取数据
       NSString *name =  [defaults objectForKey:@"name"];
       NSInteger age = [defaults integerForKey:@"age"];
       BOOL isTrue = [defaults boolForKey:@"isTrue"];
    
    二十五、tableview 滚动到指定行
    [self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:self.commendDataArr.count -1 inSection:0] animated:YES scrollPosition:UITableViewScrollPositionMiddle];
    
    二十六、TextField 限制只可输入数字
    -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
        
        NSCharacterSet *characterSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789\b"];
        string = [string stringByReplacingOccurrencesOfString:@" " withString:@""];
        
        if ([string rangeOfCharacterFromSet:[characterSet invertedSet]].location != NSNotFound) {
            return NO;
        }
    
        return YES;
    }
    
    二十七、WriteToFile
    ///写入数据
    //1.1 你需要获取路径
       NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    
    // .XXX 尾椎 只是决定 以哪中方式查看数据, 对存入的数据本身没有影响    
       NSString *fiflePath = [path stringByAppendingPathComponent:@"data.XXX"];
       
    //1.2 写数据
       NSArray *dataArray = @[@"亚洲国际舞王尼古拉斯赵四",@"小明",@"老王",@"霜霜"];       //1.3 存    //atomically 原子性的,数据安全的, 百分之九十九都是YES
       [dataArray writeToFile:fiflePath atomically:YES];
    
    ///读取数据
    //1.读取路径    
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *fiflePath = [path stringByAppendingPathComponent:@"data.XXX"];
    
     //2.取出来
    NSArray *dataArray = [NSArray arrayWithContentsOfFile:fiflePath];
    
    二十八、价格键盘只可输入数字和点
    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    {
        BOOL isHaveDian;
    
        //判断是否有小数点
        if ([textField.text containsString:@"."]) {
            isHaveDian = YES;
        }else{
            isHaveDian = NO;
        }
    
        if (string.length > 0) {
    
            //当前输入的字符
            unichar single = [string characterAtIndex:0];
            NSLog(@"single = %c",single);
    
            //不能输入.0~9以外的字符
            if (!((single >= '0' && single <= '9') || single == '.')){
                NSLog(@"您输入的格式不正确");
                return NO;
            }
    
            //只能有一个小数点
            if (isHaveDian && single == '.') {
                NSLog(@"只能输入一个小数点");
                return NO;
            }
    
            //如果第一位是.则前面加上0
            if ((textField.text.length == 0) && (single == '.')) {
                textField.text = @"0";
            }
    
            //如果第一位是0则后面必须输入.
            if ([textField.text hasPrefix:@"0"]) {
                if (textField.text.length > 1) {
                    NSString *secondStr = [textField.text substringWithRange:NSMakeRange(1, 1)];
                    if (![secondStr isEqualToString:@"."]) {
                        NSLog(@"第二个字符必须是小数点");
                        return NO;
                    }
                }else{
                    if (![string isEqualToString:@"."]) {
                        NSLog(@"第二个字符必须是小数点");
                        return NO;
                    }
                }
            }
    
            //小数点后最多能输入两位
            if (isHaveDian) {
                NSRange ran = [textField.text rangeOfString:@"."];
                //由于range.location是NSUInteger类型的,所以不能通过(range.location - ran.location) > 2来判断
                if (range.location > ran.location) {
                    if ([textField.text pathExtension].length > 1) {
                        NSLog(@"小数点后最多有两位小数");
                        return NO;
                    }
                }
            }
    
        }
    
        return YES;
    }
    

    END

    相关文章

      网友评论

          本文标题:OC 常用方法总结

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