【问题标题】:Xcode 8 - Some Views & VCs Not Showing Up on SimulatorXcode 8 - 一些视图和 VC 没有出现在模拟器上
【发布时间】:2016-08-18 16:55:53
【问题描述】:

在更新到 Xcode 8 Beta 6 和 Swift 3 之前,该应用程序运行良好。我没有进行任何其他更改,但现在有两个问题。

首先,一些随机视图不再显示。它们只是方形的彩色盒子。但它们上方的视图会显示出来。

在界面生成器中:

在模拟器上:

其次,我的模型 VC 在 segued 时不再出现。以前是这样,我可以看到正在调用 segue,但现在它不存在。

如果有人能提供关于这两个问题的想法,我们将不胜感激。

【问题讨论】:

  • 我会重新排列任何与上面的框重叠的东西,然后再回到它们后面。 Xcode 中有一个烦人的错误,即情节提要中的项目排列不是模拟器看到的顺序。不过,手动来回拖动可以修复它。
  • @Sethmr 谢谢,我试过了,但无济于事。但是我不确定约束是否正常,因为我可以看到它们在预览助手中工作。我也试过两次重启 Xcode。
  • 确保您的约束正确安装在它们所在的任何上下文中。如果滚动到属性检查器的底部,您将看到一个复选框,其中包含已安装和任何可能类型的上下文的缩写它们将被布置在其中。确保选中该框以查找未显示自身的对象,然后对附加到它们的每个约束执行相同操作。
  • @Sethmr 如果我刚刚注释掉了我的 roundView 函数并且突然视图可见,有什么想法吗? roundView 函数只有两行: viewToRound.layer.cornerRadius = (viewToRound.frame.width/2) viewToRound.clipsToBounds = true
  • 我知道使用 viewToRound.layer.cornerRadius = (viewToRound.frame.width/2) 如果在 viewDidAppear 完成之前或在 awakeFromNib() 之前实施,将通过cornerRadius的不正确值,具体取决于您如何启动视图。它将基于故事板值的宽度,因此除非您的宽度为恒定值,否则通常是错误的。 clipsToBounds 我不能 100% 确定它所做的一切,但这肯定会产生一些效果,比如让某些东西消失。我找到了使用它的理由,但如果它做我喜欢的事情,它总是一个试验和错误,而且似乎

标签: ios swift xcode xcode8-beta6


【解决方案1】:

所以在 Xcode 7/Swift 2 --> Xcode 8/Swift 3 之间,发生了一些变化,如何将 UIView 变成圆形。这是我现在的代码:

func roundView (_ viewToRound: UIView) {
    viewToRound.layer.cornerRadius = 20
    //viewToRound.layer.cornerRadius = (viewToRound.frame.width/2)
    viewToRound.clipsToBounds = true
}

如您所见,我已将cornerRadius 方法替换为显式“20”,而不是从视图大小推断。在我之前的“frame.width”中,视图根本就没有出现。现在他们恢复了正常。我不知道发生了什么变化,但这肯定解决了它。

【讨论】:

  • Apple 从未停止过让我惊叹他们如何让开发人员在每次更新时都过着地狱般的生活。
  • 这实际上是因为在 viewDidLoad 和 viewWillAppear 方法中,视图的帧总是 {0, 0, 1000, 1000} 在此处阅读更多信息stackoverflow.com/questions/39578530/…
【解决方案2】:

自动布局约束可能发生了一些问题。仔细检查这些设置是否正确。

另外,您不需要使用模拟器来验证这一点;使用助理编辑器的预览视图:

作为健全性检查,我要做的第一件事是将视图中的所有元素重置为建议的约束,看看是否能解决问题。

【讨论】:

  • 这并没有解决问题,但它有所帮助。我还没有在预览助手中检查它。在预览助手中看起来不错。我尝试遵循@Sethmr 评论中的建议,但没有这样做。
【解决方案3】:

这绝对是 Xcode 8 中的 AutoLayout 问题。不使用 AutoLayout 不存在该问题。我使用协议解决了这个问题:

protocol Roundable {}

extension Roundable where Self: UIView{

    func roundCorners(){

        self.layer.cornerRadius = self.bounds.height / 2
    }
}

class CustomView: UIView, Roundable {

    override var bounds: CGRect {

        didSet{
            roundCorners()
        }
    }
}

使视图涉及一个 CustomView,它将显示为四舍五入。我在这里使用了一个协议,因为通过这种方式可以很容易地扩展已经存在的 UIView 子类,使其具有圆角的功能。当然也可以直接在bounds属性观察者中设置cornerRadius。

【讨论】:

    【解决方案4】:

    iOS 10 UIView 生命周期和自动布局存在问题。

    我的意思是,在 viewDidLoad 和 viewWillAppear 等方法中,所有 UI 元素上的框架都是`{{0,0},{1000,1000}}。

    在某些情况下,例如设置圆角会产生 500 像素的圆角,并且您会得到不可见的 UI 组件:)

    解决此问题的方法是在UIViewControllers 或layoutSubviews 子类中设置viewDidLayoutSubview 中的圆角或layoutSubviews。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-14
      • 1970-01-01
      • 2019-06-17
      • 2018-11-09
      • 2015-08-21
      • 1970-01-01
      相关资源
      最近更新 更多