Задание UILayoutPriority для NSLayoutConstraint, похоже, не вступает в силу - PullRequest
1 голос
/ 10 июля 2019

У меня есть таблица и кнопка в UIScrollView, и я хочу следующий дизайн:

  • Кнопка имеет значение как минимум 40 пунктов ниже последней строки таблицы
  • Кнопка всегда 83 пункта над концом просмотра

С учетом приведенных ниже ограничений мне удалось сделать кнопку всегда 40 пунктов ниже последней строки таблицы и на 83 пункта выше конца обзора, только если таблица достаточно длинная. Мне кажется, что приоритет для bottomConstraint неправильно переопределяет ограничение topConstraint. Я установил вид прокрутки, чтобы охватить весь экран.

/* - Sign Out button is 40 pts tall - */
let heightConstraint = NSLayoutConstraint(item: signOutBtn, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 41)

/* - Sign Out button is ALWAYS 83 pts above bottom of screen, when visible - */
let bottomConstraint = NSLayoutConstraint(item: signOutBtn, attribute: .bottom, relatedBy: .equal, toItem: scrollView, attribute: .bottom, multiplier: 1, constant: -83)
bottomConstraint.priority = UILayoutPriority.required

/* - Sign Out button is AT LEAST 40 pts below last row of table - */
let topConstraint = NSLayoutConstraint(item: signOutBtn, attribute: .top, relatedBy: .greaterThanOrEqual, toItem: tableView, attribute: .bottom, multiplier: 1, constant: 40)
topConstraint.priority = UILayoutPriority.defaultLow

/* - Sign Out button stretches across the screen - */
let leadingConstraint = NSLayoutConstraint(item: signOutBtn, attribute: .leading, relatedBy: .equal, toItem: scrollView, attribute: .leading, multiplier: 1, constant: 0)
let trailingConstraint = NSLayoutConstraint(item: signOutBtn, attribute: .trailing, relatedBy: .equal, toItem: scrollView, attribute: .trailing, multiplier: 1, constant: 0)

scrollView.addConstraints([heightConstraint, bottomConstraint, leadingConstraint, trailingConstraint, topConstraint])

Скриншоты:
(плохо - это то, чего я достиг сейчас)
enter image description here

(хороший)
enter image description here enter image description here

Кнопка выхода не появляется, если таблица слишком длинная, пользователь должен прокрутить ее вниз.

enter image description here

Ответы [ 2 ]

0 голосов
/ 12 июля 2019

Чтобы ответить на конкретный вопрос о приоритетах ограничений ...

Вы не понимаете, как ограничения используются в представлениях с прокруткой.

На этом изображении метка ограничена верхней частьюпредставление прокрутки и кнопка ограничены на 40 пунктов от метки с приоритетом 250 и на 83 пункта от нижней части представления прокрутки с приоритетом 1000.

Это ограничение снизу определяет высоту .contentSize - или«прокручиваемая область» - содержимого представления прокрутки:

enter image description here

0 голосов
/ 11 июля 2019

Я создал следующий контроллер представления, который должен решить вашу проблему - я должен признать, я не знаю, почему вы использовали scrollView в вашем макете, тем не менее, я надеюсь, что мне удалось воссоздать ваши настройки.

Для имитации разной высоты стола я использовал tableView.heightAnchor.constraint(equalToConstant: 300).

Якоря были использованы для создания ограничений.

import UIKit

class ViewController: UIViewController {
    let scrollView = UIScrollView()
    let tableView = UITableView()
    let signOutBtn = UIButton()

    override func viewDidLoad() {
        super.viewDidLoad()

        view.addSubview(scrollView)
        scrollView.addSubview(tableView)
        scrollView.addSubview(signOutBtn)

        tableView.dataSource = self

        signOutBtn.setTitle("BUTTON", for: .normal)
        signOutBtn.setTitleColor(.blue, for: .normal)

        //ScrollView constraints
        scrollView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            scrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
            scrollView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
            scrollView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor),
            scrollView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor)
        ])

        //TableView constraints
        tableView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            tableView.topAnchor.constraint(equalTo: scrollView.safeAreaLayoutGuide.topAnchor),
            tableView.bottomAnchor.constraint(lessThanOrEqualTo: signOutBtn.topAnchor, constant: -40),
            tableView.heightAnchor.constraint(equalToConstant: 300),
            tableView.trailingAnchor.constraint(equalTo: scrollView.safeAreaLayoutGuide.trailingAnchor),
            tableView.leadingAnchor.constraint(equalTo: scrollView.safeAreaLayoutGuide.leadingAnchor)
        ])

        //SignOutButton constraints
        signOutBtn.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            signOutBtn.heightAnchor.constraint(equalToConstant: 41),
            signOutBtn.bottomAnchor.constraint(equalTo: scrollView.safeAreaLayoutGuide.bottomAnchor, constant: -83),
            signOutBtn.centerXAnchor.constraint(equalTo: view.centerXAnchor)
        ])

    }
}

extension ViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 30
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell(style: .default, reuseIdentifier: "")
        cell.textLabel?.text = "\(indexPath.row)"
        return cell
    }
}

Я также прикрепляю экраны с результатом:

Изображение с таблицей с видом установки элементов

Изображение с таблицей, элементы которой не подходят к виду

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...