美文网首页
记DZNEmpetyDataSet 使用中遇到的坑

记DZNEmpetyDataSet 使用中遇到的坑

作者: 魏小庄 | 来源:发表于2018-07-05 22:36 被阅读0次

    最近在项目中引入了一个第三方的展示空视图的一个库, DZNEmpetyDataSet 这个库是为scrollView写的一个扩展,可以很方便的设置空视图。但是在使用过程中还是遇到了些坑,

    1. 关于自定义视图问题。我们都知道DZNEmpetyDataSet 提供了很方便的代理设置自定义的文字和图标,但是如果需求更复杂时,可以通过自定义一个view来展示。这里如果直接自定义一个View是无法展示的。
      当时也是懵逼了,进到官方说明也是只有。
    - (UIView *)customViewForEmptyDataSet:(UIScrollView *)scrollView
    {
        UIActivityIndicatorView *activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
        [activityView startAnimating];
        return activityView;
    }
    

    感觉自己没有使用错误啊,copy官方这段代码。。哎,可以展示菊花。但是return我自定义的View怎么是空白的。郁闷ing..
    查看源码,发现内部是使用AutoLayout 来做的约束布局。自定义的View内部的布局是:

     // If applicable, set the custom view's constraints
        if (_customView) {
            [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[customView]|" options:0 metrics:nil views:@{@"customView":_customView}]];
            [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[customView]|" options:0 metrics:nil views:@{@"customView":_customView}]];
        }
        else {
    

    猜测有可能父视图的frame ,是根据子视图约束的,当前我返回的customView并没有做自身的约束,发现这点后,添加内部子控件约束,限制父视图的宽高。果然就可以显示了。。

    1. 这个问题应该来说不属于DZNEmpetyDataSet但是是在使用的时候发现,所以也就放在这里说一下。
      我们都知道在使用DZNEmpetyDataSet 如果想展示提示图标只需要实现这个代理方法返回一个UIImage对象就可以了。
    // 设置图片
    - (UIImage *) imageForEmptyDataSet:(UIScrollView *)scrollView {
        return [UIImage imageNamed:@"icon_Nonetwork"];
    }
    

    但是在实际使用中,我们有些页面是不需要展示图标的。所以我这里改成了这样。

    // 设置图片
    - (UIImage *) imageForEmptyDataSet:(UIScrollView *)scrollView {
        if (!self.viewModel.errorMessage) return [UIImage new];
        return [UIImage imageNamed:@"icon_Nonetwork"];
    }
    

    看着貌似没有什么问题吧。
    但是,在项目上线之后,发现忽然增加了很多的线上崩溃,都是定位在这里,都是坏内存访问。

       view.verticalSpace = [self dzn_verticalSpace];
                
                // Configure Image
                if (image) {
                    if ([image respondsToSelector:@selector(imageWithRenderingMode:)]) {
                        view.imageView.image = [image imageWithRenderingMode:renderingMode];
                        view.imageView.tintColor = imageTintColor;
                    }
                    else {
                        // iOS 6 fallback: insert code to convert imaged if needed
                        view.imageView.image = image;
                    }
                }
    

    又是一阵懵逼,怎么可能啊,,,什么情况。
    经过层层的排查,最后定位到是外部 返回[UIImage new]这个方法造成的。但是在我们测试时并没有崩溃啊,最后发现,在ios 11.3 -- 11.4 是没有问题的,但是11.0 之后的老的系统,如果是通过[UIImage new] 这个方法创建的image对象,是不能调用imageWithRenderingMode 这个方法的。但是在11.3之后,苹果爸爸貌似又修复了这个问题。查看了下官方文档也没发现什么说明的。只在网上看到了这句话。

    QQ20180705-222809@2x.png

    真的是人生处处都是坑啊,一不小心就栽个狗吃屎。。搬砖不易,且行且珍惜。

    相关文章

      网友评论

          本文标题:记DZNEmpetyDataSet 使用中遇到的坑

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