记DZNEmpetyDataSet 使用中遇到的坑
2018-07-05 本文已影响0人
魏小庄
最近在项目中引入了一个第三方的展示空视图的一个库, DZNEmpetyDataSet 这个库是为
scrollView
写的一个扩展,可以很方便的设置空视图。但是在使用过程中还是遇到了些坑,
- 关于自定义视图问题。我们都知道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
并没有做自身的约束,发现这点后,添加内部子控件约束,限制父视图的宽高。果然就可以显示了。。
- 这个问题应该来说不属于
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之后,苹果爸爸貌似又修复了这个问题。查看了下官方文档也没发现什么说明的。只在网上看到了这句话。
真的是人生处处都是坑啊,一不小心就栽个狗吃屎。。搬砖不易,且行且珍惜。