Ios 基于“intrinsicContentSize”的自动布局纵横比(非常量)
是否可以使用基于Ios 基于“intrinsicContentSize”的自动布局纵横比(非常量),ios,objective-c,macos,autolayout,Ios,Objective C,Macos,Autolayout,是否可以使用基于intrinsicContentSize动态计算的纵横比应用此类自动布局约束? 在文档中,我只找到了具有固定比率值的约束 在我的用例中,实际with和height fromintrinsicContentSize并不重要,我希望保留动态变化的视图的高度和宽度比 我应该提供自己的约束实现吗?或者有更好的方法吗?您可以找到关于如何设置基于比率的约束的答案。您只需将宽度和高度约束在一起,保持给定的纵横比(在这种情况下为4/3) 我们可以争论是否知道这些信息是件好事,或者他们的父母是否应
intrinsicContentSize
动态计算的纵横比应用此类自动布局约束?
在文档中,我只找到了具有固定比率值的约束
在我的用例中,实际with和height fromintrinsicContentSize
并不重要,我希望保留动态变化的视图的高度和宽度比
我应该提供自己的约束实现吗?或者有更好的方法吗?您可以找到关于如何设置基于比率的约束的答案。您只需将宽度和高度约束在一起,保持给定的纵横比(在这种情况下为4/3) 我们可以争论是否知道这些信息是件好事,或者他们的父母是否应该设置这样的限制。我通常更喜欢家长设置约束,但是如果没有此约束,您的视图没有任何意义,或者所有这些视图都需要此约束,那么您可以安全地让这些视图管理它们自己的宽高比 最后,
intrinsicContentSize
告诉Auto Layout视图单独时的大小:
返回接收视图的自然大小,仅考虑视图本身的属性
我不知道您的视图代表什么,但正如文档所述,您可以返回CGSizeMake(uiviewnointrisicmetric,uiviewnointrisicmetric)
:
如果自定义视图没有给定维度的内部大小,则可以返回该维度的UIViewNoInEntrisicMetric
intrinsicContentSize
不能作为约束的输入。(从逻辑上讲,存在实现intrinsicContentSize
和相关内容拥抱和抗压缩优先级的约束,但这是不同的。)
如果您想要这样的纵横比约束,您必须自己添加它。在给定时刻查询intrinsicContentSize
非常简单,验证它是否为两个维度提供了真实值(而不是NSViewNoInstrinsicMetric
),计算纵横比,然后将其用作将项目宽度与其高度关联的约束中的乘数
最困难的部分是知道
intrinsicContentSize
何时失效,这样您就可以删除旧的纵横比约束并添加新的约束。您可以通过覆盖-invalidateIntrinsicContentSize
作为视图的子类来实现这一点。(一定要调用super!)但是,我不知道从控制器或superview执行此操作的方法。如果需要在运行时计算约束值,最好的选择是按住CTRL键并将约束拖动到控制器的.h
文件中,然后为其创建一个IBOutlet。这允许您更改代码中约束的值。甚至可以为约束值的更改设置动画
然后,在设置时的代码中,或在发生可能更改所需值的操作时(例如加载新图像),计算所需的约束值并在代码中设置其值。通常,您可以使用以下方法执行此操作:
self.myConstraintIBOutlet.constant = <insert your new value>;
如果希望平滑过渡,可以将layoutifneedd
放置在动画块内,使其为约束的更改设置动画:
[self.view setNeedsLayout];
[UIView animateWithDuration:.25 animations:^{
[self.view layoutIfNeeded];
} completion:^(BOOL finished) {
// Completion code
}];
这一部分对我来说是显而易见的。但是我在哪里连接这个代码呢?当
self.myConstraintIBOutlet.constant=self.someView.intrinsicContentSize.height/self.someView.intrinsicContentSize.width应该调用code>。它应该在所有视图布局更新之前。如果它只在第一次显示时出现,视图将出现
将是一个起点,因为此时视图具有其大小。如果您稍后将其保留在viewdide
中,您将看到布局更改,这可能看起来像是一个小故障。如果您需要在更改文本或按钮标签等内容后进行更改,请在更改影响您在其中更改内容的视图后进行更改。这可能需要您进行更改,强制更改视图上的布局,然后更改约束现在更新的宽度/高度已知,然后重新进行布局。对于纵横比约束,纵横比值不在约束的常量中,而是在乘数中。在创建约束后,您不能更改它的乘数。@KenThomases是的,这是正确的。选项是每次使用新约束替换约束,或者基于计算的纵横比设置高度和宽度(假设已知宽度/高度之一)。需要知道确切的用例。对于替换,IBOutlet可用于识别原始设备,然后从那时起使用替换设备。这样,故事板将保持快乐,而不会添加任何自动约束。
[self.view setNeedsLayout];
[UIView animateWithDuration:.25 animations:^{
[self.view layoutIfNeeded];
} completion:^(BOOL finished) {
// Completion code
}];