美文网首页iOS
iOS 很实在的干货

iOS 很实在的干货

作者: iOS_July | 来源:发表于2018-11-29 14:43 被阅读55次

算前言吧:
不定期更新内容enmmmmm.....

站在巨人的肩膀上面向搜索引擎开发.jpg

一、 UIView使用self.navigationController进行跳转

经常会有各种嵌套,比如 table的cell中嵌套collection,需要点击collection的cell进行跳转
此时在table的cell中,已经无法使用self.navigationController了,因为
NS_CLASS_AVAILABLE_IOS(2_z0) @interface UINavigationController : UIViewController
持有navigationController的也需要是UIViewController的对象。
这种类似的情况下,可以给UIview写一个扩展:

  • .h :
- (UIViewController*)viewController;
- (UINavigationController *)navigationController;
  • .m :
- (UIViewController*)viewController {
    for (UIView* next = [self superview]; next; next = next.superview)
    {
        UIResponder* nextResponder = [next nextResponder];
        if ([nextResponder isKindOfClass:[UIViewController class]])
        {
            return (UIViewController*)nextResponder;
        }
    }
    return nil;
}
- (UINavigationController *)navigationController{
    UIViewController *viewController = [self viewController];
    if (viewController) {
        if (viewController.navigationController) {
            return viewController.navigationController;
        }
    }
    return nil;
}
  • 使用:导入头文件,👌了。只要是UIview的儿子,都可以使用self.navigationController进行跳转了。

不华丽的分割线


二、 清除图片缓存[方式之一]

新建一个继承NSObject的类(此处以 JHCleanCaches 为栗子)

  • .h :
/// 1.计算单个文件大小
+ (float)fileSizeAtPath:(NSString *)path;

/// 2.计算文件夹大小(要利用上面的1提供的方法)
+ (float)folderSizeAtPath:(NSString *)path;

/// 3.清除缓存
+ (void)clearCache:(NSString *)path;

  • .m :
// 1.计算单个文件大小
+ (float)fileSizeAtPath:(NSString *)path {
    NSFileManager *fileManager=[NSFileManager defaultManager];
    if([fileManager fileExistsAtPath:path]){
        long long size=[fileManager attributesOfItemAtPath:path error:nil].fileSize;
        return size/1024.0/1024.0;
    }
    return 0;
}

// 2.计算文件夹大小(要利用上面的1提供的方法)
+ (float)folderSizeAtPath:(NSString *)path {
    NSFileManager *fileManager=[NSFileManager defaultManager];
    float folderSize = 0.0;
    if ([fileManager fileExistsAtPath:path]) {
        NSArray *childerFiles=[fileManager subpathsAtPath:path];
        for (NSString *fileName in childerFiles) {
            NSString *absolutePath=[path stringByAppendingPathComponent:fileName];
            folderSize += [self fileSizeAtPath:absolutePath];
        }
        // SDWebImage框架自身计算缓存的实现
        folderSize+=[[SDImageCache sharedImageCache] getSize]/1024.0/1024.0;
        return folderSize;
    }
    return 0;
}

// 3.清除缓存
+ (void)clearCache:(NSString *)path {
    NSFileManager *fileManager=[NSFileManager defaultManager];
    if ([fileManager fileExistsAtPath:path]) {
        NSArray *childerFiles=[fileManager subpathsAtPath:path];
        for (NSString *fileName in childerFiles) {
            //如有需要,加入条件,过滤掉不想删除的文件
            NSString *absolutePath=[path stringByAppendingPathComponent:fileName];
            [fileManager removeItemAtPath:absolutePath error:nil];
        }
    }
    [[SDImageCache sharedImageCache] cleanDisk];
}
  • 使用:
- (void)cleanCaches{
    // 1.计算缓存大小
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSString *cachesDir = [paths objectAtIndex:0];
    float size = [JHCleanCaches folderSizeAtPath:cachesDir];
    
    [self showHint:[NSString stringWithFormat:@"已清理%.2lfM缓存", size]];
    // 清理缓存
    [JHCleanCaches clearCache:cachesDir];
}

不华丽的分割线


三、 Xcode自带动态分析工具[内存泄露,通过Call Tree -- 隐藏系统方法,来查看代码哪里出了问题]

  • 1、Xcode --> Open Developer Tool --> Instruments --> Leak[快捷键-Command+I]
  • 2、对应描述


    des
  • 3、具体用法(最好使用真机进行测试)
* 自行琢磨
* 百度

不华丽的分割线


四、 安利一个图片选择器,支持多选,仿微信TZImagePickerController


不华丽的分割线


五、cell的重用机制,导致的一些遗留问题

重用机制是用来减少过大的内存使用, 但在很多时候, 我们会自定义cell,这时就会出现一些我们不愿意看到的现象

  • 原代码(出现问题):
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    CourierEvaluateCell  *cell = [tableView dequeueReusableCellWithIdentifier:[CourierEvaluateCell reuseIdentifier]];
    if (!cell) {
        cell = [[CourierEvaluateCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[CourierEvaluateCell reuseIdentifier]];
        
    }
    
    if (self.dataArr.count > indexPath.row) {
        cell.model = self.dataArr[indexPath.row];
    }
    return cell;
}
  • 防止重用的代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
//    CourierEvaluateCell  *cell = [tableView dequeueReusableCellWithIdentifier:[CourierEvaluateCell reuseIdentifier]];
     CourierEvaluateCell *cell = [tableView cellForRowAtIndexPath:indexPath];//防止重用
    if (!cell) {
        cell = [[CourierEvaluateCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[CourierEvaluateCell reuseIdentifier]];
        
    }
    
    if (self.dataArr.count > indexPath.row) {
        cell.model = self.dataArr[indexPath.row];
    }
    return cell;
}
  • CourierEvaluateCell *cell = [tableView cellForRowAtIndexPath:indexPath];根据indexPath准确地取出一行,而不是从cell重用队列中取出。

不华丽的分割线


六、View部分圆角问题的解答

  • 先看效果:


    部分圆角.gif

由于项目需求,需要实现部分圆角,开始没想那么多,直接在GitHub上找了一个SKArchCutter,圆角效果是能出来的,但是我发现我btn的背景颜色存在问题,这下就只有自己再研究下了。

  • 实现代码:
/**
 按钮的圆角设置

 @param view view类控件
 @param rectCorner UIRectCorner要切除的圆角
 @param borderColor 边框颜色
 @param borderWidth 边框宽度
 @param viewColor view类控件颜色
 */
- (void)setupRoundedCornersWithView:(UIView *)view cutCorners:(UIRectCorner)rectCorner borderColor:(UIColor *)borderColor borderWidth:(CGFloat)borderWidth viewColor:(UIColor *)viewColor{

    CAShapeLayer *mask=[CAShapeLayer layer];
    UIBezierPath * path= [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:rectCorner cornerRadii:CGSizeMake(15,10)];
    mask.path=path.CGPath;//从贝塞尔曲线获取到形状
    mask.frame=view.bounds;


    CAShapeLayer *borderLayer=[CAShapeLayer layer];
    borderLayer.path=path.CGPath;
    borderLayer.fillColor = [UIColor clearColor].CGColor;
    borderLayer.strokeColor = borderColor.CGColor;
    borderLayer.lineWidth = borderWidth;
    borderLayer.frame = view.bounds;
    view.layer.mask = mask;
    [view.layer addSublayer:borderLayer];
    
    
}
  • 至于怎么使用,相信大家一看也就明白了,写得比较片面,有更好的方法也请指正。

不华丽的分割线


七、UITextField中文字数限制的隐藏bug~~~

今儿个发现个奇怪的bug:在我输入用户名时,发现我全拼的名字拼音打不出来.....
当时就纳闷了,我限制的是字符长度,咋我拼音也......

  • 快乐上网后,才发现这是一个隐藏bug~~

  • 解决方法很多,发现了 梦里挑灯看键 的这片博文,简单粗暴,就在这里记录一下[我只是想整理一下~~没别的意思]

  • 给输入框绑定一个方法

[_nameTextField addTarget:self action:@selector(editChange:) forControlEvents:UIControlEventEditingChanged];
  • 方法内部
- (void)editChange:(UITextField*)textfield {
    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)
            {
                NSRange rangeIndex = [toBeString rangeOfComposedCharacterSequenceAtIndex:kMaxLength];
                if (rangeIndex.length == 1)
                {
                    textfield.text = [toBeString substringToIndex:kMaxLength];
                }
                else
                {
                    NSRange rangeRange = [toBeString rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, kMaxLength)];
                    textfield.text = [toBeString substringWithRange:rangeRange];
                }
            }
        }
    }
    // 中文输入法以外的直接对其统计限制即可,不考虑其他语种情况
    else{
        if (toBeString.length > kMaxLength)
        {
            NSRange rangeIndex = [toBeString rangeOfComposedCharacterSequenceAtIndex:kMaxLength];
            if (rangeIndex.length == 1)
            {
                textfield.text = [toBeString substringToIndex:kMaxLength];
            }
            else
            {
                NSRange rangeRange = [toBeString rangeOfComposedCharacterSequencesForRange:NSMakeRange(0,kMaxLength)];
                textfield.text = [toBeString substringWithRange:rangeRange];
            }
        }
    }
    
}

不华丽的分割线


八、tableView刷新时,出现乱跳等错乱现象

  • 在iOS 11 Self-Sizing自动打开后,contentSize和contentOffset都可能发生改变。可以通过以下方式禁用:
* 在初始化tableView的时候加上

if (@available(iOS 11.0, *)){
            self.tableView.estimatedRowHeight = 0;
            self.tableView.estimatedSectionHeaderHeight = 0;
            self.tableView.estimatedSectionFooterHeight = 0;
        }

亲测有效~~


不华丽的分割线


九、简单的定时刷新

  • 第一步@property (nonatomic, strong) NSTimer * timer;
  • 第二步:
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(post_data) userInfo:nil repeats:YES];
_timer = timer;
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
  • 第三步:
-(void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    [_timer invalidate];
    _timer = nil;
}

不华丽的分割线


十、安利一个 抽屉效果 MMDrawerController


不华丽的分割线


十一、按钮简单富文本

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:@"登录即代表你同意“XXXX使用条款”"];
    NSRange range1 = NSMakeRange(0, attributedString.length - 10);
    NSRange range2 = NSMakeRange(attributedString.length - 10, 10);
    [attributedString addAttributes:@{NSFontAttributeName:[UIFont fontWithName:ThemeFontFamilyBlod size:16.0],NSForegroundColorAttributeName:ThemeFontColor2} range:range1];
    [attributedString addAttributes:@{NSFontAttributeName:[UIFont fontWithName:ThemeFontFamilyBlod size:16.0],NSForegroundColorAttributeName:[UIColor redColor]} range:range2];
    [agreedBtn setAttributedTitle:attributedString forState:UIControlStateNormal];
    [self.otherLoginView addSubview:agreedBtn];

不华丽的分割线


十二、iOS 11.0后的tableView、scrollView顶部留白处理

    //self.automaticallyAdjustsScrollViewInsets = NO;//失效
    if (@available(iOS 11.0, *)) {
        self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
    } else {
        
        self.automaticallyAdjustsScrollViewInsets = NO;
    }
    

相关文章

  • iOS 很实在的干货

    算前言吧:不定期更新内容enmmmmm.....站在巨人的肩膀上面向搜索引擎开发.jpg 一、 UIView使用s...

  • 很实在的梦

    昨晚上和雅雅去“食在80”吃饭,心情没有多好却也不坏。 走进店子里时,又碰见几个打麻将的熟人,被他们一招呼就坐在一...

  • 最实在的致富干货

    这是我在简书上发的第一篇文章,想了很久决定先发一篇以财富为主题的对话,可能感兴趣的人会多一些。 这段对话记录了一个...

  • [稀土掘金日报] iOS不能错过的干货合集

    今天给大家放送iOS开发内容,如 icon 图标 设置 SSL 等一系列干货。 直接上iOS类干货,下划 Com...

  • 我到底要不要给老板打杂?-这样思考就对了|职场7

    昨天我写了一篇实用干货文《咪蒙老板:我能力这么强你却让我收外卖?|有干货》。虽然标题党,但是内容很实在--教你们如...

  • 阅读清单笔记📒

    【超效率手册】10条阅读清单 【标题】:做到才是得到 【字数】:845 【正文】: 本书很实在的99点干货文,我们...

  • iOS - 关于ATS、使HTTP域名(非https)合法的解决

    关于 iOS 10 中 ATS 的问题 iOS适配HTTPS——info.plist配置干货 iOS 9中默认非H...

  • 我的爱很实在

    你若需要一颗小草 我会随意拔起 我的爱很实在 你若需要一朵花 你若需要一片叶 它们会变 一种持久 几种多彩 我使出...

  • 理科喜欢带干货的新闻

    说实在的,作为一个理工男,喜欢的是干货,虽然枯燥,但有实在的知识内容。 我最喜欢的带干货的新闻是这样...

  • 句子很美,很实在

    有点懒,喜欢赖床。不太听话,喜欢捣蛋。 在陌生人面前会很安静,很冷漠,在熟人面前却很放肆,很霸道,并喜欢没形象的哈...

网友评论

    本文标题:iOS 很实在的干货

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