【发布时间】:2021-04-25 15:52:00
【问题描述】:
我正在尝试以编程方式在 UICollectionViewCell 内创建一个表格视图。我见过其他问题,但他们似乎正在使用 AutoLayout。我能够获得数据来显示,但是我的单元格不能正确显示。无论我做什么,细胞似乎都以一种或另一种方式重叠。我需要在 UICollectionViewCell 内完全展开 tableview。
import Foundation
import UIKit
import MaterialComponents
class FollowingItemCollectionViewCell: MDCCardCollectionCell, UITableViewDataSource, UITableViewDelegate {
static let Identifer = "FollowingItemCollectionViewCell"
private var title: UILabel!
private var viewMoreButton: MDCButton!
private var tableView: SelfSizingTableView!
private var items: [Any] = []
private var item: FollowingItem!
private var clickListener: (FollowingItemClick) -> Void = { _ in }
override init(frame: CGRect) {
super.init(frame: frame)
createView()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
createView()
}
override func layoutSubviews() {
super.layoutSubviews()
backgroundColor = Colors.Card.background
}
private func createView() {
backgroundColor = Colors.Card.background
createTitle()
createTableView()
createViewMoreButton()
}
private func createTitle() {
title = UILabel()
title.font = UIFont(name: "HelveticaNeue-Bold", size: 24)
title.translatesAutoresizingMaskIntoConstraints = false
title.textColor = Colors.Card.text
contentView.addSubview(title)
title.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 2).isActive = true
title.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 8).isActive = true
title.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -2).isActive = true
}
private func createTableView() {
tableView = SelfSizingTableView()
tableView.translatesAutoresizingMaskIntoConstraints = false
tableView.delegate = self
tableView.dataSource = self
tableView.register(ArticleUiTableViewCell.self, forCellReuseIdentifier: ArticleUiTableViewCell.Identifier)
tableView.register(SearchTableViewCell.self, forCellReuseIdentifier: SearchTableViewCell.Identifier)
tableView.backgroundColor = Colors.Card.background
let titleGuide = UILayoutGuide()
contentView.addSubview(tableView)
contentView.addLayoutGuide(titleGuide)
titleGuide.bottomAnchor.constraint(equalTo: title.bottomAnchor).isActive = true
tableView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor).isActive = true
tableView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor).isActive = true
tableView.topAnchor.constraint(equalTo: titleGuide.bottomAnchor).isActive = true
tableView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
}
private func createViewMoreButton() {
viewMoreButton = MDCButton()
viewMoreButton.translatesAutoresizingMaskIntoConstraints = false
viewMoreButton.setBackgroundColor(Colors.clear)
viewMoreButton.setTitleColor(Colors.royal, for: .normal)
viewMoreButton.addTarget(self, action: #selector(onViewMoreClick), for: .touchUpInside)
let tableViewGuide = UILayoutGuide()
contentView.addSubview(viewMoreButton)
contentView.addLayoutGuide(tableViewGuide)
tableViewGuide.bottomAnchor.constraint(equalTo: tableView.bottomAnchor).isActive = true
viewMoreButton.topAnchor.constraint(equalTo: tableViewGuide.bottomAnchor).isActive = true
viewMoreButton.leadingAnchor.constraint(equalTo: contentView.leadingAnchor).isActive = true
viewMoreButton.trailingAnchor.constraint(equalTo: contentView.trailingAnchor).isActive = true
}
@objc func onViewMoreClick() {
if item is FollowingSearchItem {
clickListener(FollowingItemClick.SearchViewMoreClick)
} else if item is FollowingArticleItem {
clickListener(FollowingItemClick.ArticleViewMoreClick)
}
}
func numberOfSections(in tableView: UITableView) -> Int {
1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
items.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let item = items[indexPath.row]
if let item = item as? Article {
let cell = ArticleUiTableViewCell(frame: CGRect(x: 0, y: 0, width: contentView.frame.width, height: 80))
cell.setArticle(article: item, menuClickListener: { article in
self.clickListener(FollowingItemClick.ArticleMenuClick(article))
}, contentClickListener: { article in
self.clickListener(FollowingItemClick.ArticleClick(article))
})
cell.backgroundColor = Colors.Card.background
return cell
} else if let item = item as? SearchPresentable {
let cell = SearchTableViewCell(frame: CGRect(x: 0, y: 0, width: contentView.frame.width, height: 80))
cell.setData(searchPresentable: item, menuClickListener: { searchPresentable in
self.clickListener(FollowingItemClick.SearchMenuClick(searchPresentable))
}, contentClickListener: { searchPresentable in
self.clickListener(FollowingItemClick.SearchClick(searchPresentable))
})
cell.backgroundColor = Colors.Card.background
return cell
} else {
fatalError("No proper item type found for \(item)")
}
}
func setData(item: FollowingItem, width: CGFloat, clickListener: @escaping (FollowingItemClick) -> Void) {
widthAnchor.constraint(equalToConstant: width).isActive = true
contentView.widthAnchor.constraint(equalToConstant: width).isActive = true
self.clickListener = clickListener
self.item = item
if let item = item as? FollowingArticleItem {
items = item.items
} else if let item = item as? FollowingSearchItem {
items = item.items
}
tableView.reloadData()
title.text = item.title
viewMoreButton.setTitle(item.viewMoreText, for: .normal)
}
}
自定义大小的 TableView
class SelfSizingTableView: UITableView {
override func reloadData() {
super.reloadData()
invalidateIntrinsicContentSize()
layoutIfNeeded()
}
override var contentSize: CGSize {
didSet {
invalidateIntrinsicContentSize()
}
}
override var intrinsicContentSize: CGSize {
layoutIfNeeded()
let height = contentSize.height
return CGSize(width: contentSize.width, height: height)
}
}
【问题讨论】:
-
你能显示它被重叠的图像吗?
-
@rptwsthi 完成。
标签: ios swift uitableview uicollectionview