Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 基于“intrinsicContentSize”的自动布局纵横比(非常量)_Ios_Objective C_Macos_Autolayout - Fatal编程技术网

Ios 基于“intrinsicContentSize”的自动布局纵横比(非常量)

Ios 基于“intrinsicContentSize”的自动布局纵横比(非常量),ios,objective-c,macos,autolayout,Ios,Objective C,Macos,Autolayout,是否可以使用基于intrinsicContentSize动态计算的纵横比应用此类自动布局约束? 在文档中,我只找到了具有固定比率值的约束 在我的用例中,实际with和height fromintrinsicContentSize并不重要,我希望保留动态变化的视图的高度和宽度比 我应该提供自己的约束实现吗?或者有更好的方法吗?您可以找到关于如何设置基于比率的约束的答案。您只需将宽度和高度约束在一起,保持给定的纵横比(在这种情况下为4/3) 我们可以争论是否知道这些信息是件好事,或者他们的父母是否应

是否可以使用基于
intrinsicContentSize
动态计算的纵横比应用此类自动布局约束? 在文档中,我只找到了具有固定比率值的约束

在我的用例中,实际with和height from
intrinsicContentSize
并不重要,我希望保留动态变化的视图的高度和宽度比


我应该提供自己的约束实现吗?或者有更好的方法吗?

您可以找到关于如何设置基于比率的约束的答案。您只需将宽度和高度约束在一起,保持给定的纵横比(在这种情况下为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。它应该在所有视图布局更新之前。如果它只在第一次显示时出现,
视图将出现
将是一个起点,因为此时视图具有其大小。如果您稍后将其保留在
viewdide
中,您将看到布局更改,这可能看起来像是一个小故障。如果您需要在更改文本或按钮标签等内容后进行更改,请在更改影响您在其中更改内容的视图后进行更改。这可能需要您进行更改,强制更改视图上的布局,然后更改约束现在更新的宽度/高度已知,然后重新进行布局。对于纵横比约束,纵横比值不在约束的
常量中,而是在
乘数中。在创建约束后,您不能更改它的
乘数
。@KenThomases是的,这是正确的。选项是每次使用新约束替换约束,或者基于计算的纵横比设置高度和宽度(假设已知宽度/高度之一)。需要知道确切的用例。对于替换,IBOutlet可用于识别原始设备,然后从那时起使用替换设备。这样,故事板将保持快乐,而不会添加任何自动约束。
[self.view setNeedsLayout];
[UIView animateWithDuration:.25 animations:^{
            [self.view layoutIfNeeded];
        } completion:^(BOOL finished) {
            // Completion code
        }];