【问题标题】:Swift: AutoLayout constraints not behaving correctly when device rotates?Swift:当设备旋转时,AutoLayout 约束不能正确运行?
【发布时间】:2023-03-16 03:20:01
【问题描述】:

我正在尝试为“聊天气泡式”视图设置约束。

我的问题是,当设备旋转时,视图没有扩展到设备宽度的 70%。

这是一张展示发生了什么的图片。

当我水平旋转设备时,请注意右侧设备上的蓝色气泡可能会扩大到占用 70% 的空间,而是保持当前的窄宽度:

现在,这是我想要发生的事情的图片。当我旋转设备时,你能看到右边的设备实际上将我的自定义视图扩展到了屏幕的 70% 吗?

我做错了什么?如何实现第二张图片中的行为?

这是我使用 SnapKit DSL 布置自定义视图的代码:

bubble.snp.makeConstraints { (make) in
    make.width.lessThanOrEqualToSuperview().multipliedBy(0.7).priority(.required)
    make.top.right.equalToSuperview().inset(20)            
}   

In case you are curious, here is a link to a GitHub Gist of my custom bubble view.

非常感谢任何帮助!

编辑:我的更新代码:

bubble.snp.makeConstraints { (make) in
    
make.width.lessThanOrEqualToSuperview().multipliedBy(0.7).priority(.required)
    make.width.equalToSuperview().multipliedBy(0.7).priority(.low)
    make.top.right.equalToSuperview().inset(20)
}

【问题讨论】:

  • 您说的是 lessThanOrEqual 并且您得到的小于。你不能抱怨!小于确实小于或等于。如果你的意思是平等,为什么不说平等?你不这么说还有其他原因吗?
  • 我的错,应该澄清一下!如果文字很小,比如“Hello”,我不希望它相等,而是0.7 * lessThanOrEqualToSuperview。但是如果总文本可以超过0.7 * lessThanOrEqualToSuperview,我想把它限制在0.7 * lessThanOrEqualToSuperview。这更有意义吗?

标签: ios swift autolayout snapkit


【解决方案1】:

您需要另一个约束,将宽度 equal 设置为父视图宽度的 0.7 倍,但优先级较低(例如 100)。当存在歧义时,这使布局引擎有更多的目标——不等式总是模棱两可的。

【讨论】:

  • 这太棒了。非常感谢!
  • 我刚刚意识到,当文本包含很少的字符(例如“hello”)时,您的解决方案是否有效?对我来说,当文本字符很少时,右侧似乎有额外的空间(例如,看起来像这样:ibb.co/zZkMtXY),但是当字符数量相当多时,它可以完美地工作(就像你上面的例子一样!)?非常感谢您的宝贵时间!
  • 那你做错了。我将添加屏幕截图,显示我的解决方案适用于长值和短值。
  • 啊,也许是因为我的 UILabelUIView 内,这可能会弄乱内部内容的大小..?您是否知道上述方法是否仍可应用于包含UILabelUIView?根据我的测试,它仅适用于 UILabel,但在 UIView 中使用 UILabel 时会遇到一些问题。感谢您的宝贵时间!
  • 好吧,在所问的问题中没有任何信息。标签应该能够“从内到外”调整即时超级视图的大小,但我不知道你是如何设置的。
猜你喜欢
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-27
  • 1970-01-01
  • 2012-11-24
相关资源
最近更新 更多