做過 iOS 開發(fā)的,一般都使用過 UITableView
UICollectionView
,也就會用到 UITableViewCell
UIColletionViewCell
东且,在 iOS14 之前杉适,使用UITableViewCell
或者 UICollectionViewCell
添加控件的時候,不管使用 [self addSubview:];
還是使用 [self.contentView addSubview:];
硼莽,最后的視圖層級都是一樣的倍奢。但是在 iOS14 上朴上,視圖層級發(fā)生了一些變化。而這個變化娱挨,會影響到 cell
上面子控件的點(diǎn)擊余指。
在 iOS14 之前捕犬,不管是 UITableViewCell
還是 UICollectionViewCell
跷坝,不管使用 self
還是 self.contentView
亦或是 xib 添加控件,最后的視圖層級由下到上都是 cell - contentView - custom subviews
碉碉,其中 custom subviews
代表自己添加的控件柴钻。
在 iOS14 上,UITableViewCell
和 UICollectionViewCell
的視圖層級已經(jīng)不一樣了垢粮。
先看下 UITableViewCell
-
代碼創(chuàng)建
cell
- 不添加任何控件贴届,系統(tǒng)會自動創(chuàng)建出
contentView
,視圖層級由下到上為cell - contentView
- 如果使用
[self addSubview:];
添加控件蜡吧,視圖層級由下到上會變成cell - custom subviews - contentView
毫蚓,這時候添加的控件在contentView
下面,如果子控件有點(diǎn)擊事件昔善,會被contentView
阻斷掉 - 如果使用
[self.contentView addSubview:];
添加控件元潘,視頻層級由下到上會變成cell - contentView - custom subviews
,這時候跟 iOS14 之前是一致的君仆。
- 不添加任何控件贴届,系統(tǒng)會自動創(chuàng)建出
-
xib 創(chuàng)建
cell
- 由于在 xib 中翩概,添加的控件全部是在
contentView
上的,所以跟 iOS14 是一致的返咱,視圖層級由下到上為cell - contentView - custom subviews
- 由于在 xib 中翩概,添加的控件全部是在
繼續(xù)看 UICollectionViewCell
- 代碼創(chuàng)建
cell
- 不添加任何控件钥庇,系統(tǒng)不會自動創(chuàng)建
contentView
,此時只有cell
; - 如果使用
[self addSubview:];
添加控件咖摹,視圖層級由下到上會變成cell - custom subviews
- 如果使用
[self.contentView addSubview:];
添加控件评姨,視圖層級由下到上會變成cell - contentView - custom subviews
- 不添加任何控件钥庇,系統(tǒng)不會自動創(chuàng)建
-
xib 創(chuàng)建
cell
- 在 xib 中,不會顯示出
contentView
萤晴,直觀上看到的就是控件直接加到了cell
上参咙,但是運(yùn)行之后龄广,系統(tǒng)還是自動創(chuàng)建出contentView
,視圖層級由下到上是Cell - contentView - added subviews
- 在 xib 中,不會顯示出
所以蕴侧,iOS14 上面择同,UITableViewCell
UICollectionViewCell
偷偷的變化了。如果之前有使用 [self addSubview:];
這個方法直接添加視圖净宵,可能就會發(fā)現(xiàn)界面看起來沒有任何問題敲才,但是 UITableViewCell
里面的點(diǎn)擊事件單單在 iOS14 上無效了。那解決方案就是使用 [self.contentView addSubview:];
替代 [self addSubview:];
择葡。
其實(shí)紧武,通過上面不同情況的對比,可以發(fā)現(xiàn)不同層級確實(shí)不會影響顯示效果敏储,而是會影響 cell
子控件的點(diǎn)擊效果阻星,而且僅僅是 UITableViewCell
才會出現(xiàn)這種問題。不過隨著系統(tǒng)的繼續(xù)迭代已添,UICollectionViewCell
會不會發(fā)生變化就不一定了妥箕。
而且,使用 xib 創(chuàng)建 cell
的話更舞,表現(xiàn)跟 iOS14 之前是一致的畦幢,并且使用 [self.contentView addSubview:];
也是一致的。
還有缆蝉,系統(tǒng)規(guī)范也已經(jīng)說明了:
// UITableViewCell
// Custom subviews should be added to the content view.
@property (nonatomic, readonly, strong) UIView *contentView;
// UICollectionViewCell
@property (nonatomic, readonly) UIView *contentView; // add custom subviews to the cell's contentView
所以宇葱,我們不管是為了解決目前遇到的問題,還是為了防止以后再次出現(xiàn)這種問題刊头,都應(yīng)該使用 [self.contentView addSubview:];
添加控件黍瞧。
我自己做了個 demo ,運(yùn)行可以清楚的看到不同情況下的效果原杂,地址在這里印颤,需要的可以點(diǎn)擊下載。