У меня есть пользовательский интерфейс, как показано на скриншоте.В настоящее время я сделал это с помощью таблиц.Экран представляет собой табличное представление со статической ячейкой прототипа в 4 строки.Один для заголовка, включая изображение профиля, следующий для биографии профиля, третий ряд для избранного, подписок, кнопки с изображением события и последний ряд для содержимого, являющегося другим видом таблицы.
Избранный раздел
Раздел подписки
Я использовал один внутренний вид таблицы длясодержимое со всеми элементами в избранном, подписки и события в одной ячейке.Одна загрузка, я скрываю другие элементы и показываю только один, в зависимости от значка, нажмите.
Проблема в том, что высота ячейки несовместима в разделе избранного.Пробел присутствует в том случае, если на ярлыке более одной строки.В разделе подписок последний элемент касается панели вкладок.
Я отключил прокрутку для внешнего вида таблицы, поэтому прокручивается только внутреннее представление таблицы (раздел содержимого), что неприятно на небольших экранах.
class ProfileViewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
profileTableView = ProfileSectionTableView() // inner table view
profileTableView.profileDelegate = self
profileSectionTableView.delegate = profileTableView
profileSectionTableView.dataSource = profileTableView
profileSectionTableView.rowHeight = UITableView.automaticDimension
profileSectionTableView.estimatedRowHeight = 44
}
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
switch (indexPath.row) {
case 0:
return 176
case 1:
return 72
case 2:
let height = self.view.frame.height - (176 + 72 + (self.tabBarController?.tabBar.frame.height)! + 8)
return height
default:
return UITableView.automaticDimension
}
}
override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return 44
}
}
Представление таблицы раздела содержимогокод:
class ProfileSectionTableView: UITableView, UITableViewDelegate, UITableViewDataSource, ProfileSectionViewDelegate {
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
let cell = updateTableCell(tableView, indexPath) as! ProfileCell
var height = UITableView.automaticDimension
if (ProfileData.profileViewType == .favourite) {
height = cell.favouritesTitleLabel.text!.height(withConstrainedWidth: cell.favouritesTitleLabel.frame.width - 64, font: UIFont(name: "Roboto", size: 17.0)!) + 28
} else if (ProfileData.profileViewType == .subscription) {
height = cell.subscriptionTitleLabel.text!.height(withConstrainedWidth: cell.subscriptionTitleLabel.frame.width - 64, font: UIFont(name: "Roboto", size: 17.0)!) + 16
}
return height
}
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}
// ...
}
extension String {
func height(withConstrainedWidth width: CGFloat, font: UIFont) -> CGFloat {
let constraintRect = CGSize(width: width, height: .greatestFiniteMagnitude)
let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [.font: font], context: nil)
return ceil(boundingBox.height)
}
}
Как исправить разрыв между ячейками?У меня есть линии меток, установленные как 0
.Как расположить элементы интерфейса для таких экранов?Является ли вышеуказанный метод правильным?Или я должен использовать UIViewController с контейнерным представлением для разделов?
Смежный вопрос по этому вопросу Как изменить высоту ячейки внутренней таблицы в iOS?