美文网首页
ios 工作经验总结

ios 工作经验总结

作者: UILable攻城狮 | 来源:发表于2017-11-07 17:11 被阅读0次

    1 播放一张张连续的图片,例如刷新动画

    / 加入现在有三张图片分别为animate_1、animate_2、animate_3
    // 方法一
        imageView.animationImages = @[[UIImage imageNamed:@"animate_1"], [UIImage imageNamed:@"animate_2"], [UIImage imageNamed:@"animate_3"]];
    imageView.animationDuration = 1.0;
    // 方法二
        imageView.image = [UIImage animatedImageNamed:@"animate_" duration:1.0];
    // 方法二解释下,这个方法会加载animate_为前缀的,后边0-1024,也就是animate_0、animate_1一直到animate_1024
    
    

    2 tableView 使用总结

    得到当前tableView显示的 cell 数组
    NSArray *cells = [self.tableView visibleCells];
    // 判断某一行的cell是否已经显示
    CGRect cellRect = [tableView rectForRowAtIndexPath:indexPath];
    BOOL completelyVisible = CGRectContainsRect(tableView.bounds, cellRect);
    //tableView 自动滑动到某一行
     //第一种方法
    [tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
    //第二种方法
    [self.tableVieW selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionTop];
    
    
    作者:我的天空蔚蓝色
    链接:http://www.jianshu.com/p/c71052ed8f39
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

    3 让导航控制器pop回指定的控制器

    NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]];
    for (UIViewController *aViewController in allViewControllers) {
        if ([aViewController isKindOfClass:[RequiredViewController class]]) {
            [self.navigationController popToViewController:aViewController animated:NO];
        }
    }
    

    4 获取屏幕方向

    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
    
    if(orientation == 0) //Default orientation 
      //默认
    else if(orientation == UIInterfaceOrientationPortrait)
      //竖屏
    else if(orientation == UIInterfaceOrientationLandscapeLeft)
      // 左横屏
    else if(orientation == UIInterfaceOrientationLandscapeRight)
      //右横屏
    

    5 监听scrollView是否滚动到了顶部/底部

    -(void)scrollViewDidScroll: (UIScrollView*)scrollView
    {
        float scrollViewHeight = scrollView.frame.size.height;
        float scrollContentSizeHeight = scrollView.contentSize.height;
        float scrollOffset = scrollView.contentOffset.y;
    
        if (scrollOffset == 0)
        {
            // 滚动到了顶部
        }
        else if (scrollOffset + scrollViewHeight == scrollContentSizeHeight)
        {
            // 滚动到了底部
        }
    }
    

    5 MD5加密

    + (NSString *)md5:(NSString *)str
    {
        const char *concat_str = [str UTF8String];
        unsigned char result[CC_MD5_DIGEST_LENGTH];
        CC_MD5(concat_str, (unsigned int)strlen(concat_str), result);
        NSMutableString *hash = [NSMutableString string];
        for (int i =0; i <16; i++){
            [hash appendFormat:@"%02X", result[i]];
        }
        return [hash uppercaseString];
    }
    
    

    6 单个页面多个网络请求的情况,需要监听所有网络请求结束后刷新UI

    dispatch_group_t group = dispatch_group_create();
        dispatch_queue_t serialQueue = dispatch_queue_create("com.wzb.test.www", DISPATCH_QUEUE_SERIAL);
        dispatch_group_enter(group);
        dispatch_group_async(group, serialQueue, ^{
            // 网络请求一
            [WebClick getDataSuccess:^(ResponseModel *model) {
                dispatch_group_leave(group);
            } failure:^(NSString *err) {
                dispatch_group_leave(group);
            }];
        });
        dispatch_group_enter(group);
        dispatch_group_async(group, serialQueue, ^{
            // 网络请求二
            [WebClick getDataSuccess:getBigTypeRM onSuccess:^(ResponseModel *model) {
                dispatch_group_leave(group);
            }                                  failure:^(NSString *errorString) {
                dispatch_group_leave(group);
            }];
        });
        dispatch_group_enter(group);
        dispatch_group_async(group, serialQueue, ^{
            // 网络请求三
            [WebClick getDataSuccess:^{
                dispatch_group_leave(group);
            } failure:^(NSString *errorString) {
                dispatch_group_leave(group);
            }];
        });
    
        // 所有网络请求结束后会来到这个方法
        dispatch_group_notify(group, serialQueue, ^{
            dispatch_async(dispatch_get_global_queue(0, 0), ^{
                dispatch_async(dispatch_get_main_queue(), ^{
                    // 刷新UI
                });
            });
        });
    //利用线程组
    

    7 页面跳转实现翻转动画

    // modal方式(模态)
        TestViewController *vc = [[TestViewController alloc] init];
        vc.view.backgroundColor = [UIColor redColor];
        vc.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
        [self presentViewController:vc animated:YES completion:nil];
    
    // push方式
        TestViewController *vc = [[TestViewController alloc] init];
        vc.view.backgroundColor = [UIColor redColor];
        [UIView beginAnimations:@"View Flip" context:nil];
        [UIView setAnimationDuration:0.80];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
        [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.navigationController.view cache:NO];
        [self.navigationController pushViewController:vc animated:YES];
        [UIView commitAnimations];
    

    8 获取字符串中的数字

    - (NSString *)getNumberFromStr:(NSString *)str
    {
        NSCharacterSet *nonDigitCharacterSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
        return [[str componentsSeparatedByCharactersInSet:nonDigitCharacterSet] componentsJoinedByString:@""];
     NSLog(@"%@", [self getNumberFromStr:@"12a0b05c1d2e3f4fda8fa8fad9fsad23"]);
     // 12005123488923
    }
    

    9 某个界面多个事件同时响应引起的问题, (比如点击过快, push 了两个页面)

    
    // 一个一个设置太麻烦了,可以全局设置
    [[UIView appearance] setExclusiveTouch:YES];
    
    // 或者只设置button
    [[UIButton appearance] setExclusiveTouch:YES];
    

    10 禁止手机睡眠

    [UIApplication sharedApplication].idleTimerDisabled = YES;
    

    11获取app缓存大小

    - (CGFloat)getCachSize {
    
        NSUInteger imageCacheSize = [[SDImageCache sharedImageCache] getSize];
        //获取自定义缓存大小
        //用枚举器遍历 一个文件夹的内容
        //1.获取 文件夹枚举器
        NSString *myCachePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches"];
        NSDirectoryEnumerator *enumerator = [[NSFileManager defaultManager] enumeratorAtPath:myCachePath];
        __block NSUInteger count = 0;
        //2.遍历
        for (NSString *fileName in enumerator) {
            NSString *path = [myCachePath stringByAppendingPathComponent:fileName];
            NSDictionary *fileDict = [[NSFileManager defaultManager] attributesOfItemAtPath:path error:nil];
            count += fileDict.fileSize;//自定义所有缓存大小
        }
        // 得到是字节  转化为M
        CGFloat totalSize = ((CGFloat)imageCacheSize+count)/1024/1024;
        return totalSize;
    }
    

    12 清理app缓存

    - (void)handleClearView {
        //删除两部分
        //1.删除 sd 图片缓存
        //先清除内存中的图片缓存
        [[SDImageCache sharedImageCache] clearMemory];
        //清除磁盘的缓存
        [[SDImageCache sharedImageCache] clearDisk];
        //2.删除自己缓存
        NSString *myCachePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches"];
        [[NSFileManager defaultManager] removeItemAtPath:myCachePath error:nil];
    }
    

    13 AFNetworking监听网络状态

       AFNetworkReachabilityManager *mgr = [AFNetworkReachabilityManager sharedManager];
        [mgr setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
            switch (status) {
                case AFNetworkReachabilityStatusUnknown:
                    break;
                case AFNetworkReachabilityStatusNotReachable: {
                    [SVProgressHUD showInfoWithStatus:@"当前设备无网络"];
                }
                    break;
                case AFNetworkReachabilityStatusReachableViaWiFi:
                    [SVProgressHUD showInfoWithStatus:@"当前Wi-Fi网络"];
                    break;
                case AFNetworkReachabilityStatusReachableViaWWAN:
                    [SVProgressHUD showInfoWithStatus:@"当前蜂窝移动网络"];
                    break;
                default:
                    break;
            }
        }];
        
    

    14 获取一个视频的第一帧图片

     NSURL *url = [NSURL URLWithString:filepath];
        AVURLAsset *asset1 = [[AVURLAsset alloc] initWithURL:url options:nil];
        AVAssetImageGenerator *generate1 = [[AVAssetImageGenerator alloc] initWithAsset:asset1];
        generate1.appliesPreferredTrackTransform = YES;
        NSError *err = NULL;
        CMTime time = CMTimeMake(1, 2);
        CGImageRef oneRef = [generate1 copyCGImageAtTime:time actualTime:NULL error:&err];
        UIImage *one = [[UIImage alloc] initWithCGImage:oneRef];
    
        return one;
    

    15 获取视频的时长

    + (NSInteger)getVideoTimeByUrlString:(NSString *)urlString {
        NSURL *videoUrl = [NSURL URLWithString:urlString];
        AVURLAsset *avUrl = [AVURLAsset assetWithURL:videoUrl];
        CMTime time = [avUrl duration];
        int seconds = ceil(time.value/time.timescale);
        return seconds;
    }
    

    16 删除NSUserDefaults所有记录

    NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
     [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain]; 
    

    17 为UIView某个角添加圆角

    // 左上角和右下角添加圆角
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:(UIRectCornerTopLeft | UIRectCornerBottomRight) cornerRadii:CGSizeMake(20, 20)];
        CAShapeLayer *maskLayer = [CAShapeLayer layer];
        maskLayer.frame = view.bounds;
        maskLayer.path = maskPath.CGPath;
        view.layer.mask = maskLayer;
    

    18 将一个view放置在其兄弟视图的最上面

    [parentView bringSubviewToFront:yourView]
    // 将一个view放置在其兄弟视图的最下面
    [parentView sendSubviewToBack:yourView]
    

    19 让手机震动一下

      导入框架
    #import <AudioToolbox/AudioToolbox.h>
    AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
    或者
    AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
    

    20 在非ViewController的地方弹出UIAlertController对话框

    //  最好抽成一个分类
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Title" message:@"message" preferredStyle:UIAlertControllerStyleAlert];
    //...
    id rootViewController = [UIApplication sharedApplication].delegate.window.rootViewController;
    if([rootViewController isKindOfClass:[UINavigationController class]])
    {
        rootViewController = ((UINavigationController *)rootViewController).viewControllers.firstObject;
    }
    if([rootViewController isKindOfClass:[UITabBarController class]])
    {
        rootViewController = ((UITabBarController *)rootViewController).selectedViewController;
    }
    [rootViewController presentViewController:alertController animated:YES completion:nil];
    

    21 在状态栏增加网络请求的菊花,类似safari加载网页的时候状态栏菊花

    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
    

    22 将一个image保存在相册中

    import <Photos/Photos.h>
    [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
            PHAssetChangeRequest *changeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image];
            changeRequest.creationDate          = [NSDate date];
        } completionHandler:^(BOOL success, NSError *error) {
            if (success) {
                NSLog(@"successfully saved");
            }
            else {
                NSLog(@"error saving to photos: %@", error);
            }
        }];
    

    相关文章

      网友评论

          本文标题:ios 工作经验总结

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