ios - 为什么嵌入 UINavigationController 中的 UIVewController 的第一个 subview 的位置会改变?

标签 ios swift uinavigationcontroller storyboard

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

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 和嵌入 UINavigationController 时的结果

Simulators results

在另一个项目中,只需添加即可修复该行为

let emptyView:UIView = UIView()

self.view.addSubiew(emptyView)

其中 emptyView 是第一个添加的 subview 。这是一个将 UITableViews 放置在正确位置的老套解决方案。对此行为的任何见解都值得赞赏。

最佳答案

在属性检查器中取消选中 View Controller 的“调整 ScrollView 插入”或在代码中执行此操作:

self.automaticallyAdjustsScrollViewInsets = NO; (Obj-C) self.automaticallyAdjustsScrollViewInsets = false(Swift)

View Controller

更多解释:

如果此属性设置为 YES/true,则 View Controller (顾名思义)会自动调整其 View 层次结构中第一个 ScrollView 的插图。如果您的 ScrollView /表格 View / TextView / WebView 占据整个屏幕并且其中的一部分通常被状态栏/导航栏/选项卡栏或工具栏隐藏,这会很有帮助。然后这些插图使您的内容显示在顶部栏下方/底部栏上方。不过,只有当 ScrollView /... 是 View 层次结构中的 TOP MOST subview (= 索引 0 处的 subview )时,才会发生这种情况。为了让事情更清楚,我上传了四个示例:

  1. 属性设置为 YES/true 并在 View 层次结构中设置两个 TextView (位于索引 0 和 1 处):如您所见,仅为第一个 ScrollView 设置了插图 01

  2. 属性设置为 NO/false 以及 View 层次结构中的两个 TextView (位于索引 0 和 1 处):如您所见,根本没有设置任何插入 02

  3. 属性设置为 YES/true,一个按钮(索引 0 处的 subview )和两个 TextView (索引 1 和 2 处):正如您所看到的,尽管属性设置为 YES/true,但根本没有设置任何插图。这是因为没有 ScrollView 是 View 层次结构中的最顶层 subview 。 03

  4. 属性设置为 YES/true , View 层次结构中索引 0 处的 TextView 占据整个屏幕:如您所见,尽管 TextView 占据整个屏幕(从 0,0 开始),但文本是不会被状态栏/导航栏隐藏,因为 View Controller 会自动调整 TextView ( ScrollView )的插入。 04

我希望我能帮助让事情变得更清楚一些。 :)

关于ios - 为什么嵌入 UINavigationController 中的 UIVewController 的第一个 subview 的位置会改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33485180/

相关文章:

iphone - 使用 iPhone 的模态登录 View

objective-c - iOS 中的预期标识符或 '('

ios - 如何以编程方式更改 RootViewController?

iPhone:保存并验证返回导航

ios - 在 segue 与 Swift 2.0 之间传递数据

ios - 为什么 "&", "+"字符没有在 iOS 中编码?

iOS - 从设备中获取所有照片并将它们保存到应用程序

ios - Swift 警报处理程序语法奇怪

swift - 在 Swift 中,从 init() 调用时 didSet 不会触发

swift - 在 UINavigationBar 中看不到 rightBarButtonItem?