Добавить кнопку поверх UITableViewController (Swift)

Я пытаюсь добавить кнопку ontop в виде таблицы просмотра uitableview. Контроллер представления имеет контроллер навигации и статические ячейки, поэтому он является управляющим устройством, а не uiviewcontroller. Теперь я пытаюсь добавить кнопку в нижней части экрана, которая прикреплена к контроллеру навигации, чтобы она не прокручивалась с видом таблицы.

Я пытаюсь сделать что-то похожее на то, что ниже. Он имеет контроллер навигации для верхней панели, табличный вид со статическими ячейками и затем кнопку, но как они сделали кнопку?

Изображение: http://postimg.org/image/ilsmqqrip/

Спасибо!

UPDATE: как я могу использовать uiviewcontroller с табличным представлением со статическими ячейками с помощью Swift?

Ответ 1

Я нахожу Container Views очень полезным в этом сценарии! Чистое решение и очень легко реализовать.

Просто создайте обычный UIViewController, добавьте свою кнопку и ContainerView в качестве подзадач этого UIViewController (средний на изображении ниже). Наконец, создайте Embed Segue из ContainerView в свой UITableViewController (тот, который находится справа).

Раскадровка

Таким образом, вы можете использовать прототипы статических ячеек, не ограничиваясь только UITableView в то же время.

Результат:

Результат

Ответ 2

Я сделал что-то подобное с UITableViewController и статическим источником данных. Я добавил кнопку в моем представлении таблицы.

Чтобы сделать его выровненным в нижней части экрана, мне нужен этот код в моем диспетчере просмотра:

override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)

        // Make footerview so it fill up size of the screen
       // The button is aligned to bottom of the footerview 
       // using autolayout constraints
        self.tableView.tableFooterView = nil
        self.footerView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.tableView.frame.size.height - self.tableView.contentSize.height - self.footerView.frame.size.height)
        self.tableView.tableFooterView = self.footerView
    }

Вкратце, я изменяю размер footerview, чтобы заняться всем оставшимся пространством после удаления содержимого содержимого таблицы. Поскольку кнопка выровнена в нижней части footerView с автозапуском, она останется в нижней части экрана.

Раскадровка:

Storyboard

Вот результат:

simulator

Ответ 3

есть лучшее решение для этого. Вы можете сделать это, отключив свойство Auto Layout (button.translatesAutoresizingMaskIntoConstraints = false) соответствующей кнопки или любого UIView для плавающей кнопки:

Swift 4

//create a button or any UIView and add to subview
let button=UIButton.init(type: .system)
button.setTitle("NEXT", for: .normal)
button.frame.size = CGSize(width: 100, height: 50)
self.view.addSubview(button)

//set constrains
button.translatesAutoresizingMaskIntoConstraints = false
if #available(iOS 11.0, *) {
     button.rightAnchor.constraint(equalTo: tableView.safeAreaLayoutGuide.rightAnchor, constant: -10).isActive = true
     button.bottomAnchor.constraint(equalTo: tableView.safeAreaLayoutGuide.bottomAnchor, constant: -10).isActive = true
} else {
     button.rightAnchor.constraint(equalTo: tableView.layoutMarginsGuide.rightAnchor, constant: 0).isActive = true
     button.bottomAnchor.constraint(equalTo: tableView.layoutMarginsGuide.bottomAnchor, constant: -10).isActive = true
}

Ответ 4

UITableViewController займет все пространство, поэтому вы не сможете добавить кнопку. Обновите свой код на основе UITableViewController в UIViewController с добавлением UITableView вручную. Таким образом, вы сможете установить размер вашего вида таблицы и поместить кнопку в нижнюю часть.

Ответ 5

К сожалению, UITableViewController имеет представление tableView в виде верхнего уровня. Конечно, если вы посмотрите в отладчик вида, вы увидите, что tableview не является корневым представлением. Поэтому вы можете добавлять кнопки в окно tableView программно. Если вам нужно сделать это после факта, это, вероятно, самый простой способ добавить элемент верхнего уровня над UITableViewController. В противном случае, если вы делаете это в первоначальном проекте, вы можете использовать вид контейнера для своих кнопок и UITableViewController для TableView. Недостатком этого подхода является то, что вы получаете два контроллера представления: один для контейнера и один для таблицы, а также часто необходимо передавать информацию обратно и между ними. Если вы используете swift, вы можете упростить это, вставив tableViewcontroller внутри класса контроллера контейнера.

Если вы хотите добавить кнопку в окно, вы можете сделать это лениво, как только убедитесь, что в окне есть окно. Обратите внимание, что кнопки относятся к окну, а не к контроллеру представления, поэтому его ответственность заключается в том, чтобы удалить их, когда контроллер вида исчезает.

    private weak var button: UIButton!
    ...
    override func didMove(toParentViewController parent: UIViewController?) {
        super.didMove(toParentViewController: parent)
        guard self.button == nil, let window = tableView.window else {
            return
        }
        let button = UIButton(frame: CGRect(x:0, y:40, width: 200, height: 20))
        button.setTitle("This is a red button", for: .normal)
        button.backgroundColor = UIColor.red
        window.addSubview(button)
        self.button = button
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        button?.removeFromSuperview()
    }

Ответ 6

все, что вам нужно сделать, это добавить ваш вид сверху, в зависимости от того, какой он есть, в navigationController.view примерно так:

self.navigationController?.view.addSubview(YOUR_TOP_VIEW)

так что если вам нужна липкая кнопка/представление и т.д. поверх TableViewController, который не прокручивается с tableView, используйте этот подход.

Ответ 7

Вот UIViewController, с UITableView, добавленным как subview. В правом верхнем углу вы видите раскрывающееся меню, в котором указано Content: Dynamic Prototypes. Измените его на статические ячейки. enter image description here