Возможно, используя инструмент командной строки:
OpenedFilesView v1.50 - просмотр открытых / заблокированных файлов в вашей системе (проблемы с нарушениями доступа)
Если вы хотите использовать для UITableView заголовок, вместо этого вы можете создать другую ячейку прототипа в Интерфейсном Разработчике, создать собственный класс на основе UITableViewCell и назначить его ячейке прототипа в конструкторе интерфейсов в Инспекторе классов.
Тогда в вашем контроллере вы будете использовать
func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?
В этой функции вы на самом деле собираетесь создать повторно используемую ячейку из своего табличного представления, но приведете к пользовательской ячейке, которую вы сделали. для заголовка. У вас будет доступ ко всем его свойствам, например к обычному UITableViewCell, а затем вы просто вернете представление ячейки
return cell.contentView
Еще один метод, который вы собираетесь использовать, -
func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 61.0
}
Этот человек говорит сам за себя.
Swift 3.0.1
public override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 61.0
}
Swift 3 / Xcode 8:
Добавьте это в viewDidLoad()
:
let HEADER_HEIGHT = 100
tableView.tableHeaderView?.frame.size = CGSize(width: tableView.frame.width, height: CGFloat(HEADER_HEIGHT))
Наслаждайтесь!
В Swift 4.1 и Xcode 9.4.1
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
if UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.pad {
return 75.0
} else {
return 50.0
}
}
Принятый ответ на самом деле не отвечает на вопрос. Вместо этого он предлагает альтернативу, используя заголовок SECTION. На этот вопрос ответили другие, но я продублирую ответ здесь с еще несколькими инструкциями.
Загрузка представления
Представления таблиц так же стары, как айфоны, и поэтому иногда приходится заставлять их делать то, что вы хотите.
Сначала нам нужно загрузить заголовок и вручную установить его высоту. В противном случае вид займет больше высоты, чем нужно. Мы делаем это по обратному вызову viewDidLayoutSubviews
:
lazy var profileHeaderView: ProfileHeaderView = {
let headerView = ProfileHeaderView()
return headerView
}()
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
sizeHeaderToFit()
}
private func sizeHeaderToFit() {
profileHeaderView.setNeedsLayout()
profileHeaderView.layoutIfNeeded()
var frame = profileHeaderView.frame
frame.size.height = profileHeaderView.calculateHeight()
profileHeaderView.frame = frame
tableView.tableHeaderView = profileHeaderView
}
Как видите, мне нравится помещать свои взгляды в ленивые переменные. Это гарантирует, что они всегда создаются, но только когда я начинаю их использовать.
Вы также можете видеть, что я вычисляю высоту. В некоторых случаях ваш рост является фиксированным, и поэтому вы можете просто установить высоту кадра в жестко заданное значение.
Установите некоторые приоритеты
Мы, скорее всего, увидим некоторые предупреждения об ограничениях в нашем отладчике. Это происходит потому, что табличное представление сначала устанавливает размер 0x0, прежде чем использовать размер, который мы указали выше. В этот момент ваши ограничения и высота представления конфликтуют друг с другом.
Чтобы очистить их, мы просто устанавливаем приоритеты ограничений. Сначала вы должны обернуть компоненты представления заголовка в другое представление (я обычно делаю это для представлений заголовка). Это значительно облегчит управление ограничениями в представлении заголовка.
Затем нам нужно установить высокие приоритеты нижнего ограничения:
containerView.setContentCompressionResistancePriority(.defaultHigh, for: .vertical)
containerView.setContentHuggingPriority(.defaultHigh, for: .vertical)
Вот более полный пример:
ПРЕДУПРЕЖДЕНИЕ Хотя это все еще полезно в качестве руководства для разметки ваших представлений, не используйте этот код, если вы создаете свои представления, используя перья или раскадровки.
class ProfileHeaderView: UIView {
lazy var containerView: UIView = {
let view = UIView()
return view
}()
override init(frame: CGRect) {
super.init(frame: frame)
setupLayout()
}
required init?(coder aDecoder: NSCoder) {
// We do this because the view is not created using storyboards or nibs.
fatalError("init(coder:) has not been implemented")
}
private func setupLayout() {
self.addSubview(containerView)
containerView.translatesAutoresizingMaskIntoConstraints = false
containerView.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
containerView.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true
containerView.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true
containerView.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
containerView.setContentCompressionResistancePriority(.defaultHigh, for: .vertical)
containerView.setContentHuggingPriority(.defaultHigh, for: .vertical)
// Set the rest of your constraints against your containerView not self and add your subviews to your containerView not self
}
}
Вот пример ограничений, установленных с помощью snap-kit:
containerView.snp.makeConstraints() { make in
make.top.equalTo(self.snp.top)
make.leading.equalTo(self.snp.leading)
make.trailing.equalTo(self.snp.trailing)
make.bottom.equalTo(self.snp.bottom).priority(.high)
}
Убедитесь, что вы добавили свои ограничения в containerView
, а не self
и используете containerView для добавления ваших подпредставлений. и остальные ваши ограничения.