当前位置: 首页 > 知识库问答 >
问题:

如何在运行时更改标签约束?

微生耘豪
2023-03-14

我有一个表格视图,里面有一个单元格。单元格包含三个标签:标题标签和下面两个相互对应的标签。有时,如果这两个标签不包含数据,我需要隐藏下面这两个标签,并将“标题标签”的“顶部空间到容器”更改为“中心Y到容器”。当然,当两个标签包含数据时,还会恢复约束。这是一个简单演示项目的截图,只是为了展示这个想法:

更新马克斯·麦克劳德的回答指向了正确的方向。技巧是在第一个和第二个标签隐藏时向下推标题标签。所以,我们需要为第一个和第二个标签设置容器视图的底部空间,而不是为标题标签创建容器视图的顶部空间。隐藏/取消隐藏应该通过具有高度出口(第一个和第二个标签的高度约束)并将其常量值设置为零(取消隐藏时设置回值)来完成。我还将源代码示例上传到Github。

共有3个答案

阙辰龙
2023-03-14

我自己也在做类似的事情。所以给两个标签都添加一个宽度约束。在应用约束时,您可以更改常量值——只需保留对它的引用。在我的例子中,我有一个数组,我把我打算改变的约束放入其中。

如果要隐藏标签,请将c值更改为0-也可以在动画块中执行此操作。要显示,请更改值。

您还可以使顶部空间的宽度等于底部空间的宽度,这样当视图隐藏或显示时,您可以将“一组”项目居中。

请注意,您也可以添加或删除约束,但是iOS处理这些约束的成本更高。

许鸿志
2023-03-14

将要隐藏的标签放入视图中,一旦所有内容都具有正确的布局约束,就向容器视图添加高度约束,然后将约束连接到 IBOutlet 属性中。

确保您的房产坚固

代码中,您只需将常量设置为0并激活它,然后隐藏内容,或者停用它以显示内容。这比弄乱常量值并保存恢复它要好。之后不要忘记调用layoutIfNeeded

@property (strong, nonatomic) IBOutlet UIView *myContainer;
@property (strong, nonatomic) IBOutlet NSLayoutConstraint *myContainerHeight; //should be strong!!
-(void) showContainer
{
    self.myContainerHeight.active = NO;
    self.myContainer.hidden = NO;
    [self.view layoutIfNeeded];
}
-(void) hideContainer
{
    self.myContainerHeight.active = YES;
    self.myContainerHeight.constant = 0.0f;
    self.myContainer.hidden = YES;
    [self.view layoutIfNeeded];
}

完成设置后,您可以在 IntefaceBuilder 中对其进行测试,方法是将约束设置为 0,然后返回到原始值。不要忘记检查其他约束优先级,以便在隐藏时根本没有冲突。测试它的另一种方法是将其设置为0并将优先级设置为0,但是,您不应忘记再次将其还原为最高优先级。

海新霁
2023-03-14

选择标题标签和其中一个较低的标签,然后添加一个新的垂直空间约束,以反映它们之间的间隙。接下来,删除标题标签“Top space to container”约束。也许你已经有了这个(从屏幕抓图上看不太清楚)。如果你这样做,那很好。

现在,为每个较低的标签创建两个高度约束。将这些内容放到您的班级。

然后,通过将每个高度约束的常量设置为0.f,可以在需要时隐藏这两个较低的标签。

这将使它们不可见,并降低上面的标题标签,使其在容器中垂直居中。

我将再次介绍这些步骤(太长了,不便评论!).顺序与IB有关,因为在删除旧约束之前,必须先添加一个新约束。暂时你会有一个多余的约束。是因为IB不允许有歧义。因此,首先添加新的垂直空间约束。这将html" target="_blank">定义上部标签的Y位置。然后,从上部标签中删除多余的容器垂直间距约束。现在,该标签将使用相对于较低标签的垂直间距进行Y定位。接下来,为每个较低的标签添加高度约束,并使用IBOutlet链接到该类。另一件事,实际上你需要把下面的标签限制在容器的底部空间。当它们的高度降低到零时,它们将消失,并且上面的标签将移动到更低的位置,以呈现Y中心位置。

要恢复,只需将< code >常量设置回初始值。

这是一个比添加/删除约束好得多的方法,添加/删除约束是一个重量级的操作。请注意,您可能希望将两个较低的标签添加到“容器”视图中,以便它们可以作为一个标签显示/隐藏。此外,它会整理代码,因为你真的希望垂直空间在你的上部标签和两个下部标签之间,而不是一个。

另请参阅我的答案 使用隐藏的UI视图自动布局?

 类似资料:
  • 我已经使用SLF4j作为日志框架,由log4j支持。我的问题是,我正在寻找一种在运行时更改记录器日志记录级别的方法。 我知道slf4j不允许通过自己的API直接进行此操作,因此,我必须直接访问日志提供程序。就个人而言,我发现这是slf4j中的一个巨大缺陷。所以现在我的问题是,如何通过slf4j以编程方式确定我使用的是哪种提供者?使用slf4j的最大目的是让您变得与提供商无关-您可以轻松地在您喜欢的

  • 如何在运行时更改application.yaml的值?例如,我有一个服务器地址属性,希望在运行时更改

  • 问题内容: 我有一个Android应用程序,当用户点击时,我想应用定义的样式。 我以为找到一个,但它不存在。我试过了 但它不起作用。 问题答案: 我通过创建一个新的XML文件来做到这一点,如下所示: 我的文件中也有一个条目,如下所示: 然后,在我的代码中,我创建了一个来捕获该上的tap事件: 编辑: 自API 23起,不建议使用 要改回它,你可以使用以下命令:

  • 问题内容: 我需要以固定的间隔运行批处理作业,并且能够在运行时更改此批处理作业的时间。为此,我遇到了Spring框架下提供的@Scheduled注释。但是我不确定如何在运行时更改fixedDelay的值。我进行了一些谷歌搜索,但没有发现任何有用的信息。 问题答案: 在spring启动中,你可以直接使用应用程序属性! 例如: 请注意,如果未定义属性,你还可以具有默认值,例如,默认值为“ 60”(秒)

  • 问题内容: 作为Java开发人员,我经常需要在接口的不同实现之间进行选择。有时, 一次 只能进行 一次 选择,而另一些时候,我需要不同的实现来响应程序收到的不同输入。换句话说,我需要能够在运行时 更改 实现。这可以通过一个帮助器对象轻松实现,该对象将一些键(基于用户输入)转换为对适当接口实现的引用。 使用Spring,我可以将这样的对象设计为Bean,然后将其注入到需要的地方: 现在,我应该如何实