使TableView只占用屏幕的一部分

时间:2013-08-27 18:15:57

标签: ios uitableview uiview interface-builder

默认情况下,当我在IB中拖出一个TableViewController时,tableview会占用所有屏幕,即使用户滚动tableview,也无法添加一个保持原样的UIView(如果我说添加一个UIView的话)按钮,然后当我滚动桌面视图时,UIView也会滚动。)

我的程序使用UITableViewController子类来控制tableview,即使用户滚动,顶部栏保持静态的最简单方法是什么?

3 个答案:

答案 0 :(得分:5)

简单,而不是使用UITableViewController只是使用UIViewController,其中放置了UITableView。 (留出空间让您在表格上方或下方添加辅助视图)这样,您可以让视图控制器的视图占据整个屏幕,并手动定义其中的表格视图的框架。将需要一些重新安排,但将满足您的需求。

enter image description here

您需要注意的唯一真正的区别是,您需要使视图控制器符合UITableViewDelegate和UITableViewDatasource协议,以及自己声明表视图的出口。

@property (weak,nonatomic) IBOutlet UITableView *tableView;

同样重要的是要记住,有些函数只能在像clearsSelectionOnViewWillAppear这样的UITableViewController上使用,但你总是可以自己复制它们。

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self.tableView deselectRowAtIndexPath:self.tableView.indexPathsForSelectedRows animated:YES];
}

答案 1 :(得分:3)

我推荐的方法(我认为这是Apple鼓励的设计模式)是使用embed segue将表视图控制器插入包含其他视图的父控制器。这有助于保持模块化,并有助于使整个应用程序结构易于理解。

基本步骤如下:

  1. 在IB中创建父视图控制器并添加容器视图
  2. 通过从容器视图中拖动到要嵌入的视图控制器来创建嵌入segue。
  3. 给segue一个像“EmbedMyTable”这样的标识符。
  4. 在父控制器的prepareForSegue方法中,检查嵌入segue的标识符并进行任何其他连接。视图控制器和视图关系是自动建立的,但您可能需要配置表视图控制器并保留对它的引用。

答案 2 :(得分:1)

使用Swift约束以编程方式进行。我认为此解决方案更干净:

    import UIKit

    class SettingsController : UIViewController, UITableViewDelegate, UITableViewDataSource {

    let tableView : UITableView = {
        let t = UITableView()
        t.translatesAutoresizingMaskIntoConstraints = false
        return t
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        // set a background color so we can easily see the table
        self.view.backgroundColor = UIColor.blue

        // add the table view to self.view
        self.view.addSubview(tableView)

        // constrain the table view to 120-pts on the top,
        //  32-pts on left, right and bottom (just to demonstrate size/position)

        tableView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 32.0).isActive = true
        tableView.topAnchor.constraint(equalTo: view.topAnchor, constant: 120.0).isActive = true
        tableView.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -32.0).isActive = true
        tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -32.0).isActive = true

        // set delegate and datasource
        tableView.delegate = self
        tableView.dataSource = self

        // register a defalut cell
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
    }

    // Note: because this is NOT a subclassed UITableViewController, 
    // DataSource and Delegate functions are NOT overridden

    // MARK: - Table view data source

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 25
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)

        cell.textLabel?.text = "\(indexPath)"

        return cell
    }

    // MARK: - Table view delegate

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        // etc
    }
}