Что могло предотвратить создание файла спецификации драгоценного камня?

Принятый ответ на самом деле не отвечает на вопрос. Вместо этого он предлагает альтернативу, используя заголовок 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 для добавления ваших подпредставлений. и остальные ваши ограничения.

1
задан Hola 21 June 2009 в 17:46
поделиться

1 ответ

Do you have config.gem statements for your gems in your environment.rb file? In my experience, you need to have the gems set up in your configuration in order for rake gems:refresh_specs to know about them.

2
ответ дан 3 September 2019 в 01:17
поделиться