最近在項目中引入了一個第三方的展示空視圖的一個庫撰糠, DZNEmpetyDataSet 這個庫是為
scrollView
寫的一個擴展色查,可以很方便的設(shè)置空視圖评也。但是在使用過程中還是遇到了些坑误算,
- 關(guān)于自定義視圖問題必孤。我們都知道DZNEmpetyDataSet 提供了很方便的代理設(shè)置自定義的文字和圖標持隧,但是如果需求更復雜時晒来,可以通過自定義一個
view
來展示鹿响。這里如果直接自定義一個View
是無法展示的肛度。
當時也是懵逼了傻唾,進到官方說明也是只有。
- (UIView *)customViewForEmptyDataSet:(UIScrollView *)scrollView
{
UIActivityIndicatorView *activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[activityView startAnimating];
return activityView;
}
感覺自己沒有使用錯誤啊承耿,copy官方這段代碼冠骄。。哎加袋,可以展示菊花凛辣。但是return
我自定義的View
怎么是空白的。郁悶ing..
查看源碼锁荔,發(fā)現(xiàn)內(nèi)部是使用AutoLayout
來做的約束布局蟀给。自定義的View內(nèi)部的布局是:
// 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 蝙砌,是根據(jù)子視圖約束的,當前我返回的customView
并沒有做自身的約束跋理,發(fā)現(xiàn)這點后择克,添加內(nèi)部子控件約束,限制父視圖的寬高前普。果然就可以顯示了肚邢。。
- 這個問題應該來說不屬于
DZNEmpetyDataSet
但是是在使用的時候發(fā)現(xiàn)拭卿,所以也就放在這里說一下骡湖。
我們都知道在使用DZNEmpetyDataSet
如果想展示提示圖標只需要實現(xiàn)這個代理方法返回一個UIImage
對象就可以了。
// 設(shè)置圖片
- (UIImage *) imageForEmptyDataSet:(UIScrollView *)scrollView {
return [UIImage imageNamed:@"icon_Nonetwork"];
}
但是在實際使用中峻厚,我們有些頁面是不需要展示圖標的响蕴。所以我這里改成了這樣。
// 設(shè)置圖片
- (UIImage *) imageForEmptyDataSet:(UIScrollView *)scrollView {
if (!self.viewModel.errorMessage) return [UIImage new];
return [UIImage imageNamed:@"icon_Nonetwork"];
}
看著貌似沒有什么問題吧惠桃。
但是浦夷,在項目上線之后,發(fā)現(xiàn)忽然增加了很多的線上崩潰辜王,都是定位在這里劈狐,都是壞內(nèi)存訪問。
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;
}
}
又是一陣懵逼呐馆,怎么可能啊肥缔,,汹来,什么情況续膳。
經(jīng)過層層的排查,最后定位到是外部 返回[UIImage new]
這個方法造成的收班。但是在我們測試時并沒有崩潰啊姑宽,最后發(fā)現(xiàn),在ios 11.3 -- 11.4 是沒有問題的闺阱,但是11.0 之后的老的系統(tǒng),如果是通過[UIImage new]
這個方法創(chuàng)建的image對象舵变,是不能調(diào)用imageWithRenderingMode
這個方法的酣溃。但是在11.3之后,蘋果爸爸貌似又修復了這個問題纪隙。查看了下官方文檔也沒發(fā)現(xiàn)什么說明的赊豌。只在網(wǎng)上看到了這句話。
真的是人生處處都是坑啊绵咱,一不小心就栽個狗吃屎碘饼。。搬磚不易,且行且珍惜艾恼。