为什么我的UITableViews以编程方式添加时会错误地放在y轴上?

时间:2016-10-13 18:52:00

标签: ios swift uitableview

我有一个简单的设置,我在UINavigationController中嵌入了一个视图控制器。在这个视图控制器上,我想显示彼此相邻的多个tableView(水平)。我正在tableView创建并添加viewDidLoad s。除了y之外,每个tableView的位置都存在问题,但第一个问题除外。

以编程方式创建tableView时,第一个tableView始终正确显示在UINavigationBar下方。但是,即使UINavigationBar - 坐标在所有y中等于0,所有其他内容也会显示在tableView的“后面”。

这是在模拟器上运行时的样子(注意tableView本身有绿色backgroundColor):

enter image description here

这是它的代码:

class ViewController: UIViewController {

    var tableViews: [UITableView] = [] // maintained only for debugging purposes

    override func viewDidLoad() {
        super.viewDidLoad()
        let tableViewCount: Int = 5
        createTableViews(tableViewCount)
    }

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        print(#function, tableViews)
    }

    func createTableView(count: Int) {
        let width = Int(self.view.bounds.width)/count

        for i in 0..<count {
            let x = width * i
            let y = 0
            let height = Int(view.bounds.height)
            let frame = CGRect(x: x, y: y , width: width, height: height)
            let tableView = UITableView(frame: frame, style: UITableViewStyle.Plain)
            tableView.backgroundColor = .greenColor()
            tableView.dataSource = self
            tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "Cell")
            view.addSubview(tableView)
            tableView.tag = i

            tableViews.append(tableView)
        }
    }
}

我只保留tableViews属性,以便我可以在viewDidAppear中打印它们。 viewDidAppear中的控制台输出显示我的所有tableView在其框架上具有相同的y位置(= 0)。

我确实找到了一个简单(但很难)的解决方法。我所要做的就是将第一个y设置为0,将其余设置为64(状态栏的高度加上导航栏的高度)。像这样:

let y = i == 0 ? 0 : 64

有没有人知道为什么tableView被错放了?根据我的理解,所有tableView应显示在导航栏的正下方,因为这是视图控制器的view的垂直原点?

1 个答案:

答案 0 :(得分:1)

  

根据我的理解,所有tableView都应该显示在导航栏的正下方,因为这是视图控制器视图的垂直原点?

如果您设置myNavigationController.navigationBar.translucent = false,这只是我的经验。如果导航栏是半透明的,则视图的顶部仍然是屏幕的顶部。

另一方面,你应该考虑通过自动布局来放置这些视图,而不是这个hacky帧数学。会简化你的代码。