为什么第一个子视图嵌入UINavigationController的UIVewController的位置会被改变?

时间:2015-11-02 19:17:29

标签: ios swift uinavigationcontroller storyboard

UITablesViews嵌入ViewController时,我注意到ViewController内部UINavigationController的一些奇怪行为。以下是一个简单原型的代码,用于选择要在场景中显示的不同UITableViews,不包括TableView的方法,并选择要显示的视图。

class ChooseTableViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

  var tableViewA: UITableView = UITableView()
  var tableViewB: UITableView = UITableView()

  var colors: [String] = ["red", "blue", "green"]
  var shapes: [String] = ["triangle", "circle", "square"]

  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    tableViewA.frame       = CGRectMake(0, 50, 320, 200)
    tableViewA.delegate    = self
    tableViewA.dataSource  = self
    tableViewA.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cellTableViewA")

    tableViewB.frame       = CGRectMake(0, 50, 320, 200)
    tableViewB.delegate    = self
    tableViewB.dataSource  = self
    tableViewB.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cellTableViewB")

    self.view.addSubview(tableViewB)
    self.view.addSubview(tableViewA)
    tableViewB.hidden = true

    let segmentSelectorLabels = ["one", "two"]
    let segmentSelector = UISegmentedControl(items: segmentSelectorLabels)
    segmentSelector.frame = CGRectMake(self.view.frame.width/2 - 50, self.view.frame.height - 100, 100, 40)
    self.view.addSubview(segmentSelector)
    segmentSelector.selectedSegmentIndex = 0
    segmentSelector.addTarget(self, action: "chooseTable:", forControlEvents: .ValueChanged)
  }

  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
  }

...
}

以下是ChooseTableViewController未嵌入UINavigationController以及何时

的结果

Simulators results

在另一个项目中,只需添加

即可修复行为
let emptyView:UIView = UIView()

self.view.addSubiew(emptyView)

emptyView是第一个添加的子视图。这是一个让UITableViews处于适当位置的hackney解决方案。对此行为的任何见解表示赞赏。

2 个答案:

答案 0 :(得分:0)

将表格视图的帧原点y位置设置为0.查找"扩展边缘"故事板中此视图控制器的设置并关闭"在顶部条形图下#34;。

答案 1 :(得分:0)

取消选中"调整滚动视图插图"对于属性检查器中的viewcontroller或在代码中执行:

self.automaticallyAdjustsScrollViewInsets = NO;(Obj-C) self.automaticallyAdjustsScrollViewInsets = false(斯威夫特)

View Controller

更多解释:

如果此属性设置为YES / true,则视图控制器(如名称所示)会自动调整其视图层次结构中第一个滚动视图的插入内容。如果您的scrollview / tableview / textview / webview占据整个屏幕,并且部分内容通常由状态栏/导航栏/标签栏或工具栏隐藏,这可能会有所帮助。然后这些插入使您的内容显示在顶栏下方/底栏上方。这虽然只发生在scrollview / ...是视图层次结构中的 TOP MOST 子视图(=索引0处的子视图)时。为了让事情更清楚,我上传了四个例子:

  1. 属性设置为YES / true,视图层次结构中的两个文本视图(索引0和1):您可以看到仅为第一个滚动视图设置了插入内容 01

  2. 属性设置为NO / false,视图层次结构中的两个textview(索引0和1):正如您所见,根本没有设置任何插入 02

  3. 属性设置为YES / true,按钮(索引0处的子视图)和两个textview(索引1和2):正如您所见,虽然属性为YES / true,但根本没有设置任何插入。这是因为没有scrollview是视图层次结构中的 TOP MOST 子视图。 03

  4. 属性设置为YES / true在索引0的视图层次结构中的文本视图占用整个屏幕:正如您所见,尽管textview占据整个屏幕(从0,0开始),但文本是没有被状态/导航栏隐藏,因为视图控制器自动调整了文本视图(scrollview' s)插入。 04

  5. 我希望我能帮助让事情变得更加清晰。 :)