美文网首页
'CALayer position contains NaN:

'CALayer position contains NaN:

作者: Geniune | 来源:发表于2020-10-28 12:02 被阅读0次

    崩溃现象

    最近发现在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 {
        }
    }
    

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

    相关文章

      网友评论

          本文标题:'CALayer position contains NaN:

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