代码之家  ›  专栏  ›  技术社区  ›  Sean Zlatnik

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

  •  0
  • Sean Zlatnik  · 技术社区  · 7 年前

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

    GUI Image

    现在主要的问题是,在iPad Pro 12.9上“模拟器,一开始自定义视图只填充了屏幕的一部分,就像它遵循Air 2的大小限制一样。但是,如果我离开屏幕,回到屏幕上,屏幕不是重新创建的,而是重新显示的,gui看起来几乎完美。另一方面,gui在我拥有的iPad Mini设备上看起来几乎完美,无需来回。我可以不太清楚,因为中间部分的图像在顶部和底部被稍微剪裁了一下,但我还没有努力弄清楚为什么会发生这种情况。我花了相当多的时间来调试我所问的问题。如果您需要更多信息来帮助我解决这个问题,我很乐意提供它-只需指定您需要什么。在实际包含此自定义视图的视图控制器上,我使用自动调整大小的遮罩将其填充到屏幕上,这显然不起作用,但已经尝试了约束,它们也没有帮助。

    有没有办法解决这个问题?

    更新:我将约束更改为我更喜欢的内容,因为我使用了“重置为建议的约束”,这产生了一些奇怪的约束。然而,问题仍然存在。

    Current 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!) 
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Sean Zlatnik    7 年前

    我花了一段时间才弄明白这一点。该软件在视图中添加了一个自动调整遮罩大小的约束,这使得它看起来很有趣。为了解决此问题,在自定义UIView的初始化过程中,我必须添加以下代码行:

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

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