iOS14 UITableViewCell & UICollectionViewCell 中還是乖乖使用 contentView 吧

做過 iOS 開發(fā)的,一般都使用過 UITableView UICollectionView,也就會(huì)用到 UITableViewCell UIColletionViewCell,在 iOS14 之前,使用UITableViewCell 或者 UICollectionViewCell 添加控件的時(shí)候,不管使用 [self addSubview:]; 還是使用 [self.contentView addSubview:];,最后的視圖層級(jí)都是一樣的。但是在 iOS14 上,視圖層級(jí)發(fā)生了一些變化。而這個(gè)變化,會(huì)影響到 cell 上面子控件的點(diǎn)擊。

iOS14 之前,不管是 UITableViewCell 還是 UICollectionViewCell,不管使用 self 還是 self.contentView 亦或是 xib 添加控件,最后的視圖層級(jí)由下到上都是 cell - contentView - custom subviews,其中 custom subviews 代表自己添加的控件。

iOS14 上,UITableViewCellUICollectionViewCell 的視圖層級(jí)已經(jīng)不一樣了。

先看下 UITableViewCell

  • 代碼創(chuàng)建 cell

    • 不添加任何控件,系統(tǒng)會(huì)自動(dòng)創(chuàng)建出 contentView,視圖層級(jí)由下到上為cell - contentView
    • 如果使用 [self addSubview:]; 添加控件,視圖層級(jí)由下到上會(huì)變成 cell - custom subviews - contentView,這時(shí)候添加的控件在 contentView 下面,如果子控件有點(diǎn)擊事件,會(huì)被 contentView 阻斷掉
    • 如果使用 [self.contentView addSubview:]; 添加控件,視頻層級(jí)由下到上會(huì)變成 cell - contentView - custom subviews,這時(shí)候跟 iOS14 之前是一致的。
  • xib 創(chuàng)建 cell

    • 由于在 xib 中,添加的控件全部是在 contentView 上的,所以跟 iOS14 是一致的,視圖層級(jí)由下到上為 cell - contentView - custom subviews

繼續(xù)看 UICollectionViewCell

  • 代碼創(chuàng)建 cell
    • 不添加任何控件,系統(tǒng)不會(huì)自動(dòng)創(chuàng)建 contentView,此時(shí)只有 cell;
    • 如果使用 [self addSubview:]; 添加控件,視圖層級(jí)由下到上會(huì)變成 cell - custom subviews
    • 如果使用 [self.contentView addSubview:]; 添加控件,視圖層級(jí)由下到上會(huì)變成 cell - contentView - custom subviews
  • xib 創(chuàng)建 cell
    • xib 中,不會(huì)顯示出 contentView,直觀上看到的就是控件直接加到了 cell 上,但是運(yùn)行之后,系統(tǒng)還是自動(dòng)創(chuàng)建出 contentView,視圖層級(jí)由下到上是 Cell - contentView - added subviews

所以,iOS14 上面,UITableViewCell UICollectionViewCell 偷偷的變化了。如果之前有使用 [self addSubview:]; 這個(gè)方法直接添加視圖,可能就會(huì)發(fā)現(xiàn)界面看起來沒有任何問題,但是 UITableViewCell 里面的點(diǎn)擊事件單單在 iOS14 上無效了。那解決方案就是使用 [self.contentView addSubview:]; 替代 [self addSubview:];。

其實(shí),通過上面不同情況的對(duì)比,可以發(fā)現(xiàn)不同層級(jí)確實(shí)不會(huì)影響顯示效果,而是會(huì)影響 cell 子控件的點(diǎn)擊效果,而且僅僅是 UITableViewCell 才會(huì)出現(xiàn)這種問題。不過隨著系統(tǒng)的繼續(xù)迭代,UICollectionViewCell 會(huì)不會(huì)發(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:]; 添加控件。

我自己做了個(gè) demo ,運(yùn)行可以清楚的看到不同情況下的效果,地址在這里,需要的可以點(diǎn)擊下載。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容