#環境
- Xcode 12 Beta 6
- iOS 14 Beta 6
※ この記事で言及している問題は、Beta版ではなく正式版になると解決される可能性があります。あくまでBeta 6時点での解決方法としてお読みください。
#発生した問題
Xcode12でビルドしたアプリをいじっていると、UITableViewを使っている画面でタップが効かなかったり挙動が変わったりしている画面を発見しました。具体的には、cell内のUISwitchが押せなかったり、cellにaddSubviewしたUICollectionViewのcellをタップしてもdidSelectItemAtが呼ばれなかったりしました。Xcode 11でビルドしていたら押せたのに。。。
#原因
調べていくと、cellの子ViewであるcontentViewにタップを奪われてUISwitchやUICollectionViewをタップできていなかったことがわかりました。storyboardやxibを使ってcellのcontentViewに乗せている場合は起こらなかったのですが、発見した箇所はすべてコード上でcellに直接addSubviewしている画面でした。
#修正方法
contentViewにタップを奪われているので、contentViewをタップに反応しないようにすればよいです。適時、
cell.contentView.isUserInteractionEnabled = false
を実行しましょう。
追記(2020/09/22)
コメントにてご指摘いただきました。パフォーマンスの観点から、iOS 14ではUITableViewCellとUICollectionViewCellがcontentViewの生成を遅延して実行するようになったようです。
https://twitter.com/smileyborg/status/1276623197207531520
また、cellに直接addSubviewしているのは本来の使い方ではなく、contentViewにaddSubviewするのが正しいです。contentViewにaddSubviewしていれば今回のバグは起こりませんでした。
https://developer.apple.com/documentation/uikit/uitableviewcell/1623229-contentview
今回のバグは、Appleが「正しい実装をしていれば開発者には影響がないはず」という修正を加え、その部分がこのアプリでは正しく実装されていなかったゆえに起こったバグでした。ですので、cellに直接addSubviewしている部分を適時contentViewに変えるのが正しい修正方針です。
cell.addSubview(view) // これを
// ↓↓↓↓↓↓↓↓↓↓↓
cell.contentView.addSubview(view) // こっちに書き換える
#おわりに
新しいXcodeへの対応は情報が少なくて大変ですが、原因がわかった時はいろんな問題が一気に解決していくのが楽しいですね。