'CALayer position contains NaN: [nan nan]'异常

崩溃现象

最近发现在iOS13.6系统上点击UITextField开始编辑时,会百分百复现一个崩溃现象,报错内容如下:


崩溃堆栈截图.png

主要在CGRectMake设置等中存在错误可能是除0等操作了,网上很多帖子都是让你去检查每一个UI,然而并没有从根源上解决问题,尤其是多个UITextField设置不同keyboardType需要在不同键盘之间切换时,仍然会偶现崩溃。

解决办法

附上代码GitHub链接:https://github.com/Geniune/SafeProtector
见UIView+Safe.h和UIView+Safe.m两个文件

NaN,Not a Number的缩写
判断NaN
使用下面方法:

isnan();

我的思路是使用Runtime来替换UIView对应setFrame:和setCenter:等方法,判断是否出现nan:

+ (void)load{
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{

        [self exchangeInstance:[self class] selector:@selector(setFrame:) withSwizzledSelector:@selector(safe_setFrame:)];
        [self exchangeInstance:[self class] selector:@selector(setCenter:) withSwizzledSelector:@selector(safe_setCenter:)];
    });
}

- (void)safe_setFrame:(CGRect)frame{
{
     CGRect viewFrame = frame;
    
    if(isnan(viewFrame.origin.x)){
        viewFrame.origin.x = 0;//如果为NaN,就设置为0
    }
  
    @try {
        [self safe_setFrame:viewFrame];
    } @catch (NSException *exception) {
        //exception
    } @finally {
    }
}

如果本文对你有所帮助记得点个赞哈 :)

推荐阅读更多精彩内容