2017-02-15 10 views
1

У меня есть UITableViewController, и я бы хотел разместить над ним UIView (не поверх надкрылья, только выше), сохраняя навигационную панель.(Swift) Добавляя UIView над UITableViewController программно

Это хороший пример того, что я пытаюсь достичь, за исключением того, как я сказал, что я все еще хочу панель навигации: enter image description here

Я делаю это в Swift (3), и я это делаю все программно (без раскадровки).

Это то, что я до сих пор в моей UITableViewController, я застрял, когда дело доходит до ограничения программно, я не совсем уверен, что мне нужно:

// Create the view (add subview in viewDidLoad) 

let topView: UIView = { 
    let tv = UIView() 
    tv.backgroundColor = UIColor.darkGray 
    tv.translatesAutoresizingMaskIntoConstraints = false 
    tv.layer.masksToBounds = true 
    return tv 
}() 

// Constraints (call in viewDidLoad) 
func setupTopView() { 
     //x, y, width, height constraints 
     topView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 
     topView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true 
     topView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true 
     topView.heightAnchor.constraint(equalToConstant: 100) 

} 

Каждый знает, как это сделать это?

EDIT: Спасибо @Sneak, это то, что я закончил с:

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 

    let headerLabel = UILabel() 
    let logoView = UIImageView() 

    headerLabel.frame = CGRect(x: 0, y: 0, width: 200, height: 21) 
    headerLabel.text = self.navigationItem.title 
    headerLabel.textColor = UIColor.white 
    headerLabel.backgroundColor = UIColor.clear 

    logoView.frame = CGRect(x: 0, y: 0, width: 90, height: 90) 
    let logo: UIImage = UIImage(named: self.navigationItem.title!)! 
    logoView.image = logo 

    view.addSubview(headerLabel) 
    view.addSubview(logoView) 

    return topView 
} 

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 
    return 175 
} 
+0

вы можете использовать regular' viewController' и 'tableView', или добавить свой вид в качестве заголовка к текущей' tableView' –

ответ

2

реализовать метод tableView(_:viewForHeaderInSection:)

И просто, если у вас есть только 1 раздел, просто вернуть UIView в методе.

Если у вас есть несколько разделов, возвращает только UIView для раздела 1.

tableView(_:heightForHeaderInSection:) как установить высоту.

Вы также можете сделать это: tableView.tableHeaderView = headerView

+0

Winner. Спасибо, это было намного легче, чем я ожидал. – d0xi45

+0

@ d0xi45 Рад помочь, некоторые люди могут скомпрометировать вещи: P –

+0

Итак, если я хочу добавить метку и изображение, расположенное в центре заголовка, я бы сделал все это внутри 'viewForHeaderInSection', или мне нужно было бы создать их и выполняете ограничения снаружи, а затем добавляете их как 'view.addSubview' внутри' viewForHeaderInSection'? Сможете ли вы опубликовать простой пример? – d0xi45

0

Вы будете иметь большие трудности, делая это, как вы не можете получить доступ к корневому виду в UITableViewController. Вы должны переключиться на UIViewController с помощью tableView внутри него, затем вы можете добавить свой topView в качестве подпрограммы корневого представления контроллера и добавить свои ограничения.

0

Мое предложение состоит в том, чтобы использовать UIViewController вместо UITableViewController.

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

Я также настоятельно рекомендую использовать раскадровку, потому что, по моему опыту, создание приложения с UITableView внутри UIViewController, вы действительно ничего не можете сделать программно после того, как визуализировали визуально в Раскадке. Существует много кода и рекомендаций онлайн от людей, которые делают что-то совершенно программно, но если у вас нет какой-то конкретной причины для этого, я рекомендую использовать Storyboard. В этом случае, в частности, это действительно поможет вам быстро и точно выстроить вещи с надлежащими ограничениями.