代码之家  ›  专栏  ›  技术社区  ›  alengqvist

具有自动布局的UIPageViewController在ViewDid出现之前不会更新子帧

  •  0
  • alengqvist  · 技术社区  · 7 年前

    我有一个RootViewController,它由两个uiviewcontroller组成,所有这些都是在代码中创建的(没有故事板/nib)。

    第一个UIViewController具有以下定位:

    weekView.translatesAutoresizingMaskIntoConstraints = false
    
    weekView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
    weekView.heightAnchor.constraint(equalToConstant: 100).isActive = true
    weekView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
    weekView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
    

    另一个UIViewController具有以下定位:

    daysViewController.view.translatesAutoresizingMaskIntoConstraints = false
    
    daysViewController.view.topAnchor.constraint(equalTo: weekView.bottomAnchor).isActive = true
    daysViewController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
    daysViewController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
    daysViewController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
    

    这使得它固定在第一个UIViewController的底部,并占据其余屏幕高度(距离顶部UIViewController的距离为100)。

    第二个UIViewController是一个自定义UIPageViewController,它由UIViewController的多个子视图组成。

    问题

    相反,帧高度与屏幕高度相同。

    三种不同状态下的打印框高度如下:

    viewDidLoad PageViewController frame: (0.0, 0.0, 375.0, 667.0)
    viewDidLoad ChildViewController frame: (0.0, 0.0, 375.0, 667.0)
    viewWillAppear ChildViewController  frame: (0.0, 0.0, 375.0, 667.0)
    viewDidAppear ChildViewController  frame: (0.0, 0.0, 375.0, 667.0)
    

    我如何解决这个问题? 因为现在我需要考虑的是,视图框架是屏幕的全高,而不是创建所有子视图时应该是567。

    1 回复  |  直到 7 年前
        1
  •  0
  •   alengqvist    7 年前

    在一个 similar question

    与自动布局引擎有关,以及何时启动。 在viewWillAppear和viewDidAppear之间的帧是正确的,这使我将特定于帧的代码放在viewDidLayoutSubviews中。

    但是,如果在viewDidLayoutSubviews中调用的特定于帧的任务很重(例如与UI相关),则滚动中会出现延迟/闪烁。