ios - 自定义 UIView 一开始只覆盖屏幕的一部分
问题描述
我有一个奇怪的问题。我有一个应该填满屏幕的自定义 UIView。这是 GUI 的图片以及约束:
现在的主要问题是,在 iPad Pro 12.9" 模拟器上,起初自定义视图只填充屏幕的一部分——就像它遵循 Air 2 尺寸限制一样。但是,如果我离开屏幕并返回它使得屏幕没有重新创建而只是重新显示,gui 看起来几乎完美。另一方面,gui 在我拥有的 iPad mini 设备上看起来几乎完美,而不必去再回来。它不是相当那里,因为中间部分的图像在顶部和底部被略微剪辑,但我没有努力弄清楚为什么会发生这种情况。我花了相当多的时间来尝试调试我所询问的问题. 如果您需要更多信息来帮助我解决这个问题,我很乐意提供 - 只需指定您需要什么。在实际持有这个自定义视图的视图控制器上,我使用自动调整大小的掩码让它填满屏幕,这显然不起作用,但是已经尝试了约束,但它们也没有帮助。
有想法该怎么解决这个吗?
更新:我将约束更改为我更喜欢的东西,因为我使用了“重置为建议的约束”并且创建了一些奇怪的约束。然而,问题仍然存在。
下面是一些涉及视图的代码:
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
我猜该软件将作为自定义 UIView 的类和其中包含所有内容的视图视为两个单独的视图。我希望我在网上找到的有关创建自定义 UIView 的教程包括我们需要设置自动调整大小的蒙版和视图的框架,但是哦,好吧。学过的知识。
推荐阅读
- javascript - NodeJS按时间戳显示文档有延迟
- jestjs - 再添加一个测试文件时,纱线测试挂起
- r - 使用带有多个参数和索引的 lapply/sapply 减少函数内的嵌套循环
- flutter - 一旦应用关闭,Flutter Secure Storage 是否仍然存在?
- azure-cosmosdb - 最优分区分配
- python - 清除控制台的最pythonic方法?
- kotlin - 为什么扩展类有“by”并在函数定义中具体化
- javascript - passport.js passport.authenticate() 总是返回 401 未授权
- apache-flink - 如何对 Flink 事件应用条件?
- java - 使用带有 TLS 的缓存