自动布局 - 将一个 UILabel 的原点替换为另一个

Posted

技术标签:

【中文标题】自动布局 - 将一个 UILabel 的原点替换为另一个【英文标题】:Auto layout - Replace origin of one UILabel with other 【发布时间】:2015-10-06 07:16:41 【问题描述】:

我有两个UILabel。一个UILabel 位于另一个之上。我想要的是,如果顶部没有内容,底部应该取顶部的原点。我必须在屏幕上使用自动布局。我尝试使用sizeToFit,但这不起作用。如果顶部UILabel 没有内容,底部UILabel 仍然停留在其原点。

【问题讨论】:

请设置约束条件并尝试 【参考方案1】:

设置高度约束将不起作用。第二个标签的 y 位置不会得到正确的 Y 轴值(它会向上移动)。我通过在两个结果之间使用vertical spacing constraint 解决您的问题

说明:- 为标签加上垂直间距约束设置正常的基本约束。当上部标签没有文字时,更新垂直间距约束如下:-

verticalSpacingConstraintBetweenLabels.constant = -(KIntialVerticalSpacing + (KHeightOfLabel-KIntialVerticalSpacing));

我为你创建了一个sample project源代码可在:- https://www.dropbox.com/s/eq9hinnw4sdfltq/LabelSpacing.zip?dl=0

【讨论】:

【参考方案2】:

该要求的一种替代方法是将 IBOutlet 设置为上部标签的高度,并在您不想显示时将其设置为 0。但请记住,您必须设置上下标签之间的垂直间距。较低的标签不应该有超级视图的上边距。

【讨论】:

【参考方案3】:

首先将两个顶部约束拖到 UIViewController。 第二次粘贴这段代码:

-(void) loadLabels
    _firstLabel.text=@"";
    NSInteger heidFirstLabel = 20;
    if(_firstLabel.text.length == 0)
        _constrainTopFirstLabel.constant = 0 - heidFirstLabel;
        _firstLabel.hidden = YES;
    else
        _constrainTopFirstLabel.constant = 8 ;
    

我总是用这个。

【讨论】:

【参考方案4】:

ios9 中,苹果引入了一个新类 UIStackView 来解决我们开发人员面临的这个问题和其他问题,使用自动布局。如果你的目标是 iOS 9 及更高版本,你应该使用这个类。

如果您的目标是 iOS 9 之前的版本,其中一种可能是使用固有内容大小。

1.子类UILabel

2.添加一个属性来判断这个标签是否折叠

@property (nonatomic,assign) BOOL isLabelCollapsed;

3.重写其方法intrinsicContentSize

- (CGSize)intrinsicContentSize 
    if(self.isLabelCollapsed)
        return CGSizeMake(0, 0);
    else
        return [super intrinsicContentSize];

4.将可折叠标签类设置为自定义类。

5. 需要时,将您的 isLabelCollapsed 属性设置为 YES 并在可折叠标签上调用 invalidateIntrinsicContentSize

【讨论】:

以上是关于自动布局 - 将一个 UILabel 的原点替换为另一个的主要内容,如果未能解决你的问题,请参考以下文章

自动布局动画保持 UILabel 居中

如何使用自动布局将 UILabel 设置为 UICell 宽度的百分比

如何将 UILabel 限制为 25 个字符并在超过使用自动布局时显示点

如何使用自动布局约束为移动 UILabel 设置动画?

我想将自动布局应用于 UILabel,例如灵活的高度和宽度

UILabel 自动布局适合