【问题标题】:UIViewController view's frame changes after present(viewController: animated: completion: )呈现后 UIViewController 视图的框架发生变化(viewController:动画:完成:)
【发布时间】:2017-09-10 15:36:09
【问题描述】:

我有一个UIViewController,我在ViewDidLoad 中设置了它的大小,如下所示:

//Setting view's frame
let width = UIScreen.main.bounds.size.width - 10
let height = (43 * UIScreen.main.bounds.height) / 100 //%43 of the screen
self.view.frame = CGRect(x: 5, y: 80, width: width, height: height)

在我尝试像这样展示另一个 ViewController 之前效果很好:

//Presenting AutoCompleteVC
self.autocompleteVC = GMSAutocompleteViewController()
self.autocompleteVC.delegate = self
self.present(self.autocompleteVC, animated: true, completion: nil)

在我关闭此视图 (self.autocompleteVC.dismiss(animated: true, completion: nil)) 后,第一个 ViewController 视图的框架变为全屏框架。

知道怎么解决吗?

谢谢!

【问题讨论】:

  • 您可以将设置大小从viewDidLoad更改为viewWillAppear,使其每次出现时都进行设置,对于这个问题,当您提供新的vc时,UIScreen可能会更新为原始屏幕跨度>
  • 您不应该在视图控制器中设置自己的框架。请详细说明您想要达到的目标。
  • @Kamil.S 为什么不呢?我需要将视图的大小设置为更小
  • 没关系,但这不应该是视图控制器的责任。如果您想使用带有框架的“oldschool”方式(与自动布局相反)调整视图大小,您应该在父视图控制器的 didLayoutSubviews 中执行此操作,而不是在“self”vc

标签: ios iphone swift cocoa-touch uiviewcontroller


【解决方案1】:

将您的框架设置为viewWillLayoutSubviews。那时框架是已知的。像这样:

public override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()

   //Setting view's frame
   let width = UIScreen.main.bounds.size.width - 10
   let height = (43 * UIScreen.main.bounds.height) / 100 //%43 of the screen
   self.view.frame = CGRect(x: 5, y: 80, width: width, height: height)
}

【讨论】:

  • 不能保证在实际布局发生之前正确设置框架。这不是一个好的解决方案
  • 非常感谢您!我正在使用一个很棒的自定义视图控制器转换类,但是每当我在它上面呈现一个新视图时,父视图就会向上移动。您的解决方案解决了我的问题,再次感谢?
【解决方案2】:

我建议在 viewWillAppear 中编写代码,但在设置框架后,你应该写 self.view.setNeedsLayout()

我希望这会奏效。

【讨论】:

    【解决方案3】:

    视图控制器的主视图由系统逻辑根据横向/纵向、分屏、模式显示、视图控制器包含来定位和调整大小...

    相反,您应该在子视图中进行所有内容布局(取决于主视图大小),并将主视图的背景颜色设置为 UIColor.clear。 因此,在您的情况下,添加一个子视图并根据需要进行配置。

    提示:您应该使用自动布局而不是操纵框架。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-13
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多