自定义 UIView 开始时仅覆盖屏幕的一部分

Custom UIView starts off covering only a portion of the screen

我有一个奇怪的问题。我有一个应该填满屏幕的自定义 UIView。这是 GUI 的图片以及约束:

现在的主要问题是,在 iPad Pro 12.9" 模拟器上,起初自定义视图仅填充屏幕的一部分 - 就像它遵循 Air 2 尺寸限制一样。但是,如果我离开屏幕再回到它,这样屏幕就不会被重新创建而只是重新显示,gui 看起来几乎完美。另一方面,gui 在我拥有的 iPad Mini 设备上看起来几乎完美, 而不必来来回回。它并不完全存在,因为中间部分的图像在顶部和底部被轻微剪裁,但我没有努力弄清楚为什么会这样。我花了相当多的时间试图调试我问的问题。如果您需要更多信息来帮助我解决这个问题,我很乐意提供它 - 只需指定您需要的内容。在实际持有此自定义视图的视图控制器上,我使用自动调整大小的蒙版让它填满屏幕,这显然不起作用,但已经尝试了约束并且他们也没有帮助。

关于如何解决这个问题有什么想法吗?

更新:我将约束更改为我更喜欢的内容,因为我使用了 "Reset to Suggested Constraints" 并且创建了一些奇怪的约束。但是问题依然存在。

下面是一些涉及视图的代码:

class SessionDisplayViewController: SessionViewDisplayViewControllerBase
{
//some code omitted for succinctness
@IBOutlet weak var mySessionView: SessionDisplayView!

override func getSessionView() -> SessionDisplayView
{
    return mySessionView
}
...
}

class SessionViewDisplayViewControllerBase: UIViewController, SessionDisplayViewDelegate{

...
 override func viewDidLoad() {
    super.viewDidLoad()
...
 if !ShareData.sharedInstance.sessionDataObjectContainer.keys.contains(curSessName) || ShareData.sharedInstance.sessionDataObjectContainer[curSessName] == nil
    {
        setupMySession(isLive: false, isFinalized: false)
    }
    else if (ShareData.sharedInstance.sessionDataObjectContainer[curSessName]?.isFinalized)!
    {
        setupMySession(isLive: false, isFinalized: true)
    }
    else
    {
        setupMySession(isLive: true, isFinalized: false)
        var fromTempChoose = ShareData.sharedInstance.startingSessionFromTempChoose && !(ShareData.sharedInstance.globalsVar?.hasStartedSession)!

        if fromTempChoose || (ShareData.sharedInstance.resumingSessionFromSessDet && !(ShareData.sharedInstance.globalsVar?.hasResumedSession)!)
        {
            let mySessionView = getSessionView()
            mySessionView.curScene.pauseSession(isStartingNow: true)
            blurEffect = UIBlurEffect(style: UIBlurEffectStyle.light)
            //}
            blurEffectView = UIVisualEffectView(effect: blurEffect)
            //always fill the view
            blurEffectView?.frame = self.view.bounds
            blurEffectView?.autoresizingMask = [.flexibleWidth, .flexibleHeight]
            self.view.addSubview(blurEffectView!)
        }
...
}
    var mySessObj = getSessionView() //these three lines of code were added to try to fix the problem.  They weren't in the original code
    mySessObj.frame = self.view.bounds
    setNeedsDisplay()
}
 ...

func setupMySession(isLive: Bool, isFinalized: Bool)
{
    let mySessionView = getSessionView()
    //mySessionView.translatesAutoresizingMaskIntoConstraints = false
    mySessionView.delegate = self
    sessionNameIndex = self.getSessionNumber() - 1

    let myName = ShareData.sharedInstance.currentAccount.name
    var curSessName = generateCurrentAccountName(name: myName!, value: self.getSessionNumber())
    //var names = generateAllPossibleSessionNames(name: myName!)
    let curSession = ShareData.sharedInstance.sessionDataObjectContainer[curSessName]

    mySessionView.onView(index: getSessionNumber(), sessionName: curSessName, isLive: isLive, isFinalized: isFinalized)
    if isLive
    {
        let val = curSession?.currentValue()
        mySessionView.curScene.setStartPosition(newValue: val!) 
    }
}

我花了一段时间才弄明白这一点。该软件正在向视图添加一个自动调整大小的蒙版约束,这导致它看起来很有趣。为了解决这个问题,在自定义UIView的初始化中,我不得不添加以下代码行:

self.view.autoresizingMask = [.flexibleHeight, .flexibleWidth]
self.view.frame = self.bounds

我猜软件将 class 即自定义 UIView 和其中包含所有内容的视图视为两个单独的视图。我希望我在网上找到的关于创建自定义 UIView 的教程包括我们需要设置自动调整大小掩码和视图的框架,但是哦,好吧。吸取教训。