ios - 默认今日小部件中的布局约束冲突

标签 ios xcode autolayout today-extension

我在刚刚为我的应用程序创建的 Today Widget 中观察到一个关于自动布局的非常奇怪的行为。 为了找到问题的根源,我最终创建了一个普通的新 Xcode 项目(单 View 应用程序)并添加了一个Today Extension 作为新目标 - 甚至没有触及

当我在我的设备 (iPhone 6s) 上启动 Today Extension 时,首先发生的事情是在控制台中抛出布局约束冲突:

2016-05-03 18:17:22.216 TodayExtension[10183:4611907] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
        (1) look at each constraint and try to figure out which you don't expect; 
        (2) find the code that added the unwanted constraint or constraints and fix it. 
(
    "<_UILayoutSupportConstraint:0x15c665320 V:[_UILayoutGuide:0x15c6657b0(0)]>",
    "<_UILayoutSupportConstraint:0x15c663890 V:|-(0)-[_UILayoutGuide:0x15c6657b0]   (Names: '|':UIView:0x15c6642a0 )>",
    "<_UILayoutSupportConstraint:0x15c666010 V:[_UILayoutGuide:0x15c666380(0)]>",
    "<_UILayoutSupportConstraint:0x15c666ed0 _UILayoutGuide:0x15c666380.bottom == UIView:0x15c6642a0.bottom>",
    "<NSLayoutConstraint:0x15c666b80 V:[_UILayoutGuide:0x15c6657b0]-(NSSpace(8))-[UILabel:0x15c6617c0'Hello World']>",
    "<NSLayoutConstraint:0x15c666bd0 V:[UILabel:0x15c6617c0'Hello World']-(NSSpace(8))-[_UILayoutGuide:0x15c666380]>",
    "<NSLayoutConstraint:0x15c552820 'UIView-Encapsulated-Layout-Height' V:[UIView:0x15c6642a0(0)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x15c666bd0 V:[UILabel:0x15c6617c0'Hello World']-(NSSpace(8))-[_UILayoutGuide:0x15c666380]>

您会注意到列表中的最后一个约束是 UIView-Encapsulated-Layout-Height,它强制 View 的高度为 0。我检查并发现引用的 View 是小部件的 Root View 本身。因此,由于某种超出我理解的原因,系统在内部创建了一个 0 像素高度约束,该约束与 Interface Builder 中的 View 设置冲突。 (当您在 Xcode 中创建一个全新的 today 扩展时,您将看到,除了一个固定到小部件 Root View 每一侧的 UILabel 之外,什么都没有。)

通常我会声称这是一个巨大的 iOS 错误,但由于这是 Apple 用于创建 Today Widgets 的 默认 模板,我无法相信它已损坏。知道是什么导致了这种冲突行为以及如何解决它(正确地)吗?


我基本上想通过赏金实现什么......

... 是找出是否有一种可靠的方法在 Today Widget 中使用自动布局而不引入一些变通方法和“肮脏的黑客 strong>”,你不会在普通应用程序中使用它。 (如果您最终添加了大量创建固定框架的约束并且不让内容动态增长,那不是真正的 Autolayout 理念,对吗?)


密切相关的问题是问题的一部分,可能会给出提示:
Inconsistent Today Widget behavior breaks subview's height constraints

最佳答案

在苹果的部分库存中UIView子类,它们被实例化为零大小。您需要配置您的 NSLayoutConstraint s 以便他们可以正确地对此初始大小使用react。过去,我将顶部或底部约束设为不等式,以便其余约束可以正确调整自身大小而不破坏布局。

例如:将底部约束 ( <NSLayoutConstraint:0x15c666bd0 V:[UILabel:0x15c6617c0'Hello World']-(NSSpace(8))-[_UILayoutGuide:0x15c666380]> ) 设置为 LessThanOrEqualToconstant 8.0 的值.

关于ios - 默认今日小部件中的布局约束冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37009679/

相关文章:

ios - 有没有办法让 UIView 的实例以编程方式从 UIControl 继承?

iphone - 按钮文本未显示且 xcode 崩溃

ios - 无法在模拟器中运行应用程序 : Xcode beta 6 iOS 8

iOS 9 自动布局和 View Controller ;知道如何设置正确的约束

ios - 什么是 NSLayoutConstraint "UIView-Encapsulated-Layout-Height"以及我应该如何强制它干净地重新计算?

ios - 用户当前位置 - Mapkit iOS Objective C

ios - 在 iOS 上使用 NEON 乘法累加

swift - Xcode,没有这样的模块

cocoa - NSImageView:水平适合容器宽度,垂直纵横比

iphone - 从 UILabel 中删除最后一个值?