【问题标题】:View frames don't respect constraints at runtime视图框架在运行时不遵守约束
【发布时间】:2015-06-11 02:47:22
【问题描述】:

我有一个UITableViewCell,上面有三个标签。两个在顶部,一个在底部包含一些内容。我约束两个顶部标签,使它们距离视图顶部 8 点。左标签距前沿 8pts,右标签距后沿 8pts。然后我将左标签设置为距右标签最小 12pts。

标题限制

日期限制

当我评估它时,它在 Xcode 中看起来不错。我可以添加一个很长的标题(最左边的标签),它会正确截断文本,给我的日期标签留出 12pt 的边距。

当我在运行时运行应用程序时,似乎没有应用约束。标题标签是设备的全宽,日期标签看不到。

它在 iPhone 5、5s、6 和 6 Plus 模拟器上执行此操作。我究竟做错了什么?在我的viewDidLoad() 方法中,我正在加载包含UITableViewCell 的笔尖,然后注册它。我还向UINavigationController 添加了一个按钮。

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view, typically from a nib.
    self.navigationItem.leftBarButtonItem = self.editButtonItem()
    if let split = self.splitViewController {
        let controllers = split.viewControllers
        self.detailViewController = controllers[controllers.count-1].topViewController as? DetailViewController
    }

    // Register our additional nibs
    let nibName = UINib(nibName: "StandardNoteCell", bundle: nil)
    tableView.registerNib(nibName, forCellReuseIdentifier: identifier)

    self.newNoteButton = self.createNewRoundButton()
    self.navigationController?.view.addSubview(self.newNoteButton)
}

有什么不正确的地方吗?

【问题讨论】:

  • 我觉得不太好 - 看看那些红色和橙色的轮廓。他们告诉你你的约束有问题。您的任何一个项目都没有宽度限制 - 您至少需要一个
  • 我怎么知道这些问题是什么?我在 Xcode 中做了一个更新帧和更新约束,这似乎没有任何区别
  • 如果您查看故事板导航器,您会在场景名称旁边看到一个红色箭头 - 单击此处查看问题

标签: ios swift uitableview autolayout


【解决方案1】:

问题是您有两个文本标签,其中包含关于如何解决它们不能完全适合可用水平空间的情况的模棱两可的信息。

要解决此问题,请将日期标签的抗压性设置为“1000(必需)”。这样,无论如何日期都将始终可见,而其他视图(在本例中为标题标签)将通过缩小来解决此问题。

作为一个实验,尝试将两个标签的抗压性设置为 1000。这将无法实现,并且您会在控制台中看到错误。因此,请谨慎使用所需的约束 - 您希望约束尽可能灵活。

【讨论】:

  • 谢谢,我认为在这种情况下,视图中唯一需要的约束是日期。由于标题设置为 1 行,我不应该对它下面的内容有这个问题。
  • 是否有任何理由将日期压缩阻力设置为 1000,而不是将标题压缩设置为小于日期?这似乎有效,很好奇为什么首选 1,000。
  • @JohnathonSullinger 无论是在技术层面上都很好。就个人而言,当我可以假设某些事情已经给出时,我发现更容易在我的脑海中找出约束。
  • @JohnathonSullinger 它不必是 1,000 它只是必须大于其他值,但是苹果建议开发人员使用这些值
  • 谢谢大家,我会坚持在日期标签上写上 1,000。
【解决方案2】:

XCode 不知道 UILabel 的大小,你可以看到你的约束在横轴上都是红色的。 您的问题有两种解决方案

  1. 设置标签的宽度
  2. 设置标签的拥抱/压缩

如果您设置宽度,标签将不会根据屏幕大小调整大小。 如果您设置拥抱,它将根据每个 UITextField 的优先级扩展/收缩

内容拥抱:不想成长

内容压缩阻力:不想缩小

【讨论】:

  • 谢谢,我正在研究如何拥抱。我是 Auto-layout 的新手,上次我做 iOS 开发是 obj-c & iOS 4
  • 在谷歌搜索并找到a stackoverflow post 压缩与拥抱后,我能够解决我的问题,即降低Title 标签上的压缩。
  • 这个答案包含一些不正确的信息。 UILabel 有一个intrinsicContentSize。除非您想覆盖默认值,否则不需要设置大小约束。
  • 标签上的固有尺寸设置为默认值。应该改变吗?
  • 如果您希望显示所有文本,则内在内容大小是您想要的。 (您可以设置最大高度限制,例如,如果您希望文本截断,否则会占用太多空间。)
【解决方案3】:

只是一个疯狂的猜测,但您的日期标签实际上是否设置了任何文本?因为如果不是,它可以解释你观察到的行为。

【讨论】:

  • 它有文本,目前我正在硬编码一个字符串来测试它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-21
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多